Para un proyecto que estoy trabajando se me ocurrió que necesitaría extraer todas las bases de datos de la ENOE. No quería pasarme una hora descargando bases de datos, por lo que me dediqué dos horas a hacer un script en python que las acomoda por mi.
Usaremos urllib.request para usar métodos de request que nos permita extraer los datos desde la página de INEGI y las cargue directamente en nuestro disco duro. Los enlaces en INEGI son muy consistentes, por lo que podremos crear una url base que cambiará con la base y el año, siempre y cuando no cambien las url en INEGI.
Primero cargamos los módulos que necesitaremos para hacer esta carga.
import pandas as pd
from urllib.request import urlopen
from zipfile import ZipFile
from io import BytesIOAhora haremos un ciclo for que pasará por los años que nos interesan y nos ayudarán a extraer las bases de datos. La ENOE sufrió cambios antes y después de la pandemia. Lo que verás como cambio es que ENOE N es la encuesta post pandemia. Este código importa los datos a partir del tercer trimestre de 2022. Recordemos que el primer trimestre aún fue con la versión anterior de la ENOE y el segundo se tomó la encuesta de manera telefónica (ETOE).
# Extract and download from ENOE_N (post-covid)
# Extraer los datos de la ENOE N
for year in range(2020,2023):
for trimestre in range(1,5):
url = "https://www.inegi.org.mx/contenidos/programas/enoe/15ymas/microdatos/enoe_n_"+str(year)+"_trim"+str(trimestre)+"_csv.zip"
try:
resp = urlopen(url)
zipfile = ZipFile(BytesIO(resp.read()))
zipfile.extractall("../data/ENOE_N")
except:
print("Oops, something went wrong while loading dataset of quarter " + str(trimestre)+ " in year " + str(year))
Puse una excepción para manejar el error de aquellos datos que no se encuentran aún disponibles. Esto hace que te genere un mensaje de error personalizado al cargar
En realidad, podríamos usar un if para diferenciar cuando es ENOE y cuándo es ENOE_N y así usar un sólo script. Como tenía que diferenciar a partir del año y el trimestre, me pareció más problema del necesario hacerlo así. Por eso repetí el código para extraer los datos desde 2010. El código no presentó errores más que en los trimestres 2 al 4 de 2020, como es de esperarse.
for year in range(2010,2021):
for trimestre in range(1,5):
url = "https://www.inegi.org.mx/contenidos/programas/enoe/15ymas/microdatos/"+str(year)+"trim"+str(trimestre)+"_csv.zip"
try:
resp = urlopen(url)
zipfile = ZipFile(BytesIO(resp.read()))
zipfile.extractall("../data/ENOE")
except:
print("Oops, something went wrong while loading dataset of quarter " + str(trimestre)+ " in year " + str(year))