Avance del proyecto
Contents
Avance del proyecto#
Para esta semana, deberás tener un cuaderno similar al que te presentamos a continuación. Asegúrate de realizar las operaciones necesarias para que tu conjunto de datos sea lo más preciso posible.
Importar datos#
Con “importar datos” nos referimos a la manera en la que preparamos la fuente de datos para ser leída por nuestro programa.
Existen múltiples maneras de importar la información. Por ejemplo, podemos sencillamente utilizar el mismo método que usamos con nuestro archivo ejemplo-1.txt
.
Descarga el archivo que quieras utilizar en el directorio de Drive en el que vayas a almacenar tus datos.
Como ejemplo, voy a utilizar los casos nacionales de COVID-19 registrados diariamente durante el primer semestre de 2022: https://datos.cdmx.gob.mx/dataset/casos-asociados-a-covid-19/resource/e5f65f40-5904-492a-ae33-1ea98fb73d78?inner_span=True
Descargo el archivo CSV en un directorio de mi computadora. Posteriormente lo subo a mi directorio de datos de Google Drive:
Volvemos a nuestro cuaderno de Google Colab. Me aseguro de haber activado Google Drive en mi Google Colab y busco el directorio en el cual está mi archivo. En mi caso: '/content/drive/MyDrive/Colab Notebooks/curso_datos/casos_nacionales_covid-19_2022_semestre1.csv'
Con esos pasos, podemos hacer la importación:
datos = '/content/drive/MyDrive/Colab Notebooks/curso_datos/casos_nacionales_covid-19_2022_semestre1.csv'
with open(datos, 'r') as f:
data = f.readlines(10) # agrego este argumento porque el archivo es muy extenso.
data
['"","fecha_actualizacion","id_registro","origen","sector","entidad_um","sexo","entidad_nac","entidad_res","municipio_res","tipo_paciente","fecha_ingreso","fecha_sintomas","fecha_def","intubado","neumonia","edad","nacionalidad","embarazo","habla_lengua_indig","indigena","diabetes","epoc","asma","inmusupr","hipertension","otra_com","cardiovascular","obesidad","renal_cronica","tabaquismo","otro_caso","toma_muestra_lab","resultado_lab","toma_muestra_antigeno","resultado_antigeno","clasificacion_final","migrante","pais_nacionalidad","pais_origen","uci"\n']
De esta manera hemos logrado incluir el archivo en nuestro cuaderno, pero será muy complejo manipularlo. Por esta razón, es preferible utilizar una librería que nos ayude a procesar estos datos. En nuestro caso, usaremos ‘Pandas’
Para hacer que nuestro programa funcione, solamente debemos importar la librería:
import pandas as pd
Y posteriormente podremos abrir nuestro archivo desde Python:
import pandas as pd
covid_nacional = pd.read_csv(datos)
covid_nacional.head()
/usr/local/lib/python3.7/dist-packages/IPython/core/interactiveshell.py:3326: DtypeWarning: Columns (13) have mixed types.Specify dtype option on import or set low_memory=False.
exec(code_obj, self.user_global_ns, self.user_ns)
Unnamed: 0 | fecha_actualizacion | id_registro | origen | sector | entidad_um | sexo | entidad_nac | entidad_res | municipio_res | ... | otro_caso | toma_muestra_lab | resultado_lab | toma_muestra_antigeno | resultado_antigeno | clasificacion_final | migrante | pais_nacionalidad | pais_origen | uci | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2022-06-26 | 0793b8 | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | HOMBRE | CIUDAD DE MÉXICO | NaN | NaN | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | NO ESPECIFICADO | MÉXICO | NO APLICA | NO APLICA |
1 | 2 | 2022-06-26 | 0fef08 | USMER | SSA | CIUDAD DE MÉXICO | HOMBRE | CIUDAD DE MÉXICO | NaN | NaN | ... | NO | SI | POSITIVO A SARS-COV-2 | NO | NO APLICA (CASO SIN MUESTRA) | CASO DE SARS-COV-2 CONFIRMADO | NO ESPECIFICADO | MÉXICO | NO APLICA | NO APLICA |
2 | 3 | 2022-06-26 | 11e31a | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | HOMBRE | CIUDAD DE MÉXICO | NaN | NaN | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | NO ESPECIFICADO | MÉXICO | NO APLICA | NO APLICA |
3 | 4 | 2022-06-26 | 0741e4 | FUERA DE USMER | ISSSTE | CIUDAD DE MÉXICO | HOMBRE | CIUDAD DE MÉXICO | NaN | NaN | ... | NO | SI | RESULTADO NO ADECUADO | NO | NO APLICA (CASO SIN MUESTRA) | NO REALIZADO POR LABORATORIO | NO ESPECIFICADO | MÉXICO | NO APLICA | NO |
4 | 5 | 2022-06-26 | 13c92b | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | MUJER | CIUDAD DE MÉXICO | NaN | NaN | ... | SI | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | NO ESPECIFICADO | MÉXICO | NO APLICA | NO APLICA |
5 rows × 41 columns
De esta manera, nuestro archivo estará listo para ser procesado :)
Análisis de estructuras de datos y preparación#
Describe la fuente de datos#
Una descripción simple de la forma de la fuente de datos es la siguiente:
# número de filas
filas = covid_nacional.shape[0]
filas
1323501
Esta es una fuente de datos con suficientes campos como para justificar una lectura distante de la información. Difícilmente una persona podría comprender la información que hay en ella solamente “leyendo” los datos de esas tablas.
# número de columnas
columnas = covid_nacional.shape[1]
columnas
41
Además, vemos que es un conjunto de datos con una cantidad significativa de categorías. Esto permite que con una sola fuente de información se puedan realizar operaciones de comparación entre columnas para analizar la información.
# nombre de las columnas
covid_nacional.columns
Index(['Unnamed: 0', 'fecha_actualizacion', 'id_registro', 'origen', 'sector',
'entidad_um', 'sexo', 'entidad_nac', 'entidad_res', 'municipio_res',
'tipo_paciente', 'fecha_ingreso', 'fecha_sintomas', 'fecha_def',
'intubado', 'neumonia', 'edad', 'nacionalidad', 'embarazo',
'habla_lengua_indig', 'indigena', 'diabetes', 'epoc', 'asma',
'inmusupr', 'hipertension', 'otra_com', 'cardiovascular', 'obesidad',
'renal_cronica', 'tabaquismo', 'otro_caso', 'toma_muestra_lab',
'resultado_lab', 'toma_muestra_antigeno', 'resultado_antigeno',
'clasificacion_final', 'migrante', 'pais_nacionalidad', 'pais_origen',
'uci'],
dtype='object')
El nombre de las columnas nos ayuda a identificar las categorías y posibles datos que contienen nuestra fuente de datos.
No todas las fuentes de datos nombran sus columnas de manera significativa. En el caso de nuestro ejemplo, es bastante sencillo identificar qué tipo de información contiene cada categoría o columna, incluso qué tipo de dato sería deseable que tuviese cada una.
Tipos de datos con dtypes()
#
covid_nacional.dtypes
Unnamed: 0 int64
fecha_actualizacion object
id_registro object
origen object
sector object
entidad_um object
sexo object
entidad_nac object
entidad_res object
municipio_res object
tipo_paciente object
fecha_ingreso object
fecha_sintomas object
fecha_def object
intubado object
neumonia object
edad int64
nacionalidad object
embarazo object
habla_lengua_indig object
indigena object
diabetes object
epoc object
asma object
inmusupr object
hipertension object
otra_com object
cardiovascular object
obesidad object
renal_cronica object
tabaquismo object
otro_caso object
toma_muestra_lab object
resultado_lab object
toma_muestra_antigeno object
resultado_antigeno object
clasificacion_final object
migrante object
pais_nacionalidad object
pais_origen object
uci object
dtype: object
La mayoría de los datos se encuentran representados como tipo object
, es decir, que son de tipo texto, numérico-textual o mixto.
Aunque hay columnas que podrían tener un tipo de dato datetime
, están representadas en tipo object
. Esas columnas deberán ser transformadas para poder hacer operaciones y visualizaciones.
Descripción de los datos con describe()
#
covid_nacional.describe()
Unnamed: 0 | edad | |
---|---|---|
count | 1.323501e+06 | 1.323501e+06 |
mean | 6.617510e+05 | 3.774596e+01 |
std | 3.820620e+05 | 1.728453e+01 |
min | 1.000000e+00 | 0.000000e+00 |
25% | 3.308760e+05 | 2.500000e+01 |
50% | 6.617510e+05 | 3.600000e+01 |
75% | 9.926260e+05 | 5.000000e+01 |
max | 1.323501e+06 | 1.220000e+02 |
De modo predeterminado, pandas
describe los datos numéricos int64
. De estos solamente nos sería útil edad
, pues Unnamed: 0
es un índice (valor nominal).
covid_nacional.describe(include='all')
Unnamed: 0 | fecha_actualizacion | id_registro | origen | sector | entidad_um | sexo | entidad_nac | entidad_res | municipio_res | ... | otro_caso | toma_muestra_lab | resultado_lab | toma_muestra_antigeno | resultado_antigeno | clasificacion_final | migrante | pais_nacionalidad | pais_origen | uci | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 1.323501e+06 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 149707 | 149707 | ... | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1320040 | 1323501 |
unique | NaN | 1 | 1323501 | 2 | 12 | 32 | 2 | 33 | 23 | 1190 | ... | 3 | 2 | 5 | 2 | 3 | 7 | 3 | 122 | 1 | 4 |
top | NaN | 2022-06-26 | 0793b8 | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | MUJER | CIUDAD DE MÉXICO | MÉXICO | NEZAHUALCÓYOTL | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | NO ESPECIFICADO | MÉXICO | NO APLICA | NO APLICA |
freq | NaN | 1323501 | 1 | 1170267 | 793606 | 1314661 | 733991 | 1052272 | 133374 | 26282 | ... | 848434 | 1152385 | 1152385 | 1204565 | 771647 | 792364 | 1305180 | 1304673 | 1320040 | 1297093 |
mean | 6.617510e+05 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
std | 3.820620e+05 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
min | 1.000000e+00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
25% | 3.308760e+05 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
50% | 6.617510e+05 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
75% | 9.926260e+05 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
max | 1.323501e+06 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
11 rows × 41 columns
El parámetro include='all'
obliga a realizar la operación en todas las columnas.
Esto permite identificar algunas columnas con ciertas frecuencias que podrían ser sujeto de análisis. Por ejemplo, correlaciones entre enfermedades crónicas y resultados (positivos o negativos), o frecuencias de casos de migrantes, mujeres o indígenas relacionadas con un área geográfica.
Debido a que esta fuente de datos no cuenta con información georeferenciada (contamos con los nombres de los municipios, pero no la información de latitud y longitud) será necesario utilizar una fuente de datos que permita agregar esa información.
Procesamiento de datos#
Manipulación de datos#
Aplicación del método .iloc
para localizar filas y columnas por índice:
covid_nacional.iloc[2:200, 1:3]
fecha_actualizacion | id_registro | |
---|---|---|
2 | 2022-06-26 | 11e31a |
3 | 2022-06-26 | 0741e4 |
4 | 2022-06-26 | 13c92b |
5 | 2022-06-26 | 04f190 |
6 | 2022-06-26 | 0a1655 |
... | ... | ... |
195 | 2022-06-26 | 485cdb |
196 | 2022-06-26 | 984dc6 |
197 | 2022-06-26 | 4b5708 |
198 | 2022-06-26 | bb8b5b |
199 | 2022-06-26 | cc68e2 |
198 rows × 2 columns
Aplicación del método .loc
para hallar celdas por coincidencias:
seleccion = covid_nacional.loc[(covid_nacional['sexo'] == 'MUJER') & (covid_nacional['migrante'] == 'SI')]
seleccion
Unnamed: 0 | fecha_actualizacion | id_registro | origen | sector | entidad_um | sexo | entidad_nac | entidad_res | municipio_res | ... | otro_caso | toma_muestra_lab | resultado_lab | toma_muestra_antigeno | resultado_antigeno | clasificacion_final | migrante | pais_nacionalidad | pais_origen | uci | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
252 | 253 | 2022-06-26 | b94888 | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | MUJER | NO ESPECIFICADO | NaN | NaN | ... | SI | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | SI | VENEZUELA | NaN | NO APLICA |
971 | 972 | 2022-06-26 | d22ed2 | USMER | SSA | CIUDAD DE MÉXICO | MUJER | NO ESPECIFICADO | NaN | NaN | ... | SI | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | SI | ESTADOS UNIDOS DE AMÉRICA | NaN | NO APLICA |
979 | 980 | 2022-06-26 | 6a5061 | USMER | SSA | CIUDAD DE MÉXICO | MUJER | NO ESPECIFICADO | NaN | NaN | ... | SI | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | SI | ESTADOS UNIDOS DE AMÉRICA | NaN | NO APLICA |
5877 | 5878 | 2022-06-26 | ac1990 | FUERA DE USMER | PRIVADA | CIUDAD DE MÉXICO | MUJER | NO ESPECIFICADO | NaN | NaN | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | SI | ESTADOS UNIDOS DE AMÉRICA | NaN | NO APLICA |
6666 | 6667 | 2022-06-26 | 8d5273 | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | MUJER | NO ESPECIFICADO | NaN | NaN | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | SI | CUBA | NaN | NO APLICA |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1298223 | 1298224 | 2022-06-26 | g16c3a9 | FUERA DE USMER | PRIVADA | CIUDAD DE MÉXICO | MUJER | NO ESPECIFICADO | NaN | NaN | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | SI | ITALIA | NaN | NO APLICA |
1305240 | 1305241 | 2022-06-26 | g154063 | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | MUJER | NO ESPECIFICADO | NaN | NaN | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | SI | EL SALVADOR | NaN | NO APLICA |
1305279 | 1305280 | 2022-06-26 | g1683fe | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | MUJER | NO ESPECIFICADO | NaN | NaN | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | SI | GUATEMALA | NaN | NO APLICA |
1316685 | 1316686 | 2022-06-26 | g0ebf9f | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | MUJER | NO ESPECIFICADO | NaN | NaN | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | SI | REPÚBLICA DE HONDURAS | NaN | NO APLICA |
1319864 | 1319865 | 2022-06-26 | g093480 | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | MUJER | NO ESPECIFICADO | NaN | NaN | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | SI | CHILE | NaN | NO APLICA |
1611 rows × 41 columns
Renombramos las columnas para poder realizar correctamente la unión entre dos dataframes:
covid_nacional.rename(columns={
"entidad_nac": "entidad_nacimiento",
"entidad_res": "entidad_residencia",
"municipio_res": "municipio_residencia"
}, inplace=True)
covid_nacional[7:10]
Unnamed: 0 | fecha_actualizacion | id_registro | origen | sector | entidad_um | sexo | entidad_nacimiento | entidad_residencia | municipio_residencia | ... | otro_caso | toma_muestra_lab | resultado_lab | toma_muestra_antigeno | resultado_antigeno | clasificacion_final | migrante | pais_nacionalidad | pais_origen | uci | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 8 | 2022-06-26 | 0ba73d | FUERA DE USMER | ISSSTE | CIUDAD DE MÉXICO | MUJER | QUERÉTARO | MÉXICO | NAUCALPAN DE JUÁREZ | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | NO | NO APLICA (CASO SIN MUESTRA) | CASO SOSPECHOSO | NO ESPECIFICADO | MÉXICO | NO APLICA | NO APLICA |
8 | 9 | 2022-06-26 | 0681f2 | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | HOMBRE | CIUDAD DE MÉXICO | NaN | NaN | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | NO ESPECIFICADO | MÉXICO | NO APLICA | NO APLICA |
9 | 10 | 2022-06-26 | 0a98b4 | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | MUJER | MICHOACÁN DE OCAMPO | NaN | NaN | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | SI | POSITIVO A SARS-COV-2 | CASO DE SARS-COV-2 CONFIRMADO | NO ESPECIFICADO | MÉXICO | NO APLICA | NO APLICA |
3 rows × 41 columns
Merge#
Nuevo conjunto de datos para realizar la combinación:
ruta_areas_inegi = '/content/drive/MyDrive/Colab Notebooks/curso_datos/AGEEML_2022842026272.csv'
areas_inegi = pd.read_csv(ruta_areas_inegi)
areas_inegi.head()
Mapa | Cve_Ent | Nom_Ent | Nom_Abr | Cve_Mun | Nom_Mun | Cve_Loc | Nom_Loc | Ámbito | Latitud | Longitud | Lat_Decimal | Lon_Decimal | Altitud | Cve_Carta | Pob_Total | Pob_Masculina | Pob_Femenina | Total De Viviendas Habitadas | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 10010001 | 1 | Aguascalientes | Ags. | 1 | Aguascalientes | 1 | Aguascalientes | U | 21°52´47.362N" | 102°17´45.768W" | 21.879823 | -102.296047 | 1878 | F13D19 | 863893 | 419168 | 444725 | 246259 |
1 | 10010094 | 1 | Aguascalientes | Ags. | 1 | Aguascalientes | 94 | Granja Adelita | R | 21°52´18.749N" | 102°22´24.710W" | 21.871875 | -102.373531 | 1901 | F13D18 | 5 | * | * | 2 |
2 | 10010096 | 1 | Aguascalientes | Ags. | 1 | Aguascalientes | 96 | Agua Azul | R | 21°53´01.522N" | 102°21´25.639W" | 21.883756 | -102.357122 | 1861 | F13D18 | 41 | 24 | 17 | 12 |
3 | 10010100 | 1 | Aguascalientes | Ags. | 1 | Aguascalientes | 100 | Rancho Alegre | R | 21°51´16.556N" | 102°22´21.884W" | 21.854599 | -102.372746 | 1879 | F13D18 | 0 | 0 | 0 | 0 |
4 | 10010102 | 1 | Aguascalientes | Ags. | 1 | Aguascalientes | 102 | Los Arbolitos [Rancho] | R | 21°46´48.650N" | 102°21´26.261W" | 21.780181 | -102.357295 | 1861 | F13D18 | 8 | * | * | 2 |
Pasos previos para el inner merge#
Para nuestros conjuntos de datos requiere un inner merge
para geolocalizar los datos. Pero para ello requeriremos realizar algunas tareas previas:
1. Renombrar columna para unión en el segundo dataframe#
areas_inegi.rename(
columns={'Nom_Mun':'municipio_residencia'}, # recordemos que cambiamos el nombre de la columna en el ejercicio anterior
inplace=True)
areas_inegi.head()
Mapa | Cve_Ent | Nom_Ent | Nom_Abr | Cve_Mun | municipio_residencia | Cve_Loc | Nom_Loc | Ámbito | Latitud | Longitud | Lat_Decimal | Lon_Decimal | Altitud | Cve_Carta | Pob_Total | Pob_Masculina | Pob_Femenina | Total De Viviendas Habitadas | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 10010001 | 1 | Aguascalientes | Ags. | 1 | Aguascalientes | 1 | Aguascalientes | U | 21°52´47.362N" | 102°17´45.768W" | 21.879823 | -102.296047 | 1878 | F13D19 | 863893 | 419168 | 444725 | 246259 |
1 | 10010094 | 1 | Aguascalientes | Ags. | 1 | Aguascalientes | 94 | Granja Adelita | R | 21°52´18.749N" | 102°22´24.710W" | 21.871875 | -102.373531 | 1901 | F13D18 | 5 | * | * | 2 |
2 | 10010096 | 1 | Aguascalientes | Ags. | 1 | Aguascalientes | 96 | Agua Azul | R | 21°53´01.522N" | 102°21´25.639W" | 21.883756 | -102.357122 | 1861 | F13D18 | 41 | 24 | 17 | 12 |
3 | 10010100 | 1 | Aguascalientes | Ags. | 1 | Aguascalientes | 100 | Rancho Alegre | R | 21°51´16.556N" | 102°22´21.884W" | 21.854599 | -102.372746 | 1879 | F13D18 | 0 | 0 | 0 | 0 |
4 | 10010102 | 1 | Aguascalientes | Ags. | 1 | Aguascalientes | 102 | Los Arbolitos [Rancho] | R | 21°46´48.650N" | 102°21´26.261W" | 21.780181 | -102.357295 | 1861 | F13D18 | 8 | * | * | 2 |
2. Normalizar la columna común#
covid_nacional['municipio_residencia'] = covid_nacional['municipio_residencia'].str.lower()
areas_inegi['municipio_residencia'] = areas_inegi['municipio_residencia'].str.lower()
3. Segmentación de la información#
areas_inegi_tm = areas_inegi.loc[areas_inegi['Cve_Loc'] == 1]
Realización del inner merge#
conjunto_datos = pd.merge(covid_nacional, areas_inegi_tm, how='inner', on='municipio_residencia')
print(conjunto_datos.shape)
conjunto_datos.head()
(158085, 59)
Unnamed: 0 | fecha_actualizacion | id_registro | origen | sector | entidad_um | sexo | entidad_nacimiento | entidad_residencia | municipio_residencia | ... | Latitud | Longitud | Lat_Decimal | Lon_Decimal | Altitud | Cve_Carta | Pob_Total | Pob_Masculina | Pob_Femenina | Total De Viviendas Habitadas | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 8 | 2022-06-26 | 0ba73d | FUERA DE USMER | ISSSTE | CIUDAD DE MÉXICO | MUJER | QUERÉTARO | MÉXICO | naucalpan de juárez | ... | 19°28´43.690N" | 099°13´59.585W" | 19.478803 | -99.233218 | 2280 | E14A39 | 776220 | 373698 | 402522 | 225509 |
1 | 143 | 2022-06-26 | 588e9b | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | MUJER | CIUDAD DE MÉXICO | MÉXICO | naucalpan de juárez | ... | 19°28´43.690N" | 099°13´59.585W" | 19.478803 | -99.233218 | 2280 | E14A39 | 776220 | 373698 | 402522 | 225509 |
2 | 154 | 2022-06-26 | 51860a | USMER | SSA | CIUDAD DE MÉXICO | HOMBRE | CIUDAD DE MÉXICO | MÉXICO | naucalpan de juárez | ... | 19°28´43.690N" | 099°13´59.585W" | 19.478803 | -99.233218 | 2280 | E14A39 | 776220 | 373698 | 402522 | 225509 |
3 | 912 | 2022-06-26 | de16a0 | USMER | SSA | CIUDAD DE MÉXICO | MUJER | CIUDAD DE MÉXICO | MÉXICO | naucalpan de juárez | ... | 19°28´43.690N" | 099°13´59.585W" | 19.478803 | -99.233218 | 2280 | E14A39 | 776220 | 373698 | 402522 | 225509 |
4 | 1032 | 2022-06-26 | 5f39e3 | USMER | SSA | CIUDAD DE MÉXICO | HOMBRE | GUANAJUATO | MÉXICO | naucalpan de juárez | ... | 19°28´43.690N" | 099°13´59.585W" | 19.478803 | -99.233218 | 2280 | E14A39 | 776220 | 373698 | 402522 | 225509 |
5 rows × 59 columns
Limpieza de datos#
Segmentación por columnas útiles#
muestra_covid = conjunto_datos[['sexo', 'edad', 'entidad_nacimiento', 'municipio_residencia', 'indigena', 'nacionalidad', 'migrante', 'pais_nacionalidad', 'fecha_ingreso', 'fecha_sintomas', 'fecha_def', 'municipio_residencia', 'Lat_Decimal', 'Lon_Decimal']]
muestra_covid.head()
sexo | edad | entidad_nacimiento | municipio_residencia | indigena | nacionalidad | migrante | pais_nacionalidad | fecha_ingreso | fecha_sintomas | fecha_def | municipio_residencia | Lat_Decimal | Lon_Decimal | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | MUJER | 75 | QUERÉTARO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-02-21 | 2022-02-16 | NaN | naucalpan de juárez | 19.478803 | -99.233218 |
1 | MUJER | 32 | CIUDAD DE MÉXICO | naucalpan de juárez | NO ESPECIFICADO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-01-07 | 2022-01-02 | NaN | naucalpan de juárez | 19.478803 | -99.233218 |
2 | HOMBRE | 30 | CIUDAD DE MÉXICO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-02-04 | 2022-02-03 | NaN | naucalpan de juárez | 19.478803 | -99.233218 |
3 | MUJER | 51 | CIUDAD DE MÉXICO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-01-01 | 2021-12-28 | NaN | naucalpan de juárez | 19.478803 | -99.233218 |
4 | HOMBRE | 83 | GUANAJUATO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-01-01 | 2021-12-30 | NaN | naucalpan de juárez | 19.478803 | -99.233218 |
Lidiar con datos nulos#
muestra_covid.fillna({'municipio_residencia': 'NO APLICA', 'pais_nacionalidad': 'NO APLICA'}, inplace=True)
muestra_covid
/usr/local/lib/python3.7/dist-packages/pandas/core/frame.py:5182: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
downcast=downcast,
/usr/local/lib/python3.7/dist-packages/pandas/core/generic.py:6392: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
return self._update_inplace(result)
sexo | edad | entidad_nacimiento | municipio_residencia | indigena | nacionalidad | migrante | pais_nacionalidad | fecha_ingreso | fecha_sintomas | fecha_def | municipio_residencia | Lat_Decimal | Lon_Decimal | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | MUJER | 75 | QUERÉTARO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-02-21 | 2022-02-16 | NaN | naucalpan de juárez | 19.478803 | -99.233218 |
1 | MUJER | 32 | CIUDAD DE MÉXICO | naucalpan de juárez | NO ESPECIFICADO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-01-07 | 2022-01-02 | NaN | naucalpan de juárez | 19.478803 | -99.233218 |
2 | HOMBRE | 30 | CIUDAD DE MÉXICO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-02-04 | 2022-02-03 | NaN | naucalpan de juárez | 19.478803 | -99.233218 |
3 | MUJER | 51 | CIUDAD DE MÉXICO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-01-01 | 2021-12-28 | NaN | naucalpan de juárez | 19.478803 | -99.233218 |
4 | HOMBRE | 83 | GUANAJUATO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-01-01 | 2021-12-30 | NaN | naucalpan de juárez | 19.478803 | -99.233218 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
158080 | HOMBRE | 12 | VERACRUZ DE IGNACIO DE LA LLAVE | amatlán de los reyes | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-06-23 | 2022-06-23 | NaN | amatlán de los reyes | 18.847578 | -96.915484 |
158081 | MUJER | 46 | CIUDAD DE MÉXICO | amatlán de los reyes | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-06-22 | 2022-06-19 | NaN | amatlán de los reyes | 18.847578 | -96.915484 |
158082 | MUJER | 59 | CIUDAD DE MÉXICO | general simón bolívar | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-06-23 | 2022-06-22 | NaN | general simón bolívar | 24.689074 | -103.225975 |
158083 | MUJER | 27 | MÉXICO | temozón | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-06-24 | 2022-06-22 | NaN | temozón | 20.803680 | -88.201158 |
158084 | MUJER | 32 | MÉXICO | izamal | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-06-24 | 2022-06-20 | NaN | izamal | 20.932998 | -89.019715 |
158085 rows × 14 columns
Transformar datos#
columnas = ['fecha_ingreso', 'fecha_sintomas', 'fecha_def']
for columna in columnas:
muestra_covid[columna] = pd.to_datetime(muestra_covid.loc[:, columna])
muestra_covid.dtypes
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:3: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
This is separate from the ipykernel package so we can avoid doing imports until
sexo object
edad int64
entidad_nacimiento object
municipio_residencia object
indigena object
nacionalidad object
migrante object
pais_nacionalidad object
fecha_ingreso datetime64[ns]
fecha_sintomas datetime64[ns]
fecha_def datetime64[ns]
municipio_residencia object
Lat_Decimal float64
Lon_Decimal float64
dtype: object
Georeferenciar los datos de pais_nacionalidad
#
# obtener librería pycountry
!pip install pycountry
import pycountry
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting pycountry
Downloading pycountry-22.3.5.tar.gz (10.1 MB)
|████████████████████████████████| 10.1 MB 25.6 MB/s
?25h Installing build dependencies ... ?25l?25hdone
Getting requirements to build wheel ... ?25l?25hdone
Preparing wheel metadata ... ?25l?25hdone
Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from pycountry) (57.4.0)
Building wheels for collected packages: pycountry
Building wheel for pycountry (PEP 517) ... ?25l?25hdone
Created wheel for pycountry: filename=pycountry-22.3.5-py2.py3-none-any.whl size=10681845 sha256=b33752378c0cefcf260b7f88dcdb7027d6691af7862ba5b8fcbb59b9832d4c66
Stored in directory: /root/.cache/pip/wheels/0e/06/e8/7ee176e95ea9a8a8c3b3afcb1869f20adbd42413d4611c6eb4
Successfully built pycountry
Installing collected packages: pycountry
Successfully installed pycountry-22.3.5
# Función para convertir los datos a iso en español
import gettext
def map_country_code(country_name, language, iso):
'''
country_name: str. El nombre del país en español.
language: str. El idioma en el que se desea obtener el código (p. ej: 'es').
iso: str. Opciones posibles: 'alpha_2' o 'alpha_3'.
'''
try:
if country_name is None:
return None
elif country_name == 'MÉXICO': # esta condición sintetiza el caso de México (reduce de 5 minutos a 6 segundos el tiempo de ejecución)
if iso == 'alpha_2':
return 'MX'
elif iso == 'alpha_3':
return 'MEX'
spanish = gettext.translation('iso3166', pycountry.LOCALES_DIR, languages=[language])
spanish.install()
_ = spanish.gettext
for english_country in pycountry.countries:
country_name = country_name.lower()
spanish_country = _(english_country.name).lower()
if spanish_country == country_name:
if iso == 'alpha_3':
return english_country.alpha_3
elif iso == 'alpha_2':
return english_country.alpha_2
except Exception as e:
raise
Conversión de los nombres a códigos alpha
muestra_covid['alpha3'] = muestra_covid['pais_nacionalidad'].apply(lambda x: map_country_code(x, 'es', 'alpha_3'))
muestra_covid['alpha2'] = muestra_covid['pais_nacionalidad'].apply(lambda x: map_country_code(x, 'es', 'alpha_2'))
muestra_covid.head()
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
"""Entry point for launching an IPython kernel.
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:2: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
sexo | edad | entidad_nacimiento | municipio_residencia | indigena | nacionalidad | migrante | pais_nacionalidad | fecha_ingreso | fecha_sintomas | fecha_def | municipio_residencia | Lat_Decimal | Lon_Decimal | alpha3 | alpha2 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | MUJER | 75 | QUERÉTARO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-02-21 | 2022-02-16 | NaT | naucalpan de juárez | 19.478803 | -99.233218 | MEX | MX |
1 | MUJER | 32 | CIUDAD DE MÉXICO | naucalpan de juárez | NO ESPECIFICADO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-01-07 | 2022-01-02 | NaT | naucalpan de juárez | 19.478803 | -99.233218 | MEX | MX |
2 | HOMBRE | 30 | CIUDAD DE MÉXICO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-02-04 | 2022-02-03 | NaT | naucalpan de juárez | 19.478803 | -99.233218 | MEX | MX |
3 | MUJER | 51 | CIUDAD DE MÉXICO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-01-01 | 2021-12-28 | NaT | naucalpan de juárez | 19.478803 | -99.233218 | MEX | MX |
4 | HOMBRE | 83 | GUANAJUATO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-01-01 | 2021-12-30 | NaT | naucalpan de juárez | 19.478803 | -99.233218 | MEX | MX |
Guardar a CSV#
ruta = '/content/drive/MyDrive/Colab Notebooks/curso_datos/covid_clean.csv'
muestra_covid.to_csv(ruta, index=False)
comprobación
pd.read_csv(ruta)
sexo | edad | entidad_nacimiento | municipio_residencia | indigena | nacionalidad | migrante | pais_nacionalidad | fecha_ingreso | fecha_sintomas | fecha_def | municipio_residencia.1 | Lat_Decimal | Lon_Decimal | alpha3 | alpha2 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | MUJER | 75 | QUERÉTARO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-02-21 | 2022-02-16 | NaN | naucalpan de juárez | 19.478803 | -99.233218 | MEX | MX |
1 | MUJER | 32 | CIUDAD DE MÉXICO | naucalpan de juárez | NO ESPECIFICADO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-01-07 | 2022-01-02 | NaN | naucalpan de juárez | 19.478803 | -99.233218 | MEX | MX |
2 | HOMBRE | 30 | CIUDAD DE MÉXICO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-02-04 | 2022-02-03 | NaN | naucalpan de juárez | 19.478803 | -99.233218 | MEX | MX |
3 | MUJER | 51 | CIUDAD DE MÉXICO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-01-01 | 2021-12-28 | NaN | naucalpan de juárez | 19.478803 | -99.233218 | MEX | MX |
4 | HOMBRE | 83 | GUANAJUATO | naucalpan de juárez | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-01-01 | 2021-12-30 | NaN | naucalpan de juárez | 19.478803 | -99.233218 | MEX | MX |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
158080 | HOMBRE | 12 | VERACRUZ DE IGNACIO DE LA LLAVE | amatlán de los reyes | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-06-23 | 2022-06-23 | NaN | amatlán de los reyes | 18.847578 | -96.915484 | MEX | MX |
158081 | MUJER | 46 | CIUDAD DE MÉXICO | amatlán de los reyes | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-06-22 | 2022-06-19 | NaN | amatlán de los reyes | 18.847578 | -96.915484 | MEX | MX |
158082 | MUJER | 59 | CIUDAD DE MÉXICO | general simón bolívar | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-06-23 | 2022-06-22 | NaN | general simón bolívar | 24.689074 | -103.225975 | MEX | MX |
158083 | MUJER | 27 | MÉXICO | temozón | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-06-24 | 2022-06-22 | NaN | temozón | 20.803680 | -88.201158 | MEX | MX |
158084 | MUJER | 32 | MÉXICO | izamal | NO | MEXICANA | NO ESPECIFICADO | MÉXICO | 2022-06-24 | 2022-06-20 | NaN | izamal | 20.932998 | -89.019715 | MEX | MX |
158085 rows × 16 columns