dane-data 0.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dane_data-0.2.1/LICENSE +21 -0
- dane_data-0.2.1/PKG-INFO +265 -0
- dane_data-0.2.1/README.md +234 -0
- dane_data-0.2.1/pyproject.toml +49 -0
- dane_data-0.2.1/setup.cfg +4 -0
- dane_data-0.2.1/src/dane_data/__init__.py +26 -0
- dane_data-0.2.1/src/dane_data/__main__.py +7 -0
- dane_data-0.2.1/src/dane_data/_hooks.py +24 -0
- dane_data-0.2.1/src/dane_data/_io.py +128 -0
- dane_data-0.2.1/src/dane_data/app/.streamlit/config.toml +8 -0
- dane_data-0.2.1/src/dane_data/app/Inicio.py +22 -0
- dane_data-0.2.1/src/dane_data/app/_ui.py +361 -0
- dane_data-0.2.1/src/dane_data/app/paginas/descargar.py +101 -0
- dane_data-0.2.1/src/dane_data/app/paginas/diccionario.py +62 -0
- dane_data-0.2.1/src/dane_data/app/paginas/eam_industria.py +129 -0
- dane_data-0.2.1/src/dane_data/app/paginas/eam_microdatos.py +56 -0
- dane_data-0.2.1/src/dane_data/app/paginas/geih_explorar.py +219 -0
- dane_data-0.2.1/src/dane_data/app/paginas/geih_mercado.py +152 -0
- dane_data-0.2.1/src/dane_data/app/paginas/inicio.py +79 -0
- dane_data-0.2.1/src/dane_data/cli.py +149 -0
- dane_data-0.2.1/src/dane_data/config.py +80 -0
- dane_data-0.2.1/src/dane_data/data/__init__.py +0 -0
- dane_data-0.2.1/src/dane_data/data/eam_diccionario.json +3235 -0
- dane_data-0.2.1/src/dane_data/data/geih_diccionario.json +8159 -0
- dane_data-0.2.1/src/dane_data/eam/__init__.py +49 -0
- dane_data-0.2.1/src/dane_data/eam/downloader.py +402 -0
- dane_data-0.2.1/src/dane_data/eam/indicadores.py +135 -0
- dane_data-0.2.1/src/dane_data/eam/loader.py +219 -0
- dane_data-0.2.1/src/dane_data/geih/__init__.py +62 -0
- dane_data-0.2.1/src/dane_data/geih/agregados.py +358 -0
- dane_data-0.2.1/src/dane_data/geih/downloader.py +676 -0
- dane_data-0.2.1/src/dane_data/geih/indicadores.py +82 -0
- dane_data-0.2.1/src/dane_data/geih/loader.py +600 -0
- dane_data-0.2.1/src/dane_data/referencias.py +79 -0
- dane_data-0.2.1/src/dane_data/stats.py +109 -0
- dane_data-0.2.1/src/dane_data.egg-info/PKG-INFO +265 -0
- dane_data-0.2.1/src/dane_data.egg-info/SOURCES.txt +43 -0
- dane_data-0.2.1/src/dane_data.egg-info/dependency_links.txt +1 -0
- dane_data-0.2.1/src/dane_data.egg-info/entry_points.txt +2 -0
- dane_data-0.2.1/src/dane_data.egg-info/requires.txt +12 -0
- dane_data-0.2.1/src/dane_data.egg-info/top_level.txt +1 -0
- dane_data-0.2.1/tests/test_app.py +83 -0
- dane_data-0.2.1/tests/test_downloader.py +209 -0
- dane_data-0.2.1/tests/test_eam_y_utilidades.py +133 -0
- dane_data-0.2.1/tests/test_geih.py +393 -0
dane_data-0.2.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Luis Ramirez
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
dane_data-0.2.1/PKG-INFO
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: dane-data
|
|
3
|
+
Version: 0.2.1
|
|
4
|
+
Summary: Descarga, carga y análisis de microdatos del DANE (GEIH y EAM) para estudiantes de economía.
|
|
5
|
+
Author: Luis Ramírez
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/IntegralIndefinida/DANE-data
|
|
8
|
+
Project-URL: Repository, https://github.com/IntegralIndefinida/DANE-data
|
|
9
|
+
Project-URL: Issues, https://github.com/IntegralIndefinida/DANE-data/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/IntegralIndefinida/DANE-data/releases
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Operating System :: OS Independent
|
|
13
|
+
Classifier: Natural Language :: Spanish
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Intended Audience :: Education
|
|
16
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
17
|
+
Requires-Python: >=3.10
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
License-File: LICENSE
|
|
20
|
+
Requires-Dist: requests>=2.28
|
|
21
|
+
Requires-Dist: beautifulsoup4>=4.11
|
|
22
|
+
Requires-Dist: pandas>=2.0
|
|
23
|
+
Requires-Dist: pyarrow>=12
|
|
24
|
+
Provides-Extra: app
|
|
25
|
+
Requires-Dist: streamlit>=1.40; extra == "app"
|
|
26
|
+
Requires-Dist: plotly>=5.18; extra == "app"
|
|
27
|
+
Requires-Dist: openpyxl>=3.1; extra == "app"
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: pytest>=7; extra == "dev"
|
|
30
|
+
Dynamic: license-file
|
|
31
|
+
|
|
32
|
+
# DANE-data 📊🇨🇴
|
|
33
|
+
|
|
34
|
+
**Microdatos del DANE listos para analizar** — Gran Encuesta Integrada de Hogares (**GEIH**, 2007–2026) y
|
|
35
|
+
Encuesta Anual Manufacturera (**EAM**, 1992–2024).
|
|
36
|
+
|
|
37
|
+
Dos formas de usarlo:
|
|
38
|
+
|
|
39
|
+
| | Para quién | Cómo |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| 🖱️ **Aplicación** | Estudiantes que empiezan, clases, consultas rápidas | `dane-data app` → se abre en el navegador |
|
|
42
|
+
| 🐍 **Librería Python** | Automatización, investigación, estudiantes avanzados | `import dane_data as dd` |
|
|
43
|
+
|
|
44
|
+
Ambas usan el mismo motor: descargan del ANDA del DANE, unen los módulos, **armonizan las variables
|
|
45
|
+
entre épocas** (nombres, separadores, coma decimal, factores de expansión, revisiones CIIU) y calculan
|
|
46
|
+
indicadores ponderados como lo hace el DANE.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Instalación de la app
|
|
51
|
+
|
|
52
|
+
1. En la página de **[Releases](https://github.com/IntegralIndefinida/DANE-data/releases)** descargue `dane-data-<versión>.zip` (en *Assets*).
|
|
53
|
+
2. Descomprímalo donde quiera.
|
|
54
|
+
3. Doble clic en el lanzador de su sistema:
|
|
55
|
+
|
|
56
|
+
| Sistema | Archivo |
|
|
57
|
+
|---|---|
|
|
58
|
+
| Windows | `Abrir dane-data (Windows).bat` |
|
|
59
|
+
| Mac | `Abrir dane-data (Mac).command` |
|
|
60
|
+
| Linux | `abrir-dane-data.sh` |
|
|
61
|
+
|
|
62
|
+
La primera vez necesita internet y tarda 1–3 minutos: el lanzador instala [uv](https://docs.astral.sh/uv/),
|
|
63
|
+
que descarga Python 3.12 y las librerías exactas de `uv.lock` dentro de la carpeta (`.venv/`), sin tocar el
|
|
64
|
+
resto del sistema. Las siguientes veces abre en segundos. **El navegador se abre solo**; para cerrar la
|
|
65
|
+
app basta cerrar la ventana de la terminal.
|
|
66
|
+
|
|
67
|
+
> Primera vez en **Windows**: si aparece "Windows protegió su PC" → *Más información* → *Ejecutar de todas
|
|
68
|
+
> formas*. En **Mac**: si dice "desarrollador no identificado" → clic derecho → *Abrir* → *Abrir*.
|
|
69
|
+
|
|
70
|
+
## Instalación con pip
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
pip install "dane-data[app]" # librería + aplicación
|
|
74
|
+
pip install dane-data # solo la librería
|
|
75
|
+
dane-data app
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Instalación para desarrollo
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git clone https://github.com/IntegralIndefinida/DANE-data
|
|
82
|
+
cd DANE-data
|
|
83
|
+
pip install -e ".[app]" # librería + aplicación
|
|
84
|
+
# pip install -e . # solo la librería
|
|
85
|
+
# o con uv: uv run --extra app dane-data app
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Requiere Python ≥ 3.10.
|
|
89
|
+
|
|
90
|
+
## 🖱️ La aplicación
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
dane-data app # o doble clic en el lanzador; el navegador se abre solo
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
| Página | Qué hace |
|
|
97
|
+
|---|---|
|
|
98
|
+
| 🏠 Inicio | Explica las encuestas, muestra qué datos hay y configura las carpetas |
|
|
99
|
+
| ⬇️ Descargar datos | Elige encuesta y años y descarga |
|
|
100
|
+
| 👥 Indicadores laborales | TD, TGP, TO, informalidad e ingresos, por sexo, edad, zona, educación o departamento; anual o mensual |
|
|
101
|
+
| 🔎 Tablas y microdatos | Tablas ponderadas a la medida, distribución de ingresos frente al salario mínimo, exportación |
|
|
102
|
+
| 🏭 Indicadores industriales | Producción, valor agregado, empleo, productividad y participación laboral por sector o departamento |
|
|
103
|
+
| 🧱 Panel y microdatos EAM | Panel de establecimientos (balanceado o no), supervivencia, exportación |
|
|
104
|
+
| 📚 Diccionario | Buscador de variables con las etiquetas y categorías oficiales del DANE |
|
|
105
|
+
|
|
106
|
+
Cada tabla se descarga en **CSV, Excel o Stata**, y cada página muestra el **código Python equivalente**:
|
|
107
|
+
así se pasa de la aplicación al notebook sin empezar de cero.
|
|
108
|
+
|
|
109
|
+
Para usarla en un aula (el profesor la sirve y los estudiantes entran desde la red local):
|
|
110
|
+
`dane-data app --address 0.0.0.0`.
|
|
111
|
+
|
|
112
|
+
## 🐍 La librería
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
import dane_data as dd
|
|
116
|
+
|
|
117
|
+
# 1. ¿Dónde están (o estarán) los datos? Se recuerda para siempre.
|
|
118
|
+
dd.set_paths(geih="~/datos/GEIH/data", eam="~/datos/EAM/data", save=True)
|
|
119
|
+
|
|
120
|
+
# 2. Descargar (incremental: lo ya bajado se salta)
|
|
121
|
+
dd.geih.download([2024, 2025])
|
|
122
|
+
dd.eam.download(range(2014, 2025))
|
|
123
|
+
|
|
124
|
+
# 3. Cargar: una persona por fila, módulos ya unidos y variables armonizadas
|
|
125
|
+
df = dd.geih.load(2025) # todos los meses
|
|
126
|
+
df = dd.geih.load([2024, 2025], months=[1, 2, 3]) # primer trimestre
|
|
127
|
+
df = dd.geih.load(2025, columns=["P6500", "P7070"]) # + variables DANE extra
|
|
128
|
+
df = dd.geih.load(2016, empalme=True) # serie de empalme (marco 2018)
|
|
129
|
+
df = dd.geih.load(range(2015, 2026), variables=["fex", "sexo", "ocupado"]) # solo esas columnas
|
|
130
|
+
|
|
131
|
+
# 4. Indicadores laborales ponderados
|
|
132
|
+
dd.geih.indicadores(df) # TGP, TO, TD, informalidad, ingresos…
|
|
133
|
+
dd.geih.indicadores(df, por=["sexo", "zona"])
|
|
134
|
+
dd.geih.indicadores(df, por="grupo_edad", anual=False) # mensual
|
|
135
|
+
dd.geih.serie_indicadores(range(2007, 2027), por="sexo") # precalculado por año, sin cargar microdatos
|
|
136
|
+
dd.geih.serie_indicadores(range(2015, 2027), filtros={"edad": (15, 28)}) # jóvenes
|
|
137
|
+
|
|
138
|
+
# 5. Tablas ponderadas de cualquier cosa
|
|
139
|
+
dd.tabla(df, por=["anio", "nivel_educativo"], estadistico="porcentaje")
|
|
140
|
+
dd.tabla(df[df.ocupado == 1], por="departamento", variable="ingreso_laboral", estadistico="mediana")
|
|
141
|
+
# lo mismo, año por año y guardado en caché (sirve para muchos años sin cargarlos en memoria)
|
|
142
|
+
dd.geih.serie_tabla(range(2007, 2027), por="departamento", variable="ingreso_laboral", estadistico="mediana",
|
|
143
|
+
poblacion="ocupado", filtros={"sexo": ["Mujer"]})
|
|
144
|
+
dd.geih.exportar(range(2015, 2026), "ocupados.csv", poblacion="ocupado") # CSV armonizado, mes a mes
|
|
145
|
+
|
|
146
|
+
# 6. EAM
|
|
147
|
+
eam = dd.eam.load(range(2012, 2025)) # un establecimiento-año por fila
|
|
148
|
+
dd.eam.resumen(eam, por=["anio", "sector"]) # VA, empleo, productividad, participación laboral
|
|
149
|
+
panel = dd.eam.panel(eam, balanceado=True) # índice (nordest, anio)
|
|
150
|
+
dd.eam.supervivencia(eam) # % de plantas que reaparecen cada año
|
|
151
|
+
dd.eam.deflactar(eam, ["valagri"], ipp_por_anio) # a precios constantes
|
|
152
|
+
|
|
153
|
+
# 7. Diccionario oficial
|
|
154
|
+
dd.buscar_variable("pensión")
|
|
155
|
+
dd.describir("P6920")
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
También en terminal:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
dane-data estado # rutas y años/meses disponibles
|
|
162
|
+
dane-data descargar geih --anios 2024 2025
|
|
163
|
+
dane-data descargar geih --anios 2016 --empalme
|
|
164
|
+
dane-data descargar eam --anios 2022 2023 2024
|
|
165
|
+
dane-data config --geih RUTA --empalme RUTA --eam RUTA
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Vea `examples/01_primeros_pasos.ipynb` para un recorrido completo.
|
|
169
|
+
|
|
170
|
+
### Variables armonizadas
|
|
171
|
+
|
|
172
|
+
Las variables en **minúscula** las crea `dane-data` y significan lo mismo en todos los años. Las de
|
|
173
|
+
**MAYÚSCULA** (GEIH) son las originales del DANE.
|
|
174
|
+
|
|
175
|
+
**GEIH**: `anio`, `mes`, `fex`, `sexo`, `edad`, `grupo_edad`, `dpto`, `departamento`, `zona`,
|
|
176
|
+
`condicion` (Ocupado / Desocupado / Inactivo / Fuera de la PET), `pet`, `fuerza_trabajo`, `ocupado`,
|
|
177
|
+
`desocupado`, `inactivo`, `formal`, `cotiza_pension`, `ingreso_laboral`, `smlv`, `ratio_smlv`,
|
|
178
|
+
`horas_semana`, `posicion_ocupacional`, `rama2d`, `rama_rev`, `nivel_educativo`, `jefe_hogar`.
|
|
179
|
+
|
|
180
|
+
**EAM**: todas las columnas en minúscula, más `anio`, `ciiu`, `ciiu_rev`, `division`, `sector`, `departamento`.
|
|
181
|
+
|
|
182
|
+
### Lo que `dane-data` resuelve por usted
|
|
183
|
+
|
|
184
|
+
| Problema en los archivos del DANE | Solución |
|
|
185
|
+
|---|---|
|
|
186
|
+
| 2007–2021: cada módulo partido en Área / Cabecera / Resto | Nacional = Cabecera + Resto (Área es un subconjunto de Cabecera) |
|
|
187
|
+
| Separadores `;` `,` `\t`, UTF-8 / Latin-1, coma decimal, blancos `" "` | Detección automática; columnas numéricas quedan numéricas |
|
|
188
|
+
| Factor de expansión `FEX_C_2011` / `FEX_C` / `FEX_C18` | Unificado en `fex` |
|
|
189
|
+
| Sexo en `P6020` o `P3271`, educación en `P6210` o `P3042`, rama en `RAMA2D` o `RAMA2D_R4` | Unificados fila a fila (sirve al juntar años de distintas épocas) |
|
|
190
|
+
| 2007 sin marcas `OCI`/`DSI`; 2020 y empalme con marcas en Características | La condición se deduce del módulo en que aparece cada persona |
|
|
191
|
+
| Archivos en subcarpetas (`CSV 13/No ocupados.CSV`) | Búsqueda recursiva |
|
|
192
|
+
| Meses a los que les falta un módulo | Se omiten con aviso (si no, el desempleo saldría 0 %); `incluir_incompletos=True` los carga |
|
|
193
|
+
| Varios meses juntos | Niveles = promedio mensual, como el DANE |
|
|
194
|
+
| EAM: `CIIU2N4`, `ciiu2`, `CIIU`, `ciiu3`, `ciiu4`, `ciiu_4`, códigos a 2–3 dígitos | `ciiu`, `ciiu_rev`, `division`, `sector` |
|
|
195
|
+
|
|
196
|
+
Las cargas de la GEIH se guardan en caché (`~/.cache/dane_data`, parquet): un año completo tarda ~6 s la
|
|
197
|
+
primera vez y ~1 s después. Los resultados de `dd.geih.serie_indicadores`, `serie_tabla` y
|
|
198
|
+
`serie_frecuencias` se calculan un año a la vez y se guardan por año: toda la serie 2007–2026 tarda alrededor
|
|
199
|
+
de un minuto la primera vez y es instantánea después. Se recalculan solos si cambia algún archivo del año,
|
|
200
|
+
la consulta (filtros, meses, variables) o el código de dane-data. Todas las tablas y gráficas de la app salen
|
|
201
|
+
de ahí, así que la app nunca tiene más de un año de microdatos en memoria. `dd.geih.clear_cache()` borra
|
|
202
|
+
estas cachés.
|
|
203
|
+
|
|
204
|
+
### Validación
|
|
205
|
+
|
|
206
|
+
Con los datos reales, TD, TGP, TO y ocupados de cada mes de 2007–2026 y del empalme 2010–2020 coinciden
|
|
207
|
+
con los anexos del DANE, con diferencias menores a 0,01 puntos. También coinciden las cabeceras y cada sexo
|
|
208
|
+
donde el DANE los publica por mes, y las tasas anuales, que son el promedio de los niveles mensuales. Por
|
|
209
|
+
ejemplo, la desocupación promedio fue 10,5 % en 2019 y 10,2 % en 2023. Las pruebas (`pytest`) usan datos
|
|
210
|
+
sintéticos con las rarezas de cada época. Si encuentran los datos reales, también los comparan mes a mes con
|
|
211
|
+
las cifras publicadas (`tests/datos/dane_publicado.csv`) y buscan huecos o saltos bruscos en la serie.
|
|
212
|
+
|
|
213
|
+
## ⚠️ Advertencias metodológicas
|
|
214
|
+
|
|
215
|
+
- **Informalidad**: `formal` = afiliado a salud (P6090) **y** cotizando a pensión (P6920). Es una
|
|
216
|
+
definición por seguridad social; la oficial del DANE incluye el tamaño de la empresa.
|
|
217
|
+
- **Serie principal vs. empalme**: para series largas 2010–2020 comparables con 2021+, use `empalme=True`.
|
|
218
|
+
- **PET**: desde 2022 son las personas de 15 años o más; antes, 12+ (urbano) y 10+ (rural).
|
|
219
|
+
- **Ingresos**: `INGLABO` en pesos corrientes; la GEIH 2007 no lo trae.
|
|
220
|
+
- **EAM**: los montos vienen en **miles de pesos corrientes**. Según los propios archivos, la CIIU es
|
|
221
|
+
Rev. 2 hasta 2000, Rev. 3 en 2001–2011 y Rev. 4 desde 2012 (la documentación del ANDA dice otra
|
|
222
|
+
cosa; vea la tabla de diferencias más abajo); los sectores no se comparan entre revisiones sin una
|
|
223
|
+
correlativa.
|
|
224
|
+
- **Muestras pequeñas**: con menos de ~100 observaciones (`n_muestra`) las cifras no son confiables.
|
|
225
|
+
- El salario mínimo histórico (`dd.SMLV`) está tomado de los decretos; verifíquelo antes de publicar.
|
|
226
|
+
|
|
227
|
+
## 📋 Diferencias con la documentación del DANE (ANDA)
|
|
228
|
+
|
|
229
|
+
Cuando los datos contradicen la documentación oficial del ANDA (diccionarios DDI, etiquetas de
|
|
230
|
+
categorías), `dane-data` sigue los datos y lo anota aquí. El buscador de variables
|
|
231
|
+
(`dd.buscar_variable`, `dd.describir` y la página 📚 Diccionario) muestra el DDI **tal como lo publica
|
|
232
|
+
el DANE**, así que en estos casos no coincide con las variables armonizadas.
|
|
233
|
+
|
|
234
|
+
| Variable | Qué dice el ANDA | Qué muestran los datos y qué hace `dane-data` |
|
|
235
|
+
|---|---|---|
|
|
236
|
+
| `P6430` → `posicion_ocupacional` (GEIH, desde 2022) | El DDI de 2022 (catálogo 771) y el de 2025 (catálogo 853) repiten las 9 categorías del cuestionario anterior: 7 = trabajador sin remuneración en negocios de otros hogares, 8 = jornalero o peón, 9 = otro. | Desde enero de 2022 el código 7 es **jornalero o peón** (100 % agropecuario y casi todos con ingreso), el 8 es **otro** y el 9 ya no aparece. Hasta 2021, y en el empalme, se usan las etiquetas anteriores, que sí coinciden con los datos. El código 6 se sigue llamando "familiar sin remuneración"; desde 2022 podría incluir también el trabajo sin remuneración en negocios de otros hogares (sin confirmar). |
|
|
237
|
+
| `ciiu` → `ciiu_rev`, `sector` (EAM 2000 y 2012) | La descripción del estudio (catálogos 491 a 888) dice que "en el año 2000 se incorpora en la EAM la CIIU Rev.3" y que la Rev. 4 se oficializó "con la difusión de las cifras referentes al año 2013". En otro pasaje del mismo texto los cambios de la Rev. 4 se ubican "a partir del año 2012". | El archivo de 2000 trae la variable `ciiu2` con códigos Rev. 2 (solo divisiones 31–39, igual que 1992–1999); la Rev. 3 aparece en 2001. El archivo de 2012 ya trae `ciiu4` con códigos Rev. 4 (divisiones 10–14, que no existen en la Rev. 3). `dane-data` asigna la revisión según la variable de cada año: Rev. 2 hasta 2000, Rev. 3 en 2001–2011 y Rev. 4 desde 2012. |
|
|
238
|
+
| Cobertura por división (EAM, archivos de 1995 en adelante) | La descripción de cada archivo dice que comprende "desde la división 11 a la 33 de la CIIU REV.4", también en los de 1995–2011. | Los archivos de 1995–2000 están en Rev. 2 (divisiones 31–39) y los de 2001–2011 en Rev. 3 (15–37). Los años en Rev. 4 incluyen la división 10, alimentos, que es el 18 % de los establecimientos en 2012–2024; el de 2012 incluye además las divisiones 58, 59 y 73. `dane-data` conserva todas las divisiones de cada archivo. |
|
|
239
|
+
| Títulos de los catálogos 871 y 888 (EAM) | El título de ambos catálogos en el DDI es "EAM_2022". | Sus archivos son de 2023 (871) y 2024 (888), como dice la versión de cada archivo. `dane-data` descarga 2023 del 871 y 2024 del 888. |
|
|
240
|
+
| `FEX_C_2011` → `fex` (GEIH 2008 y 2011, archivos CSV) | Los CSV de los catálogos 206 (2008) y 182 (2011) deberían traer el mismo factor de expansión que las versiones TXT y SPSS de esos catálogos. | Los CSV perdieron el punto decimal y traen puntos de miles: `849.491.032.387.525` es 84,9491032387525 en el TXT. Como la parte entera tiene de 1 a 5 dígitos, el valor no se puede recuperar del CSV. Algunos archivos traen además filas con un campo de más. Se confirmó persona por persona en marzo de 2011 contra el TXT. Para esos años `dane-data` descarga la versión TXT (tabulada) del mismo catálogo. Si en la carpeta solo están los CSV dañados, esos meses se omiten con un aviso para volver a descargarlos. |
|
|
241
|
+
| Septiembre de 2021 (GEIH, catálogo 701, `Septiembre.csv (2) (1).zip`) | Se publica como CSV. | Los archivos vienen separados por espacios, y el texto libre también tiene espacios, así que las columnas no se pueden separar. `dane-data` descarga ese mes en Stata (`Septiembre.zip`, del mismo catálogo). Si solo está el CSV, el mes se omite con un aviso para volver a descargarlo. |
|
|
242
|
+
| `PETI` → `pet` (empalme, octubre de 2012, catálogo 760) | Las cifras publicadas de la serie con proyecciones del CNPV 2018 usan la PET de 15 años o más en todos los meses. | El archivo de octubre de 2012 marca la PET con la definición anterior (12+ urbano, 10+ rural): la PET sube 9 % frente a septiembre y aparecen ~400 mil ocupados menores de 15 años. Con la PET del archivo, la TGP de ese mes saldría 64,5 % frente al 69,1 % publicado. `dane-data` aplica a todo el empalme la PET de 15 años o más (`harmonize(..., edad_minima_pet=15)`), lo que solo cambia octubre de 2012: así los 132 meses del empalme coinciden con el anexo del DANE. |
|
|
243
|
+
| `P6020` → `sexo` (empalme, abril y mayo de 2017, catálogo 763) | Las cifras mensuales por sexo del anexo (hoja "Total_nacional_IML_Sexo") suman el total nacional. | Son todos los hogares de Putumayo de esos meses (320 y 359 personas): solo traen edad y factor de expansión, y el resto de las características (sexo, parentesco, salud, educación) viene en blanco, también en las versiones Stata y SPSS del mismo ZIP. No se pueden recuperar: no están en ningún otro mes del empalme ni en la serie principal, y el catálogo de nuevos departamentos de 2017 (562) no tiene Mocoa en abril ni mayo (posiblemente por la avalancha del 31 de marzo; sin confirmar). `dane-data` deja `sexo` vacío para ellos: los totales coinciden con lo publicado, pero los ocupados de cada sexo quedan cerca de 0,1 % por debajo (unos 16 mil en total). |
|
|
244
|
+
|
|
245
|
+
## Estructura
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
src/dane_data/
|
|
249
|
+
├── config.py rutas (set_paths, variables de entorno, ~/.config/dane_data/config.json)
|
|
250
|
+
├── _io.py lectura robusta de CSV/TXT del DANE
|
|
251
|
+
├── stats.py tablas, medias y cuantiles ponderados
|
|
252
|
+
├── referencias.py SMLV, departamentos, diccionarios DDI (data/*.json)
|
|
253
|
+
├── geih/ downloader.py · loader.py · indicadores.py
|
|
254
|
+
├── eam/ downloader.py · loader.py · indicadores.py
|
|
255
|
+
├── cli.py comando `dane-data`
|
|
256
|
+
└── app/ aplicación Streamlit (Inicio.py + paginas/)
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Los descargadores provienen de los repositorios `GEIH` y `EAM` originales; se adaptaron para reportar
|
|
260
|
+
progreso y permitir cancelar.
|
|
261
|
+
|
|
262
|
+
## Licencia y cita
|
|
263
|
+
|
|
264
|
+
Código: MIT. Datos: DANE, Archivo Nacional de Datos (ANDA). Cite como
|
|
265
|
+
*DANE. Gran Encuesta Integrada de Hogares (GEIH) [microdatos]* / *Encuesta Anual Manufacturera (EAM) [microdatos]*.
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# DANE-data 📊🇨🇴
|
|
2
|
+
|
|
3
|
+
**Microdatos del DANE listos para analizar** — Gran Encuesta Integrada de Hogares (**GEIH**, 2007–2026) y
|
|
4
|
+
Encuesta Anual Manufacturera (**EAM**, 1992–2024).
|
|
5
|
+
|
|
6
|
+
Dos formas de usarlo:
|
|
7
|
+
|
|
8
|
+
| | Para quién | Cómo |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| 🖱️ **Aplicación** | Estudiantes que empiezan, clases, consultas rápidas | `dane-data app` → se abre en el navegador |
|
|
11
|
+
| 🐍 **Librería Python** | Automatización, investigación, estudiantes avanzados | `import dane_data as dd` |
|
|
12
|
+
|
|
13
|
+
Ambas usan el mismo motor: descargan del ANDA del DANE, unen los módulos, **armonizan las variables
|
|
14
|
+
entre épocas** (nombres, separadores, coma decimal, factores de expansión, revisiones CIIU) y calculan
|
|
15
|
+
indicadores ponderados como lo hace el DANE.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Instalación de la app
|
|
20
|
+
|
|
21
|
+
1. En la página de **[Releases](https://github.com/IntegralIndefinida/DANE-data/releases)** descargue `dane-data-<versión>.zip` (en *Assets*).
|
|
22
|
+
2. Descomprímalo donde quiera.
|
|
23
|
+
3. Doble clic en el lanzador de su sistema:
|
|
24
|
+
|
|
25
|
+
| Sistema | Archivo |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Windows | `Abrir dane-data (Windows).bat` |
|
|
28
|
+
| Mac | `Abrir dane-data (Mac).command` |
|
|
29
|
+
| Linux | `abrir-dane-data.sh` |
|
|
30
|
+
|
|
31
|
+
La primera vez necesita internet y tarda 1–3 minutos: el lanzador instala [uv](https://docs.astral.sh/uv/),
|
|
32
|
+
que descarga Python 3.12 y las librerías exactas de `uv.lock` dentro de la carpeta (`.venv/`), sin tocar el
|
|
33
|
+
resto del sistema. Las siguientes veces abre en segundos. **El navegador se abre solo**; para cerrar la
|
|
34
|
+
app basta cerrar la ventana de la terminal.
|
|
35
|
+
|
|
36
|
+
> Primera vez en **Windows**: si aparece "Windows protegió su PC" → *Más información* → *Ejecutar de todas
|
|
37
|
+
> formas*. En **Mac**: si dice "desarrollador no identificado" → clic derecho → *Abrir* → *Abrir*.
|
|
38
|
+
|
|
39
|
+
## Instalación con pip
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
pip install "dane-data[app]" # librería + aplicación
|
|
43
|
+
pip install dane-data # solo la librería
|
|
44
|
+
dane-data app
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Instalación para desarrollo
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
git clone https://github.com/IntegralIndefinida/DANE-data
|
|
51
|
+
cd DANE-data
|
|
52
|
+
pip install -e ".[app]" # librería + aplicación
|
|
53
|
+
# pip install -e . # solo la librería
|
|
54
|
+
# o con uv: uv run --extra app dane-data app
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Requiere Python ≥ 3.10.
|
|
58
|
+
|
|
59
|
+
## 🖱️ La aplicación
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
dane-data app # o doble clic en el lanzador; el navegador se abre solo
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
| Página | Qué hace |
|
|
66
|
+
|---|---|
|
|
67
|
+
| 🏠 Inicio | Explica las encuestas, muestra qué datos hay y configura las carpetas |
|
|
68
|
+
| ⬇️ Descargar datos | Elige encuesta y años y descarga |
|
|
69
|
+
| 👥 Indicadores laborales | TD, TGP, TO, informalidad e ingresos, por sexo, edad, zona, educación o departamento; anual o mensual |
|
|
70
|
+
| 🔎 Tablas y microdatos | Tablas ponderadas a la medida, distribución de ingresos frente al salario mínimo, exportación |
|
|
71
|
+
| 🏭 Indicadores industriales | Producción, valor agregado, empleo, productividad y participación laboral por sector o departamento |
|
|
72
|
+
| 🧱 Panel y microdatos EAM | Panel de establecimientos (balanceado o no), supervivencia, exportación |
|
|
73
|
+
| 📚 Diccionario | Buscador de variables con las etiquetas y categorías oficiales del DANE |
|
|
74
|
+
|
|
75
|
+
Cada tabla se descarga en **CSV, Excel o Stata**, y cada página muestra el **código Python equivalente**:
|
|
76
|
+
así se pasa de la aplicación al notebook sin empezar de cero.
|
|
77
|
+
|
|
78
|
+
Para usarla en un aula (el profesor la sirve y los estudiantes entran desde la red local):
|
|
79
|
+
`dane-data app --address 0.0.0.0`.
|
|
80
|
+
|
|
81
|
+
## 🐍 La librería
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
import dane_data as dd
|
|
85
|
+
|
|
86
|
+
# 1. ¿Dónde están (o estarán) los datos? Se recuerda para siempre.
|
|
87
|
+
dd.set_paths(geih="~/datos/GEIH/data", eam="~/datos/EAM/data", save=True)
|
|
88
|
+
|
|
89
|
+
# 2. Descargar (incremental: lo ya bajado se salta)
|
|
90
|
+
dd.geih.download([2024, 2025])
|
|
91
|
+
dd.eam.download(range(2014, 2025))
|
|
92
|
+
|
|
93
|
+
# 3. Cargar: una persona por fila, módulos ya unidos y variables armonizadas
|
|
94
|
+
df = dd.geih.load(2025) # todos los meses
|
|
95
|
+
df = dd.geih.load([2024, 2025], months=[1, 2, 3]) # primer trimestre
|
|
96
|
+
df = dd.geih.load(2025, columns=["P6500", "P7070"]) # + variables DANE extra
|
|
97
|
+
df = dd.geih.load(2016, empalme=True) # serie de empalme (marco 2018)
|
|
98
|
+
df = dd.geih.load(range(2015, 2026), variables=["fex", "sexo", "ocupado"]) # solo esas columnas
|
|
99
|
+
|
|
100
|
+
# 4. Indicadores laborales ponderados
|
|
101
|
+
dd.geih.indicadores(df) # TGP, TO, TD, informalidad, ingresos…
|
|
102
|
+
dd.geih.indicadores(df, por=["sexo", "zona"])
|
|
103
|
+
dd.geih.indicadores(df, por="grupo_edad", anual=False) # mensual
|
|
104
|
+
dd.geih.serie_indicadores(range(2007, 2027), por="sexo") # precalculado por año, sin cargar microdatos
|
|
105
|
+
dd.geih.serie_indicadores(range(2015, 2027), filtros={"edad": (15, 28)}) # jóvenes
|
|
106
|
+
|
|
107
|
+
# 5. Tablas ponderadas de cualquier cosa
|
|
108
|
+
dd.tabla(df, por=["anio", "nivel_educativo"], estadistico="porcentaje")
|
|
109
|
+
dd.tabla(df[df.ocupado == 1], por="departamento", variable="ingreso_laboral", estadistico="mediana")
|
|
110
|
+
# lo mismo, año por año y guardado en caché (sirve para muchos años sin cargarlos en memoria)
|
|
111
|
+
dd.geih.serie_tabla(range(2007, 2027), por="departamento", variable="ingreso_laboral", estadistico="mediana",
|
|
112
|
+
poblacion="ocupado", filtros={"sexo": ["Mujer"]})
|
|
113
|
+
dd.geih.exportar(range(2015, 2026), "ocupados.csv", poblacion="ocupado") # CSV armonizado, mes a mes
|
|
114
|
+
|
|
115
|
+
# 6. EAM
|
|
116
|
+
eam = dd.eam.load(range(2012, 2025)) # un establecimiento-año por fila
|
|
117
|
+
dd.eam.resumen(eam, por=["anio", "sector"]) # VA, empleo, productividad, participación laboral
|
|
118
|
+
panel = dd.eam.panel(eam, balanceado=True) # índice (nordest, anio)
|
|
119
|
+
dd.eam.supervivencia(eam) # % de plantas que reaparecen cada año
|
|
120
|
+
dd.eam.deflactar(eam, ["valagri"], ipp_por_anio) # a precios constantes
|
|
121
|
+
|
|
122
|
+
# 7. Diccionario oficial
|
|
123
|
+
dd.buscar_variable("pensión")
|
|
124
|
+
dd.describir("P6920")
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
También en terminal:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
dane-data estado # rutas y años/meses disponibles
|
|
131
|
+
dane-data descargar geih --anios 2024 2025
|
|
132
|
+
dane-data descargar geih --anios 2016 --empalme
|
|
133
|
+
dane-data descargar eam --anios 2022 2023 2024
|
|
134
|
+
dane-data config --geih RUTA --empalme RUTA --eam RUTA
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Vea `examples/01_primeros_pasos.ipynb` para un recorrido completo.
|
|
138
|
+
|
|
139
|
+
### Variables armonizadas
|
|
140
|
+
|
|
141
|
+
Las variables en **minúscula** las crea `dane-data` y significan lo mismo en todos los años. Las de
|
|
142
|
+
**MAYÚSCULA** (GEIH) son las originales del DANE.
|
|
143
|
+
|
|
144
|
+
**GEIH**: `anio`, `mes`, `fex`, `sexo`, `edad`, `grupo_edad`, `dpto`, `departamento`, `zona`,
|
|
145
|
+
`condicion` (Ocupado / Desocupado / Inactivo / Fuera de la PET), `pet`, `fuerza_trabajo`, `ocupado`,
|
|
146
|
+
`desocupado`, `inactivo`, `formal`, `cotiza_pension`, `ingreso_laboral`, `smlv`, `ratio_smlv`,
|
|
147
|
+
`horas_semana`, `posicion_ocupacional`, `rama2d`, `rama_rev`, `nivel_educativo`, `jefe_hogar`.
|
|
148
|
+
|
|
149
|
+
**EAM**: todas las columnas en minúscula, más `anio`, `ciiu`, `ciiu_rev`, `division`, `sector`, `departamento`.
|
|
150
|
+
|
|
151
|
+
### Lo que `dane-data` resuelve por usted
|
|
152
|
+
|
|
153
|
+
| Problema en los archivos del DANE | Solución |
|
|
154
|
+
|---|---|
|
|
155
|
+
| 2007–2021: cada módulo partido en Área / Cabecera / Resto | Nacional = Cabecera + Resto (Área es un subconjunto de Cabecera) |
|
|
156
|
+
| Separadores `;` `,` `\t`, UTF-8 / Latin-1, coma decimal, blancos `" "` | Detección automática; columnas numéricas quedan numéricas |
|
|
157
|
+
| Factor de expansión `FEX_C_2011` / `FEX_C` / `FEX_C18` | Unificado en `fex` |
|
|
158
|
+
| Sexo en `P6020` o `P3271`, educación en `P6210` o `P3042`, rama en `RAMA2D` o `RAMA2D_R4` | Unificados fila a fila (sirve al juntar años de distintas épocas) |
|
|
159
|
+
| 2007 sin marcas `OCI`/`DSI`; 2020 y empalme con marcas en Características | La condición se deduce del módulo en que aparece cada persona |
|
|
160
|
+
| Archivos en subcarpetas (`CSV 13/No ocupados.CSV`) | Búsqueda recursiva |
|
|
161
|
+
| Meses a los que les falta un módulo | Se omiten con aviso (si no, el desempleo saldría 0 %); `incluir_incompletos=True` los carga |
|
|
162
|
+
| Varios meses juntos | Niveles = promedio mensual, como el DANE |
|
|
163
|
+
| EAM: `CIIU2N4`, `ciiu2`, `CIIU`, `ciiu3`, `ciiu4`, `ciiu_4`, códigos a 2–3 dígitos | `ciiu`, `ciiu_rev`, `division`, `sector` |
|
|
164
|
+
|
|
165
|
+
Las cargas de la GEIH se guardan en caché (`~/.cache/dane_data`, parquet): un año completo tarda ~6 s la
|
|
166
|
+
primera vez y ~1 s después. Los resultados de `dd.geih.serie_indicadores`, `serie_tabla` y
|
|
167
|
+
`serie_frecuencias` se calculan un año a la vez y se guardan por año: toda la serie 2007–2026 tarda alrededor
|
|
168
|
+
de un minuto la primera vez y es instantánea después. Se recalculan solos si cambia algún archivo del año,
|
|
169
|
+
la consulta (filtros, meses, variables) o el código de dane-data. Todas las tablas y gráficas de la app salen
|
|
170
|
+
de ahí, así que la app nunca tiene más de un año de microdatos en memoria. `dd.geih.clear_cache()` borra
|
|
171
|
+
estas cachés.
|
|
172
|
+
|
|
173
|
+
### Validación
|
|
174
|
+
|
|
175
|
+
Con los datos reales, TD, TGP, TO y ocupados de cada mes de 2007–2026 y del empalme 2010–2020 coinciden
|
|
176
|
+
con los anexos del DANE, con diferencias menores a 0,01 puntos. También coinciden las cabeceras y cada sexo
|
|
177
|
+
donde el DANE los publica por mes, y las tasas anuales, que son el promedio de los niveles mensuales. Por
|
|
178
|
+
ejemplo, la desocupación promedio fue 10,5 % en 2019 y 10,2 % en 2023. Las pruebas (`pytest`) usan datos
|
|
179
|
+
sintéticos con las rarezas de cada época. Si encuentran los datos reales, también los comparan mes a mes con
|
|
180
|
+
las cifras publicadas (`tests/datos/dane_publicado.csv`) y buscan huecos o saltos bruscos en la serie.
|
|
181
|
+
|
|
182
|
+
## ⚠️ Advertencias metodológicas
|
|
183
|
+
|
|
184
|
+
- **Informalidad**: `formal` = afiliado a salud (P6090) **y** cotizando a pensión (P6920). Es una
|
|
185
|
+
definición por seguridad social; la oficial del DANE incluye el tamaño de la empresa.
|
|
186
|
+
- **Serie principal vs. empalme**: para series largas 2010–2020 comparables con 2021+, use `empalme=True`.
|
|
187
|
+
- **PET**: desde 2022 son las personas de 15 años o más; antes, 12+ (urbano) y 10+ (rural).
|
|
188
|
+
- **Ingresos**: `INGLABO` en pesos corrientes; la GEIH 2007 no lo trae.
|
|
189
|
+
- **EAM**: los montos vienen en **miles de pesos corrientes**. Según los propios archivos, la CIIU es
|
|
190
|
+
Rev. 2 hasta 2000, Rev. 3 en 2001–2011 y Rev. 4 desde 2012 (la documentación del ANDA dice otra
|
|
191
|
+
cosa; vea la tabla de diferencias más abajo); los sectores no se comparan entre revisiones sin una
|
|
192
|
+
correlativa.
|
|
193
|
+
- **Muestras pequeñas**: con menos de ~100 observaciones (`n_muestra`) las cifras no son confiables.
|
|
194
|
+
- El salario mínimo histórico (`dd.SMLV`) está tomado de los decretos; verifíquelo antes de publicar.
|
|
195
|
+
|
|
196
|
+
## 📋 Diferencias con la documentación del DANE (ANDA)
|
|
197
|
+
|
|
198
|
+
Cuando los datos contradicen la documentación oficial del ANDA (diccionarios DDI, etiquetas de
|
|
199
|
+
categorías), `dane-data` sigue los datos y lo anota aquí. El buscador de variables
|
|
200
|
+
(`dd.buscar_variable`, `dd.describir` y la página 📚 Diccionario) muestra el DDI **tal como lo publica
|
|
201
|
+
el DANE**, así que en estos casos no coincide con las variables armonizadas.
|
|
202
|
+
|
|
203
|
+
| Variable | Qué dice el ANDA | Qué muestran los datos y qué hace `dane-data` |
|
|
204
|
+
|---|---|---|
|
|
205
|
+
| `P6430` → `posicion_ocupacional` (GEIH, desde 2022) | El DDI de 2022 (catálogo 771) y el de 2025 (catálogo 853) repiten las 9 categorías del cuestionario anterior: 7 = trabajador sin remuneración en negocios de otros hogares, 8 = jornalero o peón, 9 = otro. | Desde enero de 2022 el código 7 es **jornalero o peón** (100 % agropecuario y casi todos con ingreso), el 8 es **otro** y el 9 ya no aparece. Hasta 2021, y en el empalme, se usan las etiquetas anteriores, que sí coinciden con los datos. El código 6 se sigue llamando "familiar sin remuneración"; desde 2022 podría incluir también el trabajo sin remuneración en negocios de otros hogares (sin confirmar). |
|
|
206
|
+
| `ciiu` → `ciiu_rev`, `sector` (EAM 2000 y 2012) | La descripción del estudio (catálogos 491 a 888) dice que "en el año 2000 se incorpora en la EAM la CIIU Rev.3" y que la Rev. 4 se oficializó "con la difusión de las cifras referentes al año 2013". En otro pasaje del mismo texto los cambios de la Rev. 4 se ubican "a partir del año 2012". | El archivo de 2000 trae la variable `ciiu2` con códigos Rev. 2 (solo divisiones 31–39, igual que 1992–1999); la Rev. 3 aparece en 2001. El archivo de 2012 ya trae `ciiu4` con códigos Rev. 4 (divisiones 10–14, que no existen en la Rev. 3). `dane-data` asigna la revisión según la variable de cada año: Rev. 2 hasta 2000, Rev. 3 en 2001–2011 y Rev. 4 desde 2012. |
|
|
207
|
+
| Cobertura por división (EAM, archivos de 1995 en adelante) | La descripción de cada archivo dice que comprende "desde la división 11 a la 33 de la CIIU REV.4", también en los de 1995–2011. | Los archivos de 1995–2000 están en Rev. 2 (divisiones 31–39) y los de 2001–2011 en Rev. 3 (15–37). Los años en Rev. 4 incluyen la división 10, alimentos, que es el 18 % de los establecimientos en 2012–2024; el de 2012 incluye además las divisiones 58, 59 y 73. `dane-data` conserva todas las divisiones de cada archivo. |
|
|
208
|
+
| Títulos de los catálogos 871 y 888 (EAM) | El título de ambos catálogos en el DDI es "EAM_2022". | Sus archivos son de 2023 (871) y 2024 (888), como dice la versión de cada archivo. `dane-data` descarga 2023 del 871 y 2024 del 888. |
|
|
209
|
+
| `FEX_C_2011` → `fex` (GEIH 2008 y 2011, archivos CSV) | Los CSV de los catálogos 206 (2008) y 182 (2011) deberían traer el mismo factor de expansión que las versiones TXT y SPSS de esos catálogos. | Los CSV perdieron el punto decimal y traen puntos de miles: `849.491.032.387.525` es 84,9491032387525 en el TXT. Como la parte entera tiene de 1 a 5 dígitos, el valor no se puede recuperar del CSV. Algunos archivos traen además filas con un campo de más. Se confirmó persona por persona en marzo de 2011 contra el TXT. Para esos años `dane-data` descarga la versión TXT (tabulada) del mismo catálogo. Si en la carpeta solo están los CSV dañados, esos meses se omiten con un aviso para volver a descargarlos. |
|
|
210
|
+
| Septiembre de 2021 (GEIH, catálogo 701, `Septiembre.csv (2) (1).zip`) | Se publica como CSV. | Los archivos vienen separados por espacios, y el texto libre también tiene espacios, así que las columnas no se pueden separar. `dane-data` descarga ese mes en Stata (`Septiembre.zip`, del mismo catálogo). Si solo está el CSV, el mes se omite con un aviso para volver a descargarlo. |
|
|
211
|
+
| `PETI` → `pet` (empalme, octubre de 2012, catálogo 760) | Las cifras publicadas de la serie con proyecciones del CNPV 2018 usan la PET de 15 años o más en todos los meses. | El archivo de octubre de 2012 marca la PET con la definición anterior (12+ urbano, 10+ rural): la PET sube 9 % frente a septiembre y aparecen ~400 mil ocupados menores de 15 años. Con la PET del archivo, la TGP de ese mes saldría 64,5 % frente al 69,1 % publicado. `dane-data` aplica a todo el empalme la PET de 15 años o más (`harmonize(..., edad_minima_pet=15)`), lo que solo cambia octubre de 2012: así los 132 meses del empalme coinciden con el anexo del DANE. |
|
|
212
|
+
| `P6020` → `sexo` (empalme, abril y mayo de 2017, catálogo 763) | Las cifras mensuales por sexo del anexo (hoja "Total_nacional_IML_Sexo") suman el total nacional. | Son todos los hogares de Putumayo de esos meses (320 y 359 personas): solo traen edad y factor de expansión, y el resto de las características (sexo, parentesco, salud, educación) viene en blanco, también en las versiones Stata y SPSS del mismo ZIP. No se pueden recuperar: no están en ningún otro mes del empalme ni en la serie principal, y el catálogo de nuevos departamentos de 2017 (562) no tiene Mocoa en abril ni mayo (posiblemente por la avalancha del 31 de marzo; sin confirmar). `dane-data` deja `sexo` vacío para ellos: los totales coinciden con lo publicado, pero los ocupados de cada sexo quedan cerca de 0,1 % por debajo (unos 16 mil en total). |
|
|
213
|
+
|
|
214
|
+
## Estructura
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
src/dane_data/
|
|
218
|
+
├── config.py rutas (set_paths, variables de entorno, ~/.config/dane_data/config.json)
|
|
219
|
+
├── _io.py lectura robusta de CSV/TXT del DANE
|
|
220
|
+
├── stats.py tablas, medias y cuantiles ponderados
|
|
221
|
+
├── referencias.py SMLV, departamentos, diccionarios DDI (data/*.json)
|
|
222
|
+
├── geih/ downloader.py · loader.py · indicadores.py
|
|
223
|
+
├── eam/ downloader.py · loader.py · indicadores.py
|
|
224
|
+
├── cli.py comando `dane-data`
|
|
225
|
+
└── app/ aplicación Streamlit (Inicio.py + paginas/)
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Los descargadores provienen de los repositorios `GEIH` y `EAM` originales; se adaptaron para reportar
|
|
229
|
+
progreso y permitir cancelar.
|
|
230
|
+
|
|
231
|
+
## Licencia y cita
|
|
232
|
+
|
|
233
|
+
Código: MIT. Datos: DANE, Archivo Nacional de Datos (ANDA). Cite como
|
|
234
|
+
*DANE. Gran Encuesta Integrada de Hogares (GEIH) [microdatos]* / *Encuesta Anual Manufacturera (EAM) [microdatos]*.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "dane-data"
|
|
7
|
+
version = "0.2.1"
|
|
8
|
+
description = "Descarga, carga y análisis de microdatos del DANE (GEIH y EAM) para estudiantes de economía."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
license-files = ["LICENSE"]
|
|
12
|
+
requires-python = ">=3.10"
|
|
13
|
+
authors = [{ name = "Luis Ramírez" }]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Operating System :: OS Independent",
|
|
17
|
+
"Natural Language :: Spanish",
|
|
18
|
+
"Intended Audience :: Science/Research",
|
|
19
|
+
"Intended Audience :: Education",
|
|
20
|
+
"Topic :: Scientific/Engineering :: Information Analysis",
|
|
21
|
+
]
|
|
22
|
+
dependencies = [
|
|
23
|
+
"requests>=2.28",
|
|
24
|
+
"beautifulsoup4>=4.11",
|
|
25
|
+
"pandas>=2.0",
|
|
26
|
+
"pyarrow>=12",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
[project.urls]
|
|
30
|
+
Homepage = "https://github.com/IntegralIndefinida/DANE-data"
|
|
31
|
+
Repository = "https://github.com/IntegralIndefinida/DANE-data"
|
|
32
|
+
Issues = "https://github.com/IntegralIndefinida/DANE-data/issues"
|
|
33
|
+
Changelog = "https://github.com/IntegralIndefinida/DANE-data/releases"
|
|
34
|
+
|
|
35
|
+
[project.optional-dependencies]
|
|
36
|
+
app = ["streamlit>=1.40", "plotly>=5.18", "openpyxl>=3.1"]
|
|
37
|
+
dev = ["pytest>=7"]
|
|
38
|
+
|
|
39
|
+
[project.scripts]
|
|
40
|
+
dane-data = "dane_data.cli:main"
|
|
41
|
+
|
|
42
|
+
[tool.setuptools.packages.find]
|
|
43
|
+
where = ["src"]
|
|
44
|
+
|
|
45
|
+
[tool.setuptools.package-data]
|
|
46
|
+
dane_data = ["data/*.json", "app/*.py", "app/paginas/*.py", "app/.streamlit/*.toml"]
|
|
47
|
+
|
|
48
|
+
[tool.pytest.ini_options]
|
|
49
|
+
testpaths = ["tests"]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""
|
|
2
|
+
dane-data — microdatos del DANE (GEIH y EAM) listos para analizar.
|
|
3
|
+
|
|
4
|
+
import dane_data as dd
|
|
5
|
+
dd.set_paths(geih="~/datos/GEIH/data", eam="~/datos/EAM/data", save=True)
|
|
6
|
+
|
|
7
|
+
df = dd.geih.load(2025, months=[1, 2, 3])
|
|
8
|
+
dd.geih.indicadores(df, por="sexo")
|
|
9
|
+
|
|
10
|
+
eam = dd.eam.load(range(2015, 2025))
|
|
11
|
+
dd.eam.resumen(eam, por=["anio", "division"])
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from . import eam, geih
|
|
15
|
+
from ._hooks import DownloadCancelled
|
|
16
|
+
from .config import get_path, set_paths, show_paths
|
|
17
|
+
from .referencias import DEPARTAMENTOS, MESES, SMLV, buscar_variable, describir, diccionario
|
|
18
|
+
from .stats import tabla, weighted_mean, weighted_quantile
|
|
19
|
+
|
|
20
|
+
__version__ = "0.2.1"
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"geih", "eam", "set_paths", "get_path", "show_paths", "tabla", "weighted_mean",
|
|
24
|
+
"weighted_quantile", "buscar_variable", "describir", "diccionario", "SMLV",
|
|
25
|
+
"DEPARTAMENTOS", "MESES", "DownloadCancelled",
|
|
26
|
+
]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Ganchos de progreso y cancelación compartidos por los descargadores."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Callable, Optional
|
|
6
|
+
|
|
7
|
+
ProgressFn = Callable[[Optional[float], str], None]
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class DownloadCancelled(Exception):
|
|
11
|
+
"""El usuario pidió detener la descarga."""
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ProgressMixin:
|
|
15
|
+
progress: ProgressFn | None = None
|
|
16
|
+
should_stop: Callable[[], bool] | None = None
|
|
17
|
+
|
|
18
|
+
def _emit(self, fraction: float | None, message: str) -> None:
|
|
19
|
+
if self.progress is not None:
|
|
20
|
+
self.progress(fraction, message)
|
|
21
|
+
|
|
22
|
+
def _check_stop(self) -> None:
|
|
23
|
+
if self.should_stop is not None and self.should_stop():
|
|
24
|
+
raise DownloadCancelled("Descarga cancelada por el usuario.")
|