Esta página cruza la intensidad sísmica (3.1.b) con las edificaciones del barrio, aplica las curvas de fragilidad de la ecuación (1) y agrega los resultados por unidad de análisis. Es un escenario determinista de diseño (Tr 475 años) y las curvas son ilustrativas (ver 3.1.a).
Exposición: edificaciones¶
import pandas as pd
from sidro import exposicion, process, viz
from sidro.analisis import indices, sismo
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 (catastro u OpenStreetMap)")if edif is not None:
print(f"{len(edif)} edificaciones; valor de reposición total: {edif.valor_cop.sum() / 1e9:,.1f} mil millones COP")
display(exposicion.completitud(edif).round(1))
display(edif.tipologia.value_counts().rename("edificaciones").to_frame())16725 edificaciones; valor de reposición total: 24,928.7 mil millones COP
if edif is not None and edif["anio"].notna().any():
viz.grafica_anios(edif)
El año viene del catastro por lote (ver 3.1.a); la gráfica muestra cuándo se construyó el barrio y, con ello, qué normas sismorresistentes regían: las edificaciones anteriores a 1984 (MNR y PCR_PRE84) son las más frágiles.
La tabla de completitud muestra qué fracción de las edificaciones tiene cada campo; donde falta el
año se aplica el supuesto de 1985, de modo que una completitud baja en anio implica incertidumbre
alta en la tipología.
Daño y pérdida¶
zonas = intentar(obtener_capa, "zonas_respuesta_sismica",
mensaje="Sin zonas de respuesta: se usa la aceleración en roca")
if edif is not None:
dano = sismo.danos(sismo.pga_por_zona(edif, zonas))
print(dano.pga_origen.value_counts().to_string())
from sidro.aoi import construir_aoi
en_barrio = dano.geometry.representative_point().within(construir_aoi().geometry.iloc[0])
def resumen(d):
return {"edificaciones": len(d),
"pérdida esperada (millones COP)": d.perdida_cop.sum() / 1e6,
"razón de pérdida (%)": 100 * d.perdida_cop.sum() / d.valor_cop.sum(),
"residentes estimados": d.ocupantes_est.sum(),
"residentes en edificaciones con daño extenso o completo": d.ocupantes_dano_extenso_o_mas.sum()}
display(pd.DataFrame({"área con búfer": resumen(dano), "dentro del barrio": resumen(dano[en_barrio])}).round(1))pga_origen
Decreto 523/2010 A0 16725
if edif is not None:
m = viz.mapa_base()
viz.capa(m, dano, "mdr", nombre="Razón de daño media (MDR)", cmap="YlOrRd",
tooltip=["tipologia", "pisos", "anio", "pga_g", "mdr", "perdida_cop"])
viz.cerrar(m)
else:
m = None
mAgregación por unidad de análisis¶
unidades = process.unidades_analisis() if edif is not None else None
if edif is not None:
agg = process.agregar(dano, unidades, {
"n_edificaciones": ("id_edif", "count"),
"valor_cop": ("valor_cop", "sum"),
"perdida_cop": ("perdida_cop", "sum"),
"personas_dano_severo": ("ocupantes_dano_extenso_o_mas", "sum"),
})
agg["razon_perdida_pct"] = 100 * agg.perdida_cop / agg.valor_cop
agg["vulnerabilidad_social"] = indices.vulnerabilidad_social(agg)
print(f"Unidades: {len(agg)} (origen: {unidades.attrs.get('origen')})")
display(agg.drop(columns="geometry").sort_values("perdida_cop", ascending=False).head(10).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)
Riesgo × vulnerabilidad social¶
El mapa bivariado clasifica cada unidad por terciles de pérdida esperada y de vulnerabilidad social (ver 1.6). Las unidades de riesgo y vulnerabilidad altos son las que más necesitan atención. Los terciles son relativos al barrio: una unidad “alta” lo es respecto de las demás de Los Rosales, no frente a un umbral absoluto.
if edif is not None:
biv = indices.bivariado(agg["perdida_cop"].fillna(0), agg["vulnerabilidad_social"])
agg = agg.join(biv)
m = viz.mapa_base()
viz.capa_bivariada(m, agg)
viz.cerrar(m)
else:
m = None
mLeyenda: riesgo en el eje vertical, vulnerabilidad social en el horizontal.
Exportación¶
if edif is not None:
from sidro import export
process.guardar(agg.assign(riesgo=agg["perdida_cop"])[["id_unidad", "geometry", "riesgo", "perdida_cop", "razon_perdida_pct",
"personas_dano_severo", "vulnerabilidad_social"]], "riesgo_sismo")
ruta = export.exposicion_climada(dano)
print("Exposición para CLIMADA:", ruta.relative_to(rutas().raiz))Exposición para CLIMADA: data/export/climada_exposicion.parquet
riesgo_sismo.parquet queda en data/processed/ con el id_unidad y la columna riesgo (pérdida esperada) para que la
síntesis 3.6 lo combine con los demás riesgos. La exposición exportada sigue el
formato de Exposures de CLIMADA Aznar-Siguan & Bresch, 2019.
try:
from sidro import export
fs = export.funciones_impacto_sismo_climada()
fs.plot()
except ImportError:
print("CLIMADA no está instalado: se omite la figura de funciones de impacto (opcional).")CLIMADA no está instalado: se omite la figura de funciones de impacto (opcional).
Curvas de daño por tipología¶
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6, 3.5))
for tip in parametros()["sismo"]["tipologias"]:
c = sismo.curva_mdr(tip)
ax.plot(c.pga_g, c.mdr, label=tip)
ax.set_xlabel("PGA (g)"), ax.set_ylabel("Razón de daño media")
ax.legend(), ax.grid(alpha=0.3)
fig

Las curvas más a la izquierda corresponden a las tipologías más frágiles. Con las curvas ilustrativas actuales, el orden relativo es razonable pero los valores absolutos no están calibrados.
- Aznar-Siguan, G., & Bresch, D. N. (2019). CLIMADA v1: a global weather and climate risk assessment platform. Geoscientific Model Development, 12, 3085–3097. 10.5194/gmd-12-3085-2019