Uso de la API del Covid19 con Pandas

La URL https://api.covid19api.com/countries

Instalacion librerias

Instalamos con !pip la libreria de pandas, es una libreria de software diseñada para manipular y analizar estructuras de datos en Python

!pip install pandas
Requirement already satisfied: pandas in /usr/local/lib/python3.8/dist-packages (1.3.1)
Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.8/dist-packages (from pandas) (1.21.1)
Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.8/dist-packages (from pandas) (2.8.1)
Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.8/dist-packages (from pandas) (2020.4)
Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.7.3->pandas) (1.14.0)

Configuracion de Pandas

Configuramos panda como pd para importar la libreria

import pandas as pd

Crear variable

Asignamos a la variable URL la dirección de la que queremos extraer los datos

url = "https://api.covid19api.com/countries"

Crear el dataframe

Creamos el dataframe y así podremos visualizar la información del lugar del cual extraemos los datos

Decimos que el dataframe sea igual a la lectura que va a hacer pandas, previamente importado como pd, que lea los datos de la url con JSON (Java Script Object Notation)

poniendo df le pedimos que nos muestre el dataframe

df = pd.read_json(url)
df
Country Slug ISO2
0 French Polynesia french-polynesia PF
1 Indonesia indonesia ID
2 Malta malta MT
3 Sao Tome and Principe sao-tome-and-principe ST
4 Haiti haiti HT
... ... ... ...
243 Myanmar myanmar MM
244 Turkey turkey TR
245 Western Sahara western-sahara EH
246 Pitcairn pitcairn PN
247 Tanzania, United Republic of tanzania TZ

248 rows × 3 columns

Nos saldran solo los cinco primeros datos y los cinco últimos porque hay demasiados datos, pero se puede cambiar utilizando df.heado df.tail seguido de el numero de resultado que queremos que salgan en parentesis (n)

Exploración de la tabla

df.head(6)
Country Slug ISO2
0 French Polynesia french-polynesia PF
1 Indonesia indonesia ID
2 Malta malta MT
3 Sao Tome and Principe sao-tome-and-principe ST
4 Haiti haiti HT
5 Poland poland PL
df.tail(2)
Country Slug ISO2
246 Pitcairn pitcairn PN
247 Tanzania, United Republic of tanzania TZ

Queremos mostrar la información del dataframe asi que utilizamos df.info() O para buscar en el nombre en concreto de la lista df["Country"]["N"]

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 248 entries, 0 to 247
Data columns (total 3 columns):
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
 0   Country  248 non-null    object
 1   Slug     248 non-null    object
 2   ISO2     248 non-null    object
dtypes: object(3)
memory usage: 5.9+ KB
df["Country"][66]
'Somalia'

Tiempo real

https://api.covid19api.com/country/spain/status/confirmed/live

Repetimos el ejercicio on un país en especifico

Elijo España, creamos su variable, tanto de los datos como del dataframe (url_es y df_es)

Igualamos la url a la dirección de la que queremos extraer los datos y el data frame a la lectura que queremos que haga pandas (previamente importado como pd) de la dirección de la que queremos extraer los datos gracias a JSON

Ponemos df_es y asi tenemos la visualizacion de los datos

url_es = "https://api.covid19api.com/country/spain/status/confirmed/live"
df_es = pd.read_json(url_es)
df_es
Country CountryCode Province City CityCode Lat Lon Cases Status Date
0 Spain ES 40.46 -3.75 0 confirmed 2020-01-22 00:00:00+00:00
1 Spain ES 40.46 -3.75 0 confirmed 2020-01-23 00:00:00+00:00
2 Spain ES 40.46 -3.75 0 confirmed 2020-01-24 00:00:00+00:00
3 Spain ES 40.46 -3.75 0 confirmed 2020-01-25 00:00:00+00:00
4 Spain ES 40.46 -3.75 0 confirmed 2020-01-26 00:00:00+00:00
... ... ... ... ... ... ... ... ... ... ...
798 Spain ES 40.46 -3.75 11508309 confirmed 2022-03-30 00:00:00+00:00
799 Spain ES 40.46 -3.75 11508309 confirmed 2022-03-31 00:00:00+00:00
800 Spain ES 40.46 -3.75 11551574 confirmed 2022-04-01 00:00:00+00:00
801 Spain ES 40.46 -3.75 11551574 confirmed 2022-04-02 00:00:00+00:00
802 Spain ES 40.46 -3.75 11551574 confirmed 2022-04-03 00:00:00+00:00

803 rows × 10 columns

Investigamos que tipo de datos nos muestra la propia tabla de visualización de los datos poniendo el df_es seguido de .columns

df_es.columns
Index(['Country', 'CountryCode', 'Province', 'City', 'CityCode', 'Lat', 'Lon',
       'Cases', 'Status', 'Date'],
      dtype='object')
df_es["Date"].head(1)
0   2020-01-22 00:00:00+00:00
Name: Date, dtype: datetime64[ns, UTC]
df_es["Date"].tail(1)
802   2022-04-03 00:00:00+00:00
Name: Date, dtype: datetime64[ns, UTC]
df_es.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 803 entries, 0 to 802
Data columns (total 10 columns):
 #   Column       Non-Null Count  Dtype              
---  ------       --------------  -----              
 0   Country      803 non-null    object             
 1   CountryCode  803 non-null    object             
 2   Province     803 non-null    object             
 3   City         803 non-null    object             
 4   CityCode     803 non-null    object             
 5   Lat          803 non-null    float64            
 6   Lon          803 non-null    float64            
 7   Cases        803 non-null    int64              
 8   Status       803 non-null    object             
 9   Date         803 non-null    datetime64[ns, UTC]
dtypes: datetime64[ns, UTC](1), float64(2), int64(1), object(6)
memory usage: 62.9+ KB

Pedimos que el dataframe haga una descripción de los datos

df_es.describe()
Lat Lon Cases
count 8.030000e+02 803.00 8.030000e+02
mean 4.046000e+01 -3.75 3.242248e+06
std 7.109856e-15 0.00 3.109442e+06
min 4.046000e+01 -3.75 0.000000e+00
25% 4.046000e+01 -3.75 3.186710e+05
50% 4.046000e+01 -3.75 3.149012e+06
75% 4.046000e+01 -3.75 4.920388e+06
max 4.046000e+01 -3.75 1.155157e+07

Ahora le pedimos que nos muestre los datos en un índice con los datos clasificados por la fecha

df_es.set_index("Date")
Country CountryCode Province City CityCode Lat Lon Cases Status
Date
2020-01-22 00:00:00+00:00 Spain ES 40.46 -3.75 0 confirmed
2020-01-23 00:00:00+00:00 Spain ES 40.46 -3.75 0 confirmed
2020-01-24 00:00:00+00:00 Spain ES 40.46 -3.75 0 confirmed
2020-01-25 00:00:00+00:00 Spain ES 40.46 -3.75 0 confirmed
2020-01-26 00:00:00+00:00 Spain ES 40.46 -3.75 0 confirmed
... ... ... ... ... ... ... ... ... ...
2022-03-30 00:00:00+00:00 Spain ES 40.46 -3.75 11508309 confirmed
2022-03-31 00:00:00+00:00 Spain ES 40.46 -3.75 11508309 confirmed
2022-04-01 00:00:00+00:00 Spain ES 40.46 -3.75 11551574 confirmed
2022-04-02 00:00:00+00:00 Spain ES 40.46 -3.75 11551574 confirmed
2022-04-03 00:00:00+00:00 Spain ES 40.46 -3.75 11551574 confirmed

803 rows × 9 columns

Ahora queremos que nos saque solamente los casos con su respectiva fecha que se ubican en los datos

df_es.set_index("Date")["Cases"]
Date
2020-01-22 00:00:00+00:00           0
2020-01-23 00:00:00+00:00           0
2020-01-24 00:00:00+00:00           0
2020-01-25 00:00:00+00:00           0
2020-01-26 00:00:00+00:00           0
                               ...   
2022-03-30 00:00:00+00:00    11508309
2022-03-31 00:00:00+00:00    11508309
2022-04-01 00:00:00+00:00    11551574
2022-04-02 00:00:00+00:00    11551574
2022-04-03 00:00:00+00:00    11551574
Name: Cases, Length: 803, dtype: int64

A partir de las funciones que hemos visto para ordenar y buscar los datos, hacemos que nos muestre el dataframe a través de un gráfico. Primero le pedimos que nos saque las fechas y los casos de los datos leídos. Utilzamos plotpara designar el gráfico y entre paréntesis indicamos el nombre de el grafico

df_es.set_index("Date")["Cases"].plot(title="Casos de Covid19 en España")
<AxesSubplot:title={'center':'Casos de Covid19 en España'}, xlabel='Date'>

Repetimos el mismo procedimiento con dos países más para poder hacer así una comparación

Otro País

url_it = "https://api.covid19api.com/country/italy/status/confirmed/live"
df_it = pd.read_json(url_it)
df_it
Country CountryCode Province City CityCode Lat Lon Cases Status Date
0 Italy IT 41.87 12.57 0 confirmed 2020-01-22 00:00:00+00:00
1 Italy IT 41.87 12.57 0 confirmed 2020-01-23 00:00:00+00:00
2 Italy IT 41.87 12.57 0 confirmed 2020-01-24 00:00:00+00:00
3 Italy IT 41.87 12.57 0 confirmed 2020-01-25 00:00:00+00:00
4 Italy IT 41.87 12.57 0 confirmed 2020-01-26 00:00:00+00:00
... ... ... ... ... ... ... ... ... ... ...
798 Italy IT 41.87 12.57 14567990 confirmed 2022-03-30 00:00:00+00:00
799 Italy IT 41.87 12.57 14642354 confirmed 2022-03-31 00:00:00+00:00
800 Italy IT 41.87 12.57 14719394 confirmed 2022-04-01 00:00:00+00:00
801 Italy IT 41.87 12.57 14790806 confirmed 2022-04-02 00:00:00+00:00
802 Italy IT 41.87 12.57 14845815 confirmed 2022-04-03 00:00:00+00:00

803 rows × 10 columns

df_it.set_index("Date")["Cases"].plot(title="Casos de Covid19 en Italia")
<AxesSubplot:title={'center':'Casos de Covid19 en Italia'}, xlabel='Date'>

Otro nuevo caso

url_ger = "https://api.covid19api.com/country/germany/status/confirmed/live"
df_ger = pd.read_json(url_ger)
df_ger.set_index("Date")["Cases"].plot(title="Casos de Covid19 en Alemania")
<AxesSubplot:title={'center':'Casos de Covid19 en Alemania'}, xlabel='Date'>

Comparacion

Comparamos los tres países en un gráfico

Creamos una variable para cada uno de los dataframe de los tres países que hemos escogido, España, Italia y Alemania

casos_es = df_es.set_index("Date")["Cases"]
casos_it = df_it.set_index("Date")["Cases"]
casos_ger = df_ger.set_index("Date")["Cases"]

Creamos la variable de vs para visualizar los datos que igualamos a la concatenación de los dataframe de cada pais que hacemos con panda por ello pd.concat Finalmente ponemos axis=1para ordenar los países en una sola fila Escribimos vs para mostrar la concatenacion de los datos

vs = pd.concat([casos_es,casos_it,casos_ger],axis=1)
vs
Cases Cases Cases
Date
2020-01-22 00:00:00+00:00 0 0 0
2020-01-23 00:00:00+00:00 0 0 0
2020-01-24 00:00:00+00:00 0 0 0
2020-01-25 00:00:00+00:00 0 0 0
2020-01-26 00:00:00+00:00 0 0 0
... ... ... ...
2022-03-30 00:00:00+00:00 11508309 14567990 20829608
2022-03-31 00:00:00+00:00 11508309 14642354 21394747
2022-04-01 00:00:00+00:00 11551574 14719394 21394691
2022-04-02 00:00:00+00:00 11551574 14790806 21591147
2022-04-03 00:00:00+00:00 11551574 14845815 21706329

803 rows × 3 columns

Nombramos cada una de las columnas de vs con los nombres de los países correspondientes

vs.columns = ["España","Italia","Alemania"]
vs
España Italia Alemania
Date
2020-01-22 00:00:00+00:00 0 0 0
2020-01-23 00:00:00+00:00 0 0 0
2020-01-24 00:00:00+00:00 0 0 0
2020-01-25 00:00:00+00:00 0 0 0
2020-01-26 00:00:00+00:00 0 0 0
... ... ... ...
2022-03-30 00:00:00+00:00 11508309 14567990 20829608
2022-03-31 00:00:00+00:00 11508309 14642354 21394747
2022-04-01 00:00:00+00:00 11551574 14719394 21394691
2022-04-02 00:00:00+00:00 11551574 14790806 21591147
2022-04-03 00:00:00+00:00 11551574 14845815 21706329

803 rows × 3 columns

Para mostrar la visualizacion con un grafico utilizamos plotcon la variable vs. Le ponemos titulo e indicamos el tipo de gráfico que queremos mostrar, preferiblemente un gráfico que se clarifique el área de cada uno de los países.

vs.plot(title="Casos de Covid19 en España, Italia y Alemania", kind="area")
<AxesSubplot:title={'center':'Casos de Covid19 en España, Italia y Alemania'}, xlabel='Date'>

Guardar el gráfico

Transformamos el grafico al formato de datos de csv y entre parentesis indicamos el nombre del archivo

vs.to_csv("esvsit.csv")

Utilizamos la funcion !lspara poder comprobar si se ha guardado bien

!ls
esvsit.csv			 python-prueba.ipynb  Shared_Resources
python-api-covid19-pandas.ipynb  seaborn-data

Guardamos el mismo gráfico como una imagen en PNG. Importamos la libreria que nos permite guardar imagenes en pyhon matplotlib.pypploty lo importamos como plt. Hacemos que aparezca el gráfico y utilizamos plt para guardar la imagen del gráfico con el nombre "esvsit.png"

import matplotlib.pyplot as plt
vs.plot()
plt.savefig("esvsit.png")

Comprobamos una vez más que todo esta guardado correctamente

!ls
esvsit.csv  python-api-covid19-pandas.ipynb  seaborn-data
esvsit.png  python-prueba.ipynb		     Shared_Resources