Tarea 2 - Variables Ambientales y Clima Local
Predicción de ENT - Efectos de floración y alergias
Propósito
Esta tarea consolida la obtención, el preprocesamiento y la integración de variables climáticas y de calidad del aire a escala comunal para la para las regiones asignadas en la Tarea 1, preparando insumos para las Tareas 3–5. Se enfoca en: descarga reproducible, armonización espacio‑temporal, zonal statistics y reporte visual estandarizado.
Objetivos de aprendizaje
- Descargar y procesar reanalysis climática (ERA5) y contaminantes (Sentinel‑5P).
- Estandarizar rejillas, sistemas de referencia y calendarios (diario/semanal/mensual).
- Calcular estadísticas zonales por comuna (media, p5, p95, % días sobre umbral).
- Documentar calidad de datos y decisiones de imputación/filtrado.
- Entregar un mini‑reporte con mapas y series listos para Tarea 3.
Entregables
data/processed/ambiental_rm.parquet
con panel comuna‑fecha y columnas descritas endiccionario
más abajo.figs/
con: mapas coropléticos, series temporales y small multiples.notebooks/02_ambiental_rm.ipynb
o.py
ejecutable extremo a extremo.report/02_ambiental_rm.org
exportable a PDF/HTML con resultados y conclusiones.- Archivo
README.md
breve con instrucciones de reproducción (máx. 15 líneas).
Rubrica de evaluación (100 pts)
Componente | Pts |
---|---|
Descarga reproducible (scripts parametrizados) | 2 |
Preprocesamiento y control de calidad (QA/QC) | 2 |
Estadísticas zonales correctas y verificadas | 2 |
Visualizaciones informativas y legibles | 1 |
Documentación y trazabilidad (metadatos) | 1 |
Interpretación y puente a Tarea 3 | 1 |
Total | 9 |
Datos y alcance
Cobertura espacial
- Regiones asignadas (uso del shapefile o
GeoPackage
aprobado en Tarea 1). - Proyección de trabajo:
EPSG:32719
(UTM 19S) para cómputo; entrega enEPSG:4326
.
Horizonte temporal
- 2018–2025 (ajusten si su equipo requiere un subconjunto). Resolución diaria; agregaciones semanales ISO y mensuales.
Fuentes
- ERA5-Land/ERA5: temperatura 2 m (t2m), humedad relativa (rh, derivada), precipitación total (tp), velocidad del viento 10 m (u10, v10).
- Sentinel‑5P TROPOMI: NO2 troposférico, O3 total col., SO2, con quality flags.
Estructura de carpetas recomendada
data/ raw/{era5,s5p}/ processed/ figs/ notebooks/ src/ report/
Requisitos
- Usar:
geopandas
,pandas
,xarray
,rioxarray
,rasterio
,rasterstats
,pyproj
,matplotlib
. - Entregar
environment.yml
orequirements.txt
con versiones bloqueadas.
Diccionario de variables
Columna | Tipo | Descripción |
---|---|---|
comuna_id | str | Código oficial comuna (INE) |
comuna | str | Nombre de comuna |
fecha | date | Día calendario |
t2m_mean_c | float | Temperatura media 2 m [°C] |
t2m_max_c | float | Temperatura máx. 2 m [°C] |
rh_mean_pct | float | Humedad relativa media [%], derivada de t2m y punto de rocío |
tp_mm | float | Precipitación total [mm/día] |
wind10_mean_ms | float | Velocidad viento 10 m [m/s] |
no2_trop_mean_mol_m2 | float | NO2 troposférico promedio |
o3_total_mean_dobson | float | Ozono total |
so2_mean_mol_m2 | float | SO2 promedio |
no2_gt_thresh_pct | float | % días con NO2 sobre umbral definido |
qa_flag | str | Etiquetas de calidad / razones de descarte |
source | str | 'ERA5' o 'S5P' |
Flujo de trabajo
1) Descarga
- Parametrizar fecha inicial/final, bbox regiones y variables.
- Registrar logs y tamaños de archivo; no subir datos crudos al repo público.
2) Preprocesamiento
- Convertir unidades a SI y a °C cuando aplique.
- Derivar humedad relativa a partir de temperatura y punto de rocío si es necesario.
- Reproyectar a
EPSG:32719
y resamplear a una rejilla común (p. ej. 1 km). - Filtrar píxeles con qa value bajo umbral recomendado (S5P).
3) Estadísticas zonales
- Para cada día y comuna: media, p5, p95. Calcular también % de días > umbral mensual de NO2.
- Validar con una comuna sentinel: comparar promedio zonal vs. promedio regional ponderado.
4) Integración y panel
- Unir todas las variables por
[comuna_id, fecha]
. Incluir columnasource
yqa_flag
. - Guardar en
Parquet
con partición por año (partition_cols
["year"]= si usanpyarrow
).
5) Visualización y reporte
- Mapas: cuantilización (q5‑q95) y class breaks consistentes entre meses.
- Series: small multiples por provincia; resaltar episodios extremos.
- Incluir sección de limitaciones y data readiness para Tarea 3.
Chequeos mínimos (QA/QC)
[ ]
Cobertura temporal ≥ 95% por comuna y año o justificar imputación[ ]
Proyecciones coherentes y área conservada tras reproyección[ ]
Umbrales y quality flags documentados[ ]
Resultados replicables conmake all
o un único comando
Preguntas que deben responder en el reporte
- ¿Cómo varían clima y contaminación entre comunas y estaciones?
- ¿Qué relación exploratoria se observa entre NO2 y temperatura/humedad?
- ¿Qué episodios extremos destacan y qué cobertura de datos tuvieron?
- ¿Qué decisiones de procesamiento afectarían más los modelos posteriores?
Preparación para Tarea 3–5
- Exportar agregados semanales ISO y mensuales en
data/processed/ambiental_rm_agg.parquet
. - Mantener claves y nombres coherentes para unión con NDVI/SAVI y epidemiología.
- Definir y documentar los umbrales que se reutilizarán como features.
Plantillas de código (mínimas)
Estadísticas zonales diarias
import geopandas as gpd, pandas as pd, xarray as xr, rioxarray as rxr
from rasterstats import zonal_stats
gdf=gpd.read_file("data/geo/comunas_rm.gpkg").to_crs(32719)
ds=rxr.open_rasterio("data/raw/era5/t2m_2023.tif").rio.reproject(32719)
def zs_daily(raster_path,var):
arr=rxr.open_rasterio(raster_path).rio.reproject(32719)
out=[]
for i in range(arr.sizes['band']):
p=arr.isel(band=i)
z=zonal_stats(gdf.geometry,p.values,affine=p.rio.transform(),stats=["mean","percentile_5","percentile_95"])
df=pd.DataFrame(z); df["fecha"]=pd.to_datetime(p.rio.nodata,errors="coerce")
df=df.rename(columns={"mean":f"{var}_mean","percentile_5":f"{var}_p5","percentile_95":f"{var}_p95"})
out.append(df)
res=pd.concat(out,axis=0).assign(comuna_id=gdf["COMUNA"].values.repeat(len(out)//len(gdf)))
return res
Serie comunal agregada semanal
df=pd.read_parquet("data/processed/ambiental_rm.parquet")
w=(df.assign(iso_week=df["fecha"].dt.isocalendar().week)
.groupby(["comuna_id","iso_week"],as_index=False)
.agg(t2m_mean_c=("t2m_mean_c","mean"),no2_trop_mean_mol_m2=("no2_trop_mean_mol_m2","mean")))
w.to_parquet("data/processed/ambiental_rm_agg.parquet")
Mapa rápido
import matplotlib.pyplot as plt
g=gpd.read_file("data/geo/comunas_rm.gpkg").to_crs(4326)
m=g.merge(df[df.fecha.between("2023-09-01","2023-11-30")].groupby("comuna_id",as_index=False).no2_trop_mean_mol_m2.mean(),on="comuna_id")
ax=g.plot(edgecolor="black",linewidth=0.2); m.plot(column="no2_trop_mean_mol_m2",legend=True,ax=ax)
plt.title("NO2 promedio — Primavera 2023 (REGION_ASIGNADA)");
plt.tight_layout();
plt.savefig("figs/no2_rm_primavera2023.png",dpi=300)