Esta página calcula las siete variables del índice de incendio urbano por unidad de análisis y las
combina con los pesos de config/parametros.yaml (3.4.a). El resultado es un
índice relativo de 0 a 1, no una probabilidad ni una pérdida esperada.
Variables por unidad¶
import numpy as np
import pandas as pd
from IPython.display import Markdown, display
from sidro import exposicion, process, viz
from sidro.analisis import indices, urbano
from sidro.config import parametros, rutas
from sidro.fetch import obtener_capa
edif = intentar(exposicion.edificaciones, mensaje="No se pudo construir la exposición de edificaciones")
incidentes = intentar(obtener_capa, "incidentes_incendio_urbano", mensaje="Sin registro de incidentes: se omite la ocurrencia histórica")
estaciones = intentar(obtener_capa, "estaciones_bomberos", mensaje="Sin estaciones: se omite el tiempo de respuesta")
hidrantes = intentar(obtener_capa, "hidrantes", mensaje="Sin hidrantes: se omite la distancia al hidrante")if edif is not None:
unidades = process.unidades_analisis()
var = urbano.variables_unidad(edif, unidades, incidentes, estaciones, hidrantes)
pesos = parametros()["incendio_urbano"]["pesos"]
indice = indices.incendio_urbano(var)
usados = indice.attrs.get("pesos_usados", {}) # los atributos no sobreviven a la asignación a una columna
var["indice_incendio_urbano"] = indice
print(f"Unidades: {len(var)} (origen: {unidades.attrs.get('origen')})")
display(pd.DataFrame({"peso base": pd.Series(pesos), "peso usado": pd.Series(usados),
"unidades con dato": var[list(pesos)].notna().sum()}).fillna(0).round(2))WARNING sidro.fetch: manzanas_censo: falló nivel nacional/usuario -> Archivo de usuario no encontrado: /Users/mauricio/Documents/Data-science-local/SIDRo/data/user/dane_mgn_manzanas_cnpv2018.gpkg
WARNING sidro.process: Unidades: manzanas_censo no disponible (No se pudo obtener 'manzanas_censo'. Intentos: [{'nivel': 'nacional', 'tipo': 'usuario', 'error': 'Archivo de usuario no encontrado: /Users/mauricio/Documents/Data-science-local/SIDRo/data/user/dane_mgn_manzanas_cnpv2018.gpkg'}])
Unidades: 57 (origen: estratificacion)
La tabla muestra qué variables entraron al índice. Las que no tienen datos reciben peso 0 y los pesos de las demás se renormalizan, de modo que el índice siempre está entre 0 y 1 pero no es comparable entre ejecuciones con distintas variables disponibles.
Índice por unidad¶
if edif is not None:
agg = unidades[["id_unidad", "geometry"]].join(var.drop(columns="id_unidad"))
agg["vulnerabilidad_social"] = indices.vulnerabilidad_social(unidades)
top = agg.drop(columns="geometry").sort_values("indice_incendio_urbano", ascending=False)
display(top.head(10).round(2))if edif is not None:
m = viz.mapa_base()
viz.capa(m, agg, "indice_incendio_urbano", nombre="Índice de incendio urbano", cmap="YlOrRd",
tooltip=["id_unidad", "indice_incendio_urbano", "vetustez", "altura", "tiempo_respuesta"])
viz.cerrar(m)
else:
m = None
mQué mueve el índice¶
import matplotlib.pyplot as plt
if edif is not None:
aporte = pd.DataFrame({c: process.normalizar(agg[c]).fillna(0) * w for c, w in usados.items()})
fig, ax = plt.subplots(figsize=(7, 3.6))
orden_u = agg["indice_incendio_urbano"].sort_values(ascending=False).head(15).index
aporte.loc[orden_u].plot.barh(stacked=True, ax=ax, width=0.85)
ax.invert_yaxis(), ax.set_xlabel("Contribución al índice"), ax.set_yticklabels(agg.loc[orden_u, "id_unidad"])
ax.legend(fontsize=7, loc="lower right")
fig
El gráfico descompone el índice de las 15 unidades más altas en la contribución ponderada de cada variable. Sirve para ver por qué una unidad sale alta (edificaciones viejas, respuesta lenta, mucha actividad comercial) y orientar la intervención: prevención, inspección, hidrantes o localización de unidades.
Riesgo × vulnerabilidad social¶
if edif is not None:
biv = indices.bivariado(agg["indice_incendio_urbano"], agg["vulnerabilidad_social"])
agg = agg.join(biv)
m = viz.mapa_base()
viz.capa_bivariada(m, agg)
viz.cerrar(m)
else:
m = None
mLeyenda: índice de incendio urbano en el eje vertical, vulnerabilidad social en el horizontal.
Los terciles son relativos al barrio. Si la vulnerabilidad social sale vacía, aún no se cargaron los datos censales (2.2).
Exportación¶
if edif is not None:
process.guardar(agg[["id_unidad", "geometry", "indice_incendio_urbano", "vulnerabilidad_social"]]
.rename(columns={"indice_incendio_urbano": "riesgo"}), "riesgo_incendio_urbano")
print("Guardado:", (rutas().processed / "riesgo_incendio_urbano.parquet").relative_to(rutas().raiz))Guardado: data/processed/riesgo_incendio_urbano.parquet
riesgo_incendio_urbano.parquet queda en data/processed/ con id_unidad y la columna riesgo (el
índice de 0 a 1) para la síntesis 3.6.