Metadata-Version: 2.4
Name: tejo
Version: 0.3.0
Summary: Armonización estadística de series territoriales ante cambios de malla geográfica (beta: UPZ→UPL, Bogotá D.C.)
Author-email: Luz Adriana Gutiérrez Rodríguez <adrig63@gmail.com>
License: MIT
Project-URL: Homepage, https://github.com/adriGr52/tejo
Project-URL: Repository, https://github.com/adriGr52/tejo
Project-URL: Issues, https://github.com/adriGr52/tejo/issues
Keywords: areal interpolation,crosswalk,dasymetric,GIS,Bogota,UPZ,UPL
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: MIT License
Classifier: Natural Language :: Spanish
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering :: GIS
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: geopandas>=0.14
Requires-Dist: shapely>=2.0
Requires-Dist: pandas>=2.0
Requires-Dist: numpy>=1.24
Requires-Dist: pyproj>=3.5
Provides-Extra: dev
Requires-Dist: pytest>=7; extra == "dev"
Dynamic: license-file

# tejo

Armonización estadística de series territoriales ante cambios de malla geográfica.
**Beta**: transición UPZ → UPL de Bogotá D.C. (POT, Decreto 555 de 2021). Motor genérico
fuente → destino, aplicable a cualquier cambio de límites (marcos censales DANE, DIVIPOL,
figuras de otros POT).

## Qué garantiza v0.0.1 (verificado en `tests/`)

1. **Pycnofilaxis**: los ponderadores w_ij son no negativos y suman 1 por fuente
   (conservación de masa), con registro explícito de cobertura y slivers.
2. **Exactitud bajo anidamiento**: si el destino es unión exacta de fuentes, la
   interpolación extensiva es exacta para cualquier método (test contra verdad analítica).
3. **Dasimétrico exacto para variables proporcionales al ancilar**, y dominante sobre el
   baseline de área en variables correlacionadas con él.
4. **Tasas jamás se interpolan directamente**: la API exige (numerador, denominador),
   devuelve ambos componentes y da NaN (no infinito) ante denominadores cero.
5. **Intensivas** como media ponderada por masa declarada (sin promedios silenciosos).
6. **Sin magia**: nada de reproyección silenciosa, imputación silenciosa ni fallbacks
   ocultos; toda decisión queda en metadatos y advertencias.

## Uso mínimo

```python
import geopandas as gpd
from tejo import build_crosswalk, apply_crosswalk

upz = gpd.read_file("upz.shp").to_crs("EPSG:9377")
upl = gpd.read_file("upl.shp").to_crs("EPSG:9377")
mz  = gpd.read_file("manzanas.shp").to_crs("EPSG:9377")   # con población CNPV

cw = build_crosswalk(upz, upl, "COD_UPZ", "COD_UPL",
                     method="dasymetric", ancillary=mz, ancillary_mass="PERSONAS")

serie_upl = apply_crosswalk(
    cw, serie_upz,
    extensive=["nacimientos", "poblacion"],
    rates=[("tasa_fecundidad", "nacimientos", "poblacion")],
)
```

## Lo que v0 NO hace todavía (roadmap)

- **v0.2**: incertidumbre — bootstrap sobre microdatos y calibración empírica de
  intervalos desde el banco de validación; benchmark de tasas e intensivas.
- **v0.3**: gemelo en R (misma especificación de crosswalk, formato GeoParquet + metadatos).
- **v0.4**: modelo bayesiano (Poisson/binomial con efectos espaciales) para posterior
  completa por unidad destino.
- **v0.5**: Python Toolbox (.pyt) para ArcGIS Pro y publicación como web tool;
  `reaggregate()` para microdatos georreferenciados (la vía preferida cuando existen).

## Paso 0

`scripts/paso0_diagnostico.py` cuantifica el no-anidamiento UPZ→UPL con datos oficiales
(IDECA/SDP + DANE). Ver `MISION_CLAUDE_CODE.md` para la corrida reproducible con registro
de procedencia.
