There are several sites that show a dashboard of Covid-19 information, for example arcgis, or in the case of Venezuela there is covid19-venezuela.
This article is based on the article Learning pandas by Exploring COVID-19 Data, the European Union's CDC ECDC, another data source Coronavirus Source Data, and the Johns Hopkins University repository, which is the basis for the data sources of this article.
The way to access the data locally is to clone and then pull:
git clone https://github.com/CSSEGISandData/COVID-19.git
To update:
cd COVID-19
git pull origin master
You need to install pandas, csv and matplotlib:
pip3 install pandas csv matplotlib
Once downloaded, the process would be the following:
- Read the csv
- Process the data
- Plot
The code follows:
# In[1]:
import pandas as pd
import datetime
import requests
from pathlib import Path
import matplotlib.pyplot as plt
%matplotlib inline
Path of the csv files
# In[2]:
path = "./COVID-19/csse_covid_19_data/csse_covid_19_daily_reports"
File listing function
# In[3]:
def ls3(path):
"""
Retorna una lista de archivos de una ruta (path) dada.
:param path: Ruta del directorio donde se encuentran los archivos a listar
:return filenames
"""
return [obj.name for obj in Path(path).iterdir() if obj.is_file()]
Data retrieval function
# In[4]:
def getData(country="Venezuela",date="03-13-2020",path=path,encoding="ISO-8859-1"):
"""
Obtiene los datos desde una fecha y para un país, de la ruta definida de archivos csv.
:param country: País que se quiere generar el dataframe
:param date: Fecha desde que se va a tomar los datos para el dataframe
:param path: Ruta donde se encuentran los archivos csv
:param encoding: Codificación a la que se encuentran los archivos csv.
:return df: Dataframe con los datos extraídos de los csv desde una fecha dada y para un país.
"""
# Se obtiene los nombres de los archivos.
lista = [file for file in ls3(path) if file.split(".")[-1] == "csv"]
# Se lee los archivos csv y se convierten en varios dataframe en un diccionario ordenados por fecha.
df = {item.split(".")[0]:pd.read_csv(path+ "/" +item,encoding=encoding) for item in lista}
# Se lista las fechas
dates = [item.split(".")[0] for item in lista]
# Se renombras las columnas de los dataframes.
for i,date in enumerate(dates):
if "Country_Region" in list(df[date].columns) or "Province_State" in list(df[date].columns) or "Last_Update" in list(df[date].columns):
df[date].rename(columns={"Country_Region": 'Country/Region',"Last_Update":"Last Update","Province_State": "Province/State"},inplace=True)
# Se convierten las fechas en datetime y se ordenan
dates2 = sorted([datetime.datetime.strptime(date,"%m-%d-%Y") for date in dates])
# Se ordena los dataframes en una lista
data = [df[d.strftime("%m-%d-%Y")][df[d.strftime("%m-%d-%Y")]["Country/Region"] == country] for d in dates2 if d >= datetime.datetime.strptime(date,"%m-%d-%Y")]
#Se concatena los dataframes en uno sólo y se retorna
data_df = pd.concat(data)
return data_df
Add rate column function
# In[5]:
def AddColumnRate(df,column_name):
"""
Agrega una columna al dataframe, dicha columna es la diferencia entre la próxima row y el row actual
:param df: DataFrame a agregar la columna.
:param column_name: Columna a la que se quiere calcular la diferencia.
:return df: Retorna un dataframe con la columna adicional que tiene la diferencia por día.
"""
elements = []
# Se recorre el dataframe
for i in range(len(df)):
# Si es la fila inicial se toma su valor
if i == 0:
elements.append(df.iloc[0][column_name])
else:
# Si no es el inicial se calcula la diferencia de su valor actual con el anterior
elements.append(df.iloc[i][column_name] - df.iloc[i-1][column_name])
# Se agrega la lista al dataframe
df.insert(4,f"rate_{column_name}",elements)
return df
Data processing function
# In[6]:
def DataProcessor(df):
"""
Se remueve columnas del dataframe, se define el index, se reemplaza los NA y se agrega dos columnas.
:param df: Dataframe a procesar
:return df: DataFrame procesado
"""
# Se obtiene el nombre de una columna a remover
remove = list(df.columns)[0]
# Se remueve la lista de columnas
df.drop(labels=["Province/State","Latitude","Longitude","Admin2","Lat","Long_","Combined_Key","FIPS",remove],axis=1,inplace=True)
df.drop(labels=[df.columns[-2]],axis=1,inplace=True)
# Se reemplaza NA por 0.
df.fillna(0,inplace=True)
# Se conviernte las fechas que son string a datetime
df['Last Update']= pd.to_datetime(df['Last Update'])
# Se define las fechas como indice
df.set_index("Last Update",inplace=True)
# Se calcula los rate de confirmados y muertes
df = AddColumnRate(df,"Confirmed")
df = AddColumnRate(df,"Deaths")
return df
Chart creation function
# In[7]:
def PlotData(df,column,title):
"""
Gráfica una columna del dataframe
:param df: Dataframe a gráficar
:param column: Columna a graficar
:param title: Título de la gŕafica
"""
# Se recorre los países de la lista
for i,country in enumerate(countries):
if i == 0:
# Si es el primer país se define el título de la gráfica
df[country][column].plot(label=country,figsize=(16,8),title=title)
else:
df[country][column].plot(label=country,figsize=(16,8))
plt.legend();
Data retrieval and processing
# # Obtención de datos
# In[8]:
# Paises a analizar
countries = ["Venezuela","Chile"]
# In[9]:
# Fecha de extracción de datos
date= "02-20-2020"
# In[10]:
# Construcción de los dataframes
df = {country: getData(country=country,date=date) for country in countries}
# In[11]:
# Procesar los datos
df2 = {country: DataProcessor(df[country]) for country in countries}
DataFrame
Venezuela's DataFrame:
df2["Venezuela"]
Generate charts
Confirmed Cases
# In[12]:
PlotData(df2,"Confirmed","Casos Confirmados")
Confirmed Rate
# In[13]:
PlotData(df2,"rate_Confirmed","Tasa de confirmados")
Deaths
# In[14]:
PlotData(df2,"Deaths","Muertes")
Recovered
# In[15]:
PlotData(df2,"Recovered","Recuperados")
You can find the data processing notebook on github
Make a donation! If you liked the article you can make a donation with Bitcoin (BTC) using the digital wallet of your choice to the following address: 17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV
Or by scanning the QR code from your wallet:
