El clima futuro cambia la propensión meteorológica a incendios, no la distancia entre las edificaciones y la vegetación. Esta página estima el cambio en días de FWI alto bajo los escenarios SSP2-4.5 y SSP5-8.5 Riahi et al., 2017O'Neill et al., 2017 y dos horizontes, con el método delta y las proyecciones reducidas de escala NEX-GDDP-CMIP6 Thrasher et al., 2022: a la serie diaria observada se le aplica el cambio medio de cada modelo en temperatura máxima (aditivo) y en precipitación, humedad relativa y viento (multiplicativo), y se recalcula el FWI.
Series base y deltas¶
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from IPython.display import display
from sidro.analisis import clima
from sidro.aoi import bbox_wgs84
from sidro.config import aoi_cfg, parametros
from sidro.fetch import obtener_capa
MODELOS = None # p. ej. ["ACCESS-CM2", "EC-Earth3"] para una prueba rápida
VARIABLES = ["tasmax", "pr", "hurs", "sfcWind"]
cfg = aoi_cfg()["clima"]
serie = intentar(obtener_capa, "clima_observado_diario", mensaje="No se pudo obtener la serie climática diaria")
lat = (bbox_wgs84()[1] + bbox_wgs84()[3]) / 2
fwi_base = None
if serie is not None:
fwi_base = intentar(clima.fwi_diario, serie, lat, mensaje="No se pudo calcular el FWI base")WARNING pint.util: Redefining 'percent' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining '%' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'year' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'yr' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'C' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'd' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'h' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'degrees_north' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'degrees_east' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining 'degrees' (<class 'pint.delegates.txt_defparser.plain.UnitDefinition'>)
WARNING pint.util: Redefining '[speed]' (<class 'pint.delegates.txt_defparser.plain.DerivedDimensionDefinition'>)
deltas = None
if fwi_base is not None:
deltas = intentar(clima.deltas_tabla, VARIABLES, cfg["escenarios"], cfg["horizontes"], MODELOS,
cache="deltas_incendio_forestal",
mensaje="No se pudieron obtener las proyecciones CMIP6 (requiere acceso a Planetary Computer)")
if deltas is not None:
display(deltas.groupby(["variable", "escenario", "horizonte"])["delta"].median().unstack("variable").round(3))La tabla muestra la mediana entre modelos del cambio: aditivo en °C para tasmax y razón futura/histórica
para las demás (1,0 = sin cambio).
FWI futuro¶
resultados = None
if deltas is not None:
umbral = parametros()["incendio_forestal"]["fwi_umbral_alto"]
base = clima.dias_fwi_alto(fwi_base, umbral).mean()
filas = []
for (esc, hor), g in deltas.groupby(["escenario", "horizonte"]):
dias = []
for modelo, gm in g.groupby("modelo"):
d = gm.set_index("variable")["delta"].to_dict()
fut = clima.fwi_diario(clima.aplicar_deltas_meteo(serie, d), lat)
dias.append(clima.dias_fwi_alto(fut, umbral).mean())
filas.append({"escenario": esc, "horizonte": hor, "modelos": len(dias),
**{f"p{q}": np.percentile(dias, q) for q in cfg["percentiles_ensamble"]}})
resultados = pd.DataFrame(filas)
resultados["base_dias_por_anio"] = base
display(resultados.round(2))Cada fila es el promedio anual de días con FWI alto sobre la serie observada con los deltas del
modelo; p10, p50 y p90 resumen la dispersión entre modelos Zhang et al., 2011. Compare con
base_dias_por_anio, el valor sin cambio climático. Con un clima húmedo como el de Bogotá los
conteos pueden ser muy pequeños; en ese caso interprete el signo y la proporción del cambio, no el
valor absoluto.
if resultados is not None:
fig, ax = plt.subplots(figsize=(6, 3.4))
etiquetas = [f"{r.escenario}\n{r.horizonte}" for r in resultados.itertuples()]
x = np.arange(len(resultados))
mediana = resultados[f"p{cfg['percentiles_ensamble'][1]}"].values
bajo = mediana - resultados[f"p{cfg['percentiles_ensamble'][0]}"].values
alto = resultados[f"p{cfg['percentiles_ensamble'][2]}"].values - mediana
ax.bar(x, mediana, yerr=[bajo, alto], color="#bc6c25", capsize=4)
ax.axhline(resultados.base_dias_por_anio.iloc[0], ls="--", color="#555", label="base observada")
ax.set_xticks(x, etiquetas, fontsize=8), ax.set_ylabel("Días con FWI alto por año")
ax.legend()
fig
Guardar el resumen¶
if resultados is not None:
from sidro import export
export.guardar_resumen("incendio_forestal_escenarios", {"escenarios": resultados.to_dict("records")})- Riahi, K., van Vuuren, D. P., Kriegler, E., & others. (2017). The Shared Socioeconomic Pathways and their energy, land use, and greenhouse gas emissions implications: An overview. Global Environmental Change, 42, 153–168. 10.1016/j.gloenvcha.2016.05.009
- O’Neill, B. C., Kriegler, E., Ebi, K. L., & others. (2017). The roads ahead: Narratives for shared socioeconomic pathways describing world futures in the 21st century. Global Environmental Change, 42, 169–180. 10.1016/j.gloenvcha.2015.01.004
- Thrasher, B., Wang, W., Michaelis, A., Melton, F., Lee, T., & Nemani, R. (2022). NASA Global Daily Downscaled Projections, CMIP6. Scientific Data, 9, 262. 10.1038/s41597-022-01393-4
- Zhang, X., Alexander, L., Hegerl, G. C., & others. (2011). Indices for monitoring changes in extremes based on daily temperature and precipitation data. WIREs Climate Change, 2, 851–870. 10.1002/wcc.147