Cargar la GEIH#
dd.geih.load() es la puerta de entrada a los microdatos: devuelve un DataFrame de pandas con una
fila por persona y mes, los módulos ya unidos y las variables armonizadas.
>>> import dane_data as dd
>>> df = dd.geih.load(2024, months=[1, 2, 3])
>>> df.shape
(213515, 51)
>>> df[["anio", "mes", "fex", "sexo", "edad", "condicion", "ingreso_laboral"]].head()
anio mes fex sexo edad condicion ingreso_laboral
0 2024 1 2540.569858 Hombre 39.0 Inactivo NaN
1 2024 1 2540.569858 Mujer 32.0 Ocupado 1160000.0
2 2024 1 2540.569858 Mujer 3.0 Fuera de la PET NaN
3 2024 1 2226.841958 Hombre 39.0 Ocupado 1600000.0
4 2024 1 2226.841958 Hombre 22.0 Ocupado 1500000.0
Las columnas en minúscula las crea dane-data y significan lo mismo en todos los años; las de
MAYÚSCULA son las originales del DANE.
Qué años y meses#
dd.geih.load(2025) # todos los meses descargados de 2025
dd.geih.load([2023, 2024], months=[1, 2, 3]) # primer trimestre de cada año
dd.geih.load(range(2015, 2020), months=12) # diciembre de cada año
dd.geih.load(2016, empalme=True) # serie de empalme
Qué variables#
Por defecto se leen las variables del DANE de dd.geih.CORE_RAW, las que hacen falta para armonizar. Hay
dos formas de cambiarlo:
columns: variables del DANE adicionalesPara usar una pregunta que no está en el núcleo, búsquela con
dd.buscar_variable()y pídala encolumns:>>> dd.describir("P6500") 'Antes de descuentos ¿cuánto ganó ... El mes pasado en este empleo?' >>> dd.describir("P7070") '¿cuánto recibio o ganó ... El mes pasado en ese segundo trabajo?' >>> df = dd.geih.load(2024, columns=["P6500", "P7070"])
columns="all"lee todas las variables de todos los módulos (cientos de columnas).variables: conservar solo algunas columnasRecorta cada mes antes de juntarlos, así que la memoria depende solo de lo que se conserva. Es la forma de juntar muchos años en un portátil:
df = dd.geih.load(range(2007, 2027), variables=["fex", "sexo", "edad", "ocupado", "ingreso_laboral"])
anioymesse conservan siempre. Una variable del DANE fuera del núcleo hay que pedirla en los dos lugares:columns=["P6500"], variables=["fex", "P6500"].
Como referencia, el primer trimestre de 2024 ocupa 66 MB con las variables por defecto y 7 MB con
variables=["fex", "sexo", "ocupado", "ingreso_laboral"].
Qué hace load por dentro#
Para cada mes:
Encuentra los archivos (
dd.geih.find_months()): reconoce el mes en el nombre de la carpeta, busca en subcarpetas, clasifica cada archivo por módulo y dominio y se queda con el total nacional (Cabecera + Resto).Une los módulos (
dd.geih.load_month()): parte de características generales (una fila por persona) y le agrega las columnas nuevas de los demás módulos con la llave de persona; vivienda se une con la llave de hogar. Detecta solo el separador, la codificación, la coma decimal y las celdas en blanco.Guarda el mes en caché como parquet en
~/.cache/dane_data/geih/. La siguiente lectura del mismo mes toma menos de un segundo.Armoniza (
dd.geih.harmonize()): agrega las variables en minúscula.Recorta las columnas si se pidió
variables.
Al final junta los meses. Las variables categóricas (sexo, zona, condicion…) tienen categorías
fijas (dd.geih.CATEGORIAS), así que siguen siendo categóricas después de juntar años distintos.
Meses incompletos#
Si a un mes le falta un módulo necesario para los indicadores laborales (por ejemplo, el de desocupados),
la tasa de desocupación de ese mes saldría 0 %. Por eso load omite los meses incompletos con un aviso:
Se omiten meses incompletos: Marzo 2024 (falta desocupados). Use incluir_incompletos=True para cargarlos.
Los meses omitidos quedan en df.attrs["meses_omitidos"], y dd.geih.available() muestra qué le falta a
cada mes. Para cargarlos de todas formas (por ejemplo, si solo necesita variables de características),
incluir_incompletos=True. También se omiten los meses cuyos archivos tienen los
defectos conocidos del ANDA.
La caché#
La caché de cada mes se invalida sola si cambia algún archivo del mes (tamaño o fecha), las columnas o
módulos pedidos, o la versión de la armonización. Nunca hace falta borrarla para tener resultados
correctos; dd.geih.clear_cache() sirve para liberar espacio. La carpeta se puede cambiar con la variable
de entorno XDG_CACHE_HOME.
Un mes, paso a paso#
Las piezas de load también son públicas, por si se necesita controlar cada paso:
>>> meses = dd.geih.find_months(2024)
>>> meses[0].anio, meses[0].mes, meses[0].modulos
(2024, 1, ['caracteristicas', 'fuerza', 'no_ocupados', 'ocupados', 'otras', 'vivienda'])
>>> crudo = dd.geih.load_month(meses[0]) # variables del DANE, sin armonizar
>>> crudo.shape
(70648, 29)
>>> df = dd.geih.harmonize(crudo) # + variables armonizadas