Skip to content

Instantly share code, notes, and snippets.

@iangelmx
Created June 8, 2020 15:20
Show Gist options
  • Save iangelmx/82697d850fd9339dd5ae6dea4f6c6207 to your computer and use it in GitHub Desktop.
Save iangelmx/82697d850fd9339dd5ae6dea4f6c6207 to your computer and use it in GitHub Desktop.
#!/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