A continuación trabajaremos con los datos facilitados por la página la API de datos del COVID-19, cuyo fin es recopilar información se los contagias de covid-19 en todo el planeta.
En este ejercicio implementaremos la función Pandas, librería externa de Python, con la trabajaremos los datos del Covid-19 para aprender a crear gráficas de líneas
La url: https://api.covid19api.com/countries
Para la instalación las librerías con la que trabajaremos se utiliza pip.
pip
es un manejador de paquetes para Python
pip install pandas
Requirement already satisfied: pandas in c:\users\gabri\anaconda3\lib\site-packages (1.4.4)
Requirement already satisfied: pytz>=2020.1 in c:\users\gabri\anaconda3\lib\site-packages (from pandas) (2022.1)
Requirement already satisfied: python-dateutil>=2.8.1 in c:\users\gabri\anaconda3\lib\site-packages (from pandas) (2.8.2)
Requirement already satisfied: numpy>=1.18.5 in c:\users\gabri\anaconda3\lib\site-packages (from pandas) (1.21.5)
Requirement already satisfied: six>=1.5 in c:\users\gabri\anaconda3\lib\site-packages (from python-dateutil>=2.8.1->pandas) (1.16.0)
Note: you may need to restart the kernel to use updated packages.
Al instalar el Pandas este se importa como pd
import pandas as pd
Pandas: de acuerdo con pypi.org esta es una herramienta de análisis de datos de código, de lectura rápida en el lenguaje de programación de Python.
Para que Python carga todas las bibliotecas. Se tiene que usar el enunciado import
en nuestro código para usar las funciones de la biblioteca. E importar la biblioteca Pandas empleando su abreviatura pd
.
Luego creamos la variable miurl
para designar la dirección de la página deseada que incluiremos en la fórmula dentro de comillas simples.
miurl = "https://api.covid19api.com/countries"
Para certificar el correcto funcionamiento de la variable creada, escribimos miurl y debería mostrar el link de la página con que trabajaremos.
miurl
'https://api.covid19api.com/countries'
Si queremos saber qué tipo de variable representa miurl, solo tengo que encerrarlo en paréntesis y entrar en una función type
type(miurl)
str
str
según w3schools Str en Python es una función
convierte el valor especificado en una cadena.
Según pandas.pydata.org dataframe puede contener series, matrices, constantes, clases de datos u objetos similares a listas. Si los datos son un dictado, el orden de las columnas sigue el orden de inserción. Si un dict contiene Series que tienen un índice definido, se alinea por su índice.
La abreviatura de dataframe es df. Con función read_json() que lee el formato json. dentro del parentecer ponemos lo que queremos leer. Ejemplo, un miurl.
df = pd.read_json(miurl)
Para visualizar los datos llamamos el objeto y Pandas identifica una de las entradas del dataframe. Y Observamos una tabla de Pandas que identifica las entradas del dataframe.
df
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Country | Slug | ISO2 | |
---|---|---|---|
0 | Maldives | maldives | MV |
1 | Slovakia | slovakia | SK |
2 | Christmas Island | christmas-island | CX |
3 | Djibouti | djibouti | DJ |
4 | Macedonia, Republic of | macedonia | MK |
... | ... | ... | ... |
243 | Bulgaria | bulgaria | BG |
244 | Greenland | greenland | GL |
245 | Sweden | sweden | SE |
246 | Georgia | georgia | GE |
247 | Uruguay | uruguay | UY |
248 rows × 3 columns
Para ver las primeras entradas de la tabla utilizaremos la siguiente función:
df.head(6)
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Country | Slug | ISO2 | |
---|---|---|---|
0 | Maldives | maldives | MV |
1 | Slovakia | slovakia | SK |
2 | Christmas Island | christmas-island | CX |
3 | Djibouti | djibouti | DJ |
4 | Macedonia, Republic of | macedonia | MK |
5 | Singapore | singapore | SG |
Con df.tail() Vemos las ultimas
df.tail(6)
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Country | Slug | ISO2 | |
---|---|---|---|
242 | Northern Mariana Islands | northern-mariana-islands | MP |
243 | Bulgaria | bulgaria | BG |
244 | Greenland | greenland | GL |
245 | Sweden | sweden | SE |
246 | Georgia | georgia | GE |
247 | Uruguay | uruguay | UY |
Para ver las informaciones sobre las variables que contiene el df usamos la siguiente funció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
Para ver un valor concreto de una de las varibles:
df['Country'][66]
'Ireland'
df['ISO2'].head()
0 MV
1 SK
2 CX
3 DJ
4 MK
Name: ISO2, dtype: object
La url que utilizamos ahora es la siguiente: https://api.covid19api.com/country/colombia/status/confirmed/live
Guardamos los datos, pero ahora añadiendo col (abreviatura de colombia) para identificar y solo trabajar con este país df_col.
url_col = 'https://api.covid19api.com/country/colombia/status/confirmed/live'
df_col = pd.read_json(url_col)
df_col
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Country | CountryCode | Province | City | CityCode | Lat | Lon | Cases | Status | Date | |
---|---|---|---|---|---|---|---|---|---|---|
0 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-22 00:00:00+00:00 | |||
1 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-23 00:00:00+00:00 | |||
2 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-24 00:00:00+00:00 | |||
3 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-25 00:00:00+00:00 | |||
4 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-26 00:00:00+00:00 | |||
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1042 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-11-29 00:00:00+00:00 | |||
1043 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-11-30 00:00:00+00:00 | |||
1044 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-12-01 00:00:00+00:00 | |||
1045 | Colombia | CO | 4.57 | -74.3 | 6314107 | confirmed | 2022-12-02 00:00:00+00:00 | |||
1046 | Colombia | CO | 4.57 | -74.3 | 6314107 | confirmed | 2022-12-03 00:00:00+00:00 |
1047 rows × 10 columns
Para saber el nombre de las sesiones de como se están en que se están dividiendo las columnas
df_col.columns
Index(['Country', 'CountryCode', 'Province', 'City', 'CityCode', 'Lat', 'Lon',
'Cases', 'Status', 'Date'],
dtype='object')
Para ver las entradas que encabezan nuestra tabla usamos el siguiente código
df_col.head(10)
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Country | CountryCode | Province | City | CityCode | Lat | Lon | Cases | Status | Date | |
---|---|---|---|---|---|---|---|---|---|---|
0 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-22 00:00:00+00:00 | |||
1 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-23 00:00:00+00:00 | |||
2 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-24 00:00:00+00:00 | |||
3 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-25 00:00:00+00:00 | |||
4 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-26 00:00:00+00:00 | |||
5 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-27 00:00:00+00:00 | |||
6 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-28 00:00:00+00:00 | |||
7 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-29 00:00:00+00:00 | |||
8 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-30 00:00:00+00:00 | |||
9 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-31 00:00:00+00:00 |
Para ver las entradas que finalizan nuestra tabla usamos el siguiente código
df_col.tail(10)
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Country | CountryCode | Province | City | CityCode | Lat | Lon | Cases | Status | Date | |
---|---|---|---|---|---|---|---|---|---|---|
1037 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-11-24 00:00:00+00:00 | |||
1038 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-11-25 00:00:00+00:00 | |||
1039 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-11-26 00:00:00+00:00 | |||
1040 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-11-27 00:00:00+00:00 | |||
1041 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-11-28 00:00:00+00:00 | |||
1042 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-11-29 00:00:00+00:00 | |||
1043 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-11-30 00:00:00+00:00 | |||
1044 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-12-01 00:00:00+00:00 | |||
1045 | Colombia | CO | 4.57 | -74.3 | 6314107 | confirmed | 2022-12-02 00:00:00+00:00 | |||
1046 | Colombia | CO | 4.57 | -74.3 | 6314107 | confirmed | 2022-12-03 00:00:00+00:00 |
df_col.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1047 entries, 0 to 1046
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Country 1047 non-null object
1 CountryCode 1047 non-null object
2 Province 1047 non-null object
3 City 1047 non-null object
4 CityCode 1047 non-null object
5 Lat 1047 non-null float64
6 Lon 1047 non-null float64
7 Cases 1047 non-null int64
8 Status 1047 non-null object
9 Date 1047 non-null datetime64[ns, UTC]
dtypes: datetime64[ns, UTC](1), float64(2), int64(1), object(6)
memory usage: 81.9+ KB
Para Obtener una descripción estadística de las variables del df (numero total, media, moda, desviación, mínimo, máximo y cuartiles):
df_col.describe()
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Lat | Lon | Cases | |
---|---|---|---|
count | 1.047000e+03 | 1.047000e+03 | 1.047000e+03 |
mean | 4.570000e+00 | -7.430000e+01 | 3.444014e+06 |
std | 1.866066e-14 | 1.464418e-12 | 2.438811e+06 |
min | 4.570000e+00 | -7.430000e+01 | 0.000000e+00 |
25% | 4.570000e+00 | -7.430000e+01 | 8.985235e+05 |
50% | 4.570000e+00 | -7.430000e+01 | 4.187194e+06 |
75% | 4.570000e+00 | -7.430000e+01 | 6.078859e+06 |
max | 4.570000e+00 | -7.430000e+01 | 6.314107e+06 |
Para la elaboración del mismo en el eje X (fechas) y Y (Casos).
Vamos a establcer la fecha como índice.
df_col.set_index('Date')
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Country | CountryCode | Province | City | CityCode | Lat | Lon | Cases | Status | |
---|---|---|---|---|---|---|---|---|---|
Date | |||||||||
2020-01-22 00:00:00+00:00 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | |||
2020-01-23 00:00:00+00:00 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | |||
2020-01-24 00:00:00+00:00 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | |||
2020-01-25 00:00:00+00:00 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | |||
2020-01-26 00:00:00+00:00 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | |||
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2022-11-29 00:00:00+00:00 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | |||
2022-11-30 00:00:00+00:00 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | |||
2022-12-01 00:00:00+00:00 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | |||
2022-12-02 00:00:00+00:00 | Colombia | CO | 4.57 | -74.3 | 6314107 | confirmed | |||
2022-12-03 00:00:00+00:00 | Colombia | CO | 4.57 | -74.3 | 6314107 | confirmed |
1047 rows × 9 columns
df_col
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Country | CountryCode | Province | City | CityCode | Lat | Lon | Cases | Status | Date | |
---|---|---|---|---|---|---|---|---|---|---|
0 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-22 00:00:00+00:00 | |||
1 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-23 00:00:00+00:00 | |||
2 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-24 00:00:00+00:00 | |||
3 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-25 00:00:00+00:00 | |||
4 | Colombia | CO | 4.57 | -74.3 | 0 | confirmed | 2020-01-26 00:00:00+00:00 | |||
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1042 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-11-29 00:00:00+00:00 | |||
1043 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-11-30 00:00:00+00:00 | |||
1044 | Colombia | CO | 4.57 | -74.3 | 6312657 | confirmed | 2022-12-01 00:00:00+00:00 | |||
1045 | Colombia | CO | 4.57 | -74.3 | 6314107 | confirmed | 2022-12-02 00:00:00+00:00 | |||
1046 | Colombia | CO | 4.57 | -74.3 | 6314107 | confirmed | 2022-12-03 00:00:00+00:00 |
1047 rows × 10 columns
Como la tabla debe reflejar también los casos, creamos una tabla para ver datos por fechas con el código siguiente:
df_col.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-11-29 00:00:00+00:00 6312657
2022-11-30 00:00:00+00:00 6312657
2022-12-01 00:00:00+00:00 6312657
2022-12-02 00:00:00+00:00 6314107
2022-12-03 00:00:00+00:00 6314107
Name: Cases, Length: 1047, dtype: int64
Sobre esta vista creamos el gráfico con la funcion plot.
df_col.set_index('Date')['Cases'].plot()
<AxesSubplot:xlabel='Date'>
La variable title
que significa en español título. Esta variable se encuentra dentro de paréntesis en del siguiente código df_col.set_index('Date')['Cases'].plot(title= "")
. Dentro de estas comillas pondremos el enunciado que servirá de título para nuestra gráfica
df_col.set_index('Date')['Cases'].plot(title= "Casos Covid-19 Colombia 2021-2022")
<AxesSubplot:title={'center':'Casos Covid-19 Colombia 2021-2022'}, xlabel='Date'>
Repetimos con los datos de España, Ecuador y República Dominicana:
La url que utilizamos ahora es la siguiente: https://api.covid19api.com/country/spain/status/confirmed/live
Guardamos los datos, pero ahora añadiendo es (abreviatura de España) para identificar y solo trabajar con este país df_es.
url_es = 'https://api.covid19api.com/country/spain/status/confirmed/live'
df_es = pd.read_json(url_es)
df_es
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
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 | |||
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1042 | Spain | ES | 40.46 | -3.75 | 13595504 | confirmed | 2022-11-29 00:00:00+00:00 | |||
1043 | Spain | ES | 40.46 | -3.75 | 13595504 | confirmed | 2022-11-30 00:00:00+00:00 | |||
1044 | Spain | ES | 40.46 | -3.75 | 13595504 | confirmed | 2022-12-01 00:00:00+00:00 | |||
1045 | Spain | ES | 40.46 | -3.75 | 13614807 | confirmed | 2022-12-02 00:00:00+00:00 | |||
1046 | Spain | ES | 40.46 | -3.75 | 13614807 | confirmed | 2022-12-03 00:00:00+00:00 |
1047 rows × 10 columns
df_es.set_index('Date')['Cases'].plot(title= "Casos Covid-19 España 2021-2022")
<AxesSubplot:title={'center':'Casos Covid-19 España 2021-2022'}, xlabel='Date'>
La url que utilizamos ahora es la siguiente: https://api.covid19api.com/country/ecuador/status/confirmed/live
Guardamos los datos, pero ahora añadiendo ec (abreviatura de Ecuador) para identificar y solo trabajar con este país df_ec.
url_ec = 'https://api.covid19api.com/country/ecuador/status/confirmed/live'
df_ec = pd.read_json(url_ec)
df_ec
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
Country | CountryCode | Province | City | CityCode | Lat | Lon | Cases | Status | Date | |
---|---|---|---|---|---|---|---|---|---|---|
0 | Ecuador | EC | -1.83 | -78.18 | 0 | confirmed | 2020-01-22 00:00:00+00:00 | |||
1 | Ecuador | EC | -1.83 | -78.18 | 0 | confirmed | 2020-01-23 00:00:00+00:00 | |||
2 | Ecuador | EC | -1.83 | -78.18 | 0 | confirmed | 2020-01-24 00:00:00+00:00 | |||
3 | Ecuador | EC | -1.83 | -78.18 | 0 | confirmed | 2020-01-25 00:00:00+00:00 | |||
4 | Ecuador | EC | -1.83 | -78.18 | 0 | confirmed | 2020-01-26 00:00:00+00:00 | |||
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1042 | Ecuador | EC | -1.83 | -78.18 | 1011132 | confirmed | 2022-11-29 00:00:00+00:00 | |||
1043 | Ecuador | EC | -1.83 | -78.18 | 1011132 | confirmed | 2022-11-30 00:00:00+00:00 | |||
1044 | Ecuador | EC | -1.83 | -78.18 | 1011132 | confirmed | 2022-12-01 00:00:00+00:00 | |||
1045 | Ecuador | EC | -1.83 | -78.18 | 1011132 | confirmed | 2022-12-02 00:00:00+00:00 | |||
1046 | Ecuador | EC | -1.83 | -78.18 | 1011132 | confirmed | 2022-12-03 00:00:00+00:00 |
1047 rows × 10 columns
df_ec.set_index('Date')['Cases'].plot(title= "Casos Covid-19 Ecuador 2021-2022")
<AxesSubplot:title={'center':'Casos Covid-19 Ecuador 2021-2022'}, xlabel='Date'>
La url que utilizamos ahora es la siguiente: https://api.covid19api.com/country/Dominican%20Republic/status/confirmed/live
Guardamos los datos, pero ahora añadiendo do (abreviatura de Dominican Republic) para identificar y solo trabajar con este país df_do.
url_do = 'https://api.covid19api.com/country/Dominican%20Republic/status/confirmed/live'
df_do = pd.read_json(url_do)
df_do
df_do.set_index('Date')['Cases'].plot(title= "Casos Covid-19 República Dominicana 2021-2022")
Es impresionante poder trabajaron una herramienta tan fácil y práctica como Python acompañado de la función Pandas, con la cual en minutos pudimos procesar los datos facilitados por api.covid19api y crear visualizaciones en segundos.