Created
June 8, 2020 15:20
-
-
Save iangelmx/82697d850fd9339dd5ae6dea4f6c6207 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# coding: utf-8 | |
# 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 | |
# 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() | |
# 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 | |
# 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 | |
# 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 | |
# 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 | |
# 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 | |
# 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 | |
# 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 | |
# 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 | |
# 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 | |
# 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') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment