In [1]:
# Importamos la librería pandas y le ponemos el alias pd
import pandas as pd
import matplotlib

# Leemos el archivo CSV con los datos a analizar
content_file = pd.read_csv('full-list-covid-19-tests-per-day.csv')

# Si ponemos las variables o procesos en linea al final del bloque
# del jupyter notebook nos imprimirá en pantalla el resultado
content_file
Out[1]:
Entity Code Date New tests
0 Argentina ARG Apr 9, 2020 1520
1 Argentina ARG Apr 10, 2020 1529
2 Argentina ARG Apr 11, 2020 1648
3 Argentina ARG Apr 14, 2020 3047
4 Argentina ARG Apr 15, 2020 1569
... ... ... ... ...
5661 Zimbabwe ZWE May 30, 2020 666
5662 Zimbabwe ZWE May 31, 2020 546
5663 Zimbabwe ZWE Jun 1, 2020 637
5664 Zimbabwe ZWE Jun 2, 2020 581
5665 Zimbabwe ZWE Jun 3, 2020 722

5666 rows × 4 columns

In [2]:
#Importamos la clase datetime
from datetime import datetime, timedelta
#Convertimos la columna Date a tipo datetime, para que la podamos manipular.
content_file['Date'] = content_file['Date'].apply( lambda x: datetime.strptime( x, '%b %d, %Y' ) )
#Mostramos los países que se incluyen en los datos
content_file#['Entity'].unique()
Out[2]:
Entity Code Date New tests
0 Argentina ARG 2020-04-09 1520
1 Argentina ARG 2020-04-10 1529
2 Argentina ARG 2020-04-11 1648
3 Argentina ARG 2020-04-14 3047
4 Argentina ARG 2020-04-15 1569
... ... ... ... ...
5661 Zimbabwe ZWE 2020-05-30 666
5662 Zimbabwe ZWE 2020-05-31 546
5663 Zimbabwe ZWE 2020-06-01 637
5664 Zimbabwe ZWE 2020-06-02 581
5665 Zimbabwe ZWE 2020-06-03 722

5666 rows × 4 columns

In [3]:
#Para hacer una copia y no modificar el dataframe original
from copy import copy
# Para que las gráficas se vean coquetas xP
import seaborn as sns
sns.set()

#Clonamos content_file
aux = copy(content_file)

#Obtenemos la fecha inicial del análisis
current_day = datetime.today()
start_date = datetime.today()-timedelta( days=17 )

#Filtramos los datos 
filtered = aux.loc[ aux['Date'] >= start_date  ]
filtered
#start_month
Out[3]:
Entity Code Date New tests
38 Argentina ARG 2020-05-23 4615
39 Argentina ARG 2020-05-24 3525
40 Argentina ARG 2020-05-27 3556
41 Argentina ARG 2020-05-28 4863
42 Argentina ARG 2020-05-29 5405
... ... ... ... ...
5661 Zimbabwe ZWE 2020-05-30 666
5662 Zimbabwe ZWE 2020-05-31 546
5663 Zimbabwe ZWE 2020-06-01 637
5664 Zimbabwe ZWE 2020-06-02 581
5665 Zimbabwe ZWE 2020-06-03 722

910 rows × 4 columns

In [4]:
# Hacemos que la columna Entity sea un índice
f_2 = filtered.set_index('Entity')
# Volvemos a filtrar, pero ahora los países potencia junto con México
power_countries = f_2.loc[ ['Mexico', 'United States' , 'United Kingdom', 'Russia', 'South Korea'] ]

#Creamos una Pivot table que sume todas las pruebas de cada país
table = pd.pivot_table(
    power_countries,
    values = 'New tests',
    index = ['Entity'],
    aggfunc=sum,
    fill_value=0
).sort_values(by='New tests', ascending=True)

#Cambiamos el nombre de la columna New test a Pruebas
table = table.rename(columns={ 'New tests':'Pruebas' })
table
Out[4]:
Pruebas
Entity
Mexico 55661
South Korea 188542
United Kingdom 830776
United States 3833955
Russia 3927037
In [5]:
#Obtenemos los datos de la pivot table y los graficamos
axes = table.plot(kind='bar', rot=15)
#Leyendas en los ejes
axes.set_ylabel('Número de pruebas realizadas')
axes.set_xlabel('Países')
#Cambiamos escala en Y
axes.set_ylim(0,7000000)

fig = axes.get_figure()
#Cambiamos tamaño de gráfica
fig.set_size_inches(14, 7)

for bar in axes.patches:
    axes.annotate( "{:,}".format( bar.get_height() ), (bar.get_x() * 1.005, bar.get_height() * 1.005))
    
fig.savefig('example.png', bbox_inches='tight')
matplotlib.pyplot.close(fig)
In [6]:
#Repetimos el proceso pero ahora para latinoamérica
latin_america_countries = ['Argentina', 'Bolivia', 'Chile', 'Colombia', 'Costa Rica', 'Cuba', 'El Salvador', 'Mexico', 'Panama','Paraguay',
 'Peru']
#Países latinoamericanos con cifras significativas
latin_america_countries_2 = ['Argentina', 'Bolivia', 'Chile', 'Colombia', 'Costa Rica', 'El Salvador', 'Mexico', 'Peru']

#Clonamos el dataframe f_2
latin_america = copy(f_2)

#Filtramos y colocamos únicamente los países de interés.
latin_america = latin_america.loc[ latin_america_countries ]
latin_america_2 = copy(f_2).loc[ latin_america_countries_2 ]

#Creamos una pivot table sumando las pruebas realizadas por país.
pt_f3 = pd.pivot_table(
    latin_america, 
    values = 'New tests',
    index = ['Entity'],
    aggfunc=sum,
    fill_value=0
).sort_values(by='New tests', ascending=True)

#Cambiamos el nombre a la columna New tests
pt_f3 = pt_f3.rename(columns={ 'New tests':'Pruebas' })
pt_f3
Out[6]:
Pruebas
Entity
Costa Rica 4794
Paraguay 11372
Bolivia 13850
Panama 17172
Cuba 21835
El Salvador 28953
Argentina 36893
Peru 39075
Mexico 55661
Colombia 138644
Chile 204365
In [7]:
#Obtenemos el objeto de la gráfica de barras y establecemos que las
# leyendas estén rotadas 15 grados.
ax = pt_f3.plot(kind='bar', rot=15)

#Cambiamos el límite de la escala en Y.
ax.set_ylim(0,300000)
#Asignamos etiquetas por eje
ax.set_ylabel('Número de pruebas realizadas')
ax.set_xlabel('Países latinoamericanos')

#Se obtiene la figura resultante de la gráfica
fig = ax.get_figure()
#Se asigna tamaño a la gráfica
fig.set_size_inches(15, 7)

#Se formatean las leyendas en el gráfico.
for p in ax.patches:
    ax.annotate( "{:,}".format( p.get_height() ), (p.get_x() * 1.005, p.get_height() * 1.005))
    
#Se guarda la figura en una imagen.
fig.savefig('pruebas_por_pais.png', bbox_inches='tight')
In [8]:
#Creamos una pivot table más para graficar
# el performance diario por país
pv_tx = pd.pivot_table(
    latin_america_2, 
    values = 'New tests',
    index = ['Date'],
    columns = ['Entity'],
    aggfunc=sum
)
pv_tx
Out[8]:
Entity Argentina Bolivia Chile Colombia Costa Rica El Salvador Mexico Peru
Date
2020-05-23 4615.0 1109.0 15239.0 7171.0 235.0 2391.0 3755.0 10396.0
2020-05-24 3525.0 789.0 14426.0 9623.0 410.0 2530.0 3113.0 NaN
2020-05-25 NaN 779.0 16283.0 8070.0 157.0 2336.0 7999.0 NaN
2020-05-26 NaN 866.0 13084.0 10306.0 125.0 2229.0 7407.0 1342.0
2020-05-27 3556.0 1426.0 13398.0 12366.0 649.0 2532.0 7666.0 2563.0
2020-05-28 4863.0 1125.0 15650.0 12130.0 374.0 2407.0 6717.0 3603.0
2020-05-29 5405.0 775.0 16333.0 10797.0 540.0 2322.0 6480.0 2788.0
2020-05-30 NaN 1274.0 16814.0 13368.0 467.0 2386.0 2990.0 3718.0
2020-05-31 NaN 718.0 19120.0 12038.0 515.0 2479.0 1852.0 3042.0
2020-06-01 4014.0 1083.0 16750.0 9325.0 267.0 2435.0 4697.0 3562.0
2020-06-02 NaN 1146.0 13582.0 9071.0 264.0 2375.0 2459.0 1458.0
2020-06-03 NaN 1300.0 15546.0 12219.0 415.0 2531.0 526.0 6603.0
2020-06-04 5501.0 1460.0 18140.0 12160.0 376.0 NaN NaN NaN
2020-06-05 5414.0 NaN NaN NaN NaN NaN NaN NaN
In [9]:
#Obtenemos los ejes de la gráfica de líneas
tx = pv_tx.plot(marker='o', linestyle='-')

#Asignamos etiquetas por eje
tx.set_ylabel('Pruebas realizadas diariamente')
tx.set_xlabel('Últimos 15 días [23 de Mayo al 06 de Junio] ')

#Obtenemos la figura de la gráfica y cambiamos sus dimensiones
fig = tx.get_figure()
fig.set_size_inches(15, 6)

#Guardamos la figura del gráfico en una imagen
fig.savefig('performance_diario_pruebas_paises.png', bbox_inches='tight')
In [10]:
#Importamos estilos útiles para los gráficos
import seaborn as sns

#Hacemos otra pivot table parecida a la anterior,
# sólo que esta las columnas serán las fechas. Esto para poder
# leer las fechas de izq. a der. en el heatmap
pv_tx_2 = pd.pivot_table(
    latin_america_2, 
    values = 'New tests',
    columns = ['Date'],
    index = ['Entity'],
    aggfunc=sum
)
pv_tx_2=pv_tx_2.sort_values(by='Entity', ascending=False)
pv_tx_2
Out[10]:
Date 2020-05-23 2020-05-24 2020-05-25 2020-05-26 2020-05-27 2020-05-28 2020-05-29 2020-05-30 2020-05-31 2020-06-01 2020-06-02 2020-06-03 2020-06-04 2020-06-05
Entity
Peru 10396.0 NaN NaN 1342.0 2563.0 3603.0 2788.0 3718.0 3042.0 3562.0 1458.0 6603.0 NaN NaN
Mexico 3755.0 3113.0 7999.0 7407.0 7666.0 6717.0 6480.0 2990.0 1852.0 4697.0 2459.0 526.0 NaN NaN
El Salvador 2391.0 2530.0 2336.0 2229.0 2532.0 2407.0 2322.0 2386.0 2479.0 2435.0 2375.0 2531.0 NaN NaN
Costa Rica 235.0 410.0 157.0 125.0 649.0 374.0 540.0 467.0 515.0 267.0 264.0 415.0 376.0 NaN
Colombia 7171.0 9623.0 8070.0 10306.0 12366.0 12130.0 10797.0 13368.0 12038.0 9325.0 9071.0 12219.0 12160.0 NaN
Chile 15239.0 14426.0 16283.0 13084.0 13398.0 15650.0 16333.0 16814.0 19120.0 16750.0 13582.0 15546.0 18140.0 NaN
Bolivia 1109.0 789.0 779.0 866.0 1426.0 1125.0 775.0 1274.0 718.0 1083.0 1146.0 1300.0 1460.0 NaN
Argentina 4615.0 3525.0 NaN NaN 3556.0 4863.0 5405.0 NaN NaN 4014.0 NaN NaN 5501.0 5414.0
In [11]:
import matplotlib.pyplot as plt

#Obtenemos los objetos de la gráfica a generar y seteamos tamaño
fig, ax = plt.subplots(figsize=(16,8))

#Generamos el heatmap con la paleta de colores "navy" con una escala de 9 tonalidades,
# se muestra el número completo y se establecen valores mínimos y máximos en la escala
# de colores.
sns.heatmap(pv_tx_2,annot=True,linewidths=.5, cmap=sns.light_palette("navy", 9), ax=ax, fmt='g', vmin=0, vmax=25000)

#Se cambia el formato de fecha en el eje X para que sea más entendible
ax.set_xticklabels(pv_tx_2.columns.strftime('%d %b'))

#Asignamos etiquetas por eje
ax.set_xlabel('Días transcurridos desde el 23 de mayo de 2020 al 05 de Junio de 2020')
ax.set_ylabel('Países latinoamericanos')

#Guardamos la figura del gráfico en una imagen
fig.savefig('heatmap_performance_diario_paises.png', bbox_inches='tight')
In [12]:
#Leemos el CSV del bonus track de casos diarios confirmados.

casos_diarios = pd.read_csv('daily-cases-covid-19.csv')
cases_country = casos_diarios.set_index('Entity')
cases_country
Out[12]:
Code Date Daily confirmed cases (cases)
Entity
Afghanistan AFG Dec 31, 2019 0
Afghanistan AFG Jan 1, 2020 0
Afghanistan AFG Jan 2, 2020 0
Afghanistan AFG Jan 3, 2020 0
Afghanistan AFG Jan 4, 2020 0
... ... ... ...
Zimbabwe ZWE Jun 2, 2020 25
Zimbabwe ZWE Jun 3, 2020 3
Zimbabwe ZWE Jun 4, 2020 16
Zimbabwe ZWE Jun 5, 2020 15
Zimbabwe ZWE Jun 6, 2020 28

24300 rows × 3 columns

In [13]:
#Generamos una pivot_table para obtener una gráfica rápida
# de casos confirmados en total por país
pt_cases_country = pd.pivot_table(
    cases_country.loc[ latin_america_countries ], 
    values = 'Daily confirmed cases (cases)',
    index = ['Entity'],
    aggfunc=sum,
).sort_values(by='Daily confirmed cases (cases)').plot(kind='bar')

fig = pt_cases_country.get_figure()
#Se asigna tamaño a la gráfica
fig.set_size_inches(15, 7)

#Se formatean las leyendas en el gráfico.
for p in pt_cases_country.patches:
    pt_cases_country.annotate( "{:,}".format( p.get_height() ), (p.get_x() * 1.005, p.get_height() * 1.005))
In [14]:
# Se parsean las cadenas de fecha a objetos datetime
cases_country['Date'] = cases_country['Date'].apply( lambda x: datetime.strptime( x, '%b %d, %Y' ) )

#Filtramos para obtener los casos detectados los últimos días
cases_country = cases_country.loc[ cases_country['Date']>= start_date ]
cases_country
Out[14]:
Code Date Daily confirmed cases (cases)
Entity
Afghanistan AFG 2020-05-23 540
Afghanistan AFG 2020-05-24 782
Afghanistan AFG 2020-05-25 584
Afghanistan AFG 2020-05-26 591
Afghanistan AFG 2020-05-27 658
... ... ... ...
Zimbabwe ZWE 2020-06-02 25
Zimbabwe ZWE 2020-06-03 3
Zimbabwe ZWE 2020-06-04 16
Zimbabwe ZWE 2020-06-05 15
Zimbabwe ZWE 2020-06-06 28

3374 rows × 3 columns

In [15]:
# Juntamos las tablas (Las cruzamos) empatándolas por el país y la 
# fecha de registro para no tener valores duplicados.
# Con la función merge, se puede realizar algo muy cercano al 'INNER JOIN' de SQL
result = pd.merge(latin_america, cases_country, how='inner', left_on=['Entity', 'Date'], right_on=['Entity', 'Date'])
result
Out[15]:
Code_x Date New tests Code_y Daily confirmed cases (cases)
Entity
Argentina ARG 2020-05-23 4615 ARG 718
Argentina ARG 2020-05-24 3525 ARG 704
Argentina ARG 2020-05-27 3556 ARG 600
Argentina ARG 2020-05-28 4863 ARG 705
Argentina ARG 2020-05-29 5405 ARG 769
... ... ... ... ... ...
Peru PER 2020-05-30 3718 PER 6506
Peru PER 2020-05-31 3042 PER 7386
Peru PER 2020-06-01 3562 PER 8805
Peru PER 2020-06-02 1458 PER 5563
Peru PER 2020-06-03 6603 PER 0

133 rows × 5 columns

In [16]:
#Generamos una pivot table en donde se muestran los casos confirmados
# y las pruebas realizadas en los últimos 15 días con el dataframe
# que unimos anteriormente
ax = pd.pivot_table(
    result,
    values = ['Daily confirmed cases (cases)', 'New tests'],
    index = ['Entity'],
    aggfunc=sum,
)
#Renombramos las columnas para que den la impresión correcta.
ax = ax.rename(columns={'Daily confirmed cases (cases)':'Casos reportados', 'New tests': 'Pruebas realizadas'})
ax
Out[16]:
Casos reportados Pruebas realizadas
Entity
Argentina 5082 36893
Bolivia 6451 13850
Chile 56047 204365
Colombia 15024 138644
Costa Rica 254 4794
Cuba 199 21835
El Salvador 1013 28953
Mexico 37759 55661
Panama 4493 17172
Paraguay 234 11372
Peru 53009 39075
In [17]:
#Repetimos el proceso

#Obtenemos el objeto del gráfico
ax=ax.sort_values(by='Casos reportados').plot(kind="bar", stacked=True)

#Seteamos las leyendas por eje
ax.set_ylabel('Número de pruebas realizadas')
ax.set_xlabel('Países latinoamericanos')

#Obtenemos la figura y la redimensionamos
fig = ax.get_figure()
fig.set_size_inches(15, 7)

#Guardamos la gráfica con los datos cruzados
fig.savefig('casos_y_pruebas_por_pais.png', bbox_inches='tight')