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

  1. data/processed/ambiental_rm.parquet con panel comuna‑fecha y columnas descritas en diccionario más abajo.
  2. figs/ con: mapas coropléticos, series temporales y small multiples.
  3. notebooks/02_ambiental_rm.ipynb o .py ejecutable extremo a extremo.
  4. report/02_ambiental_rm.org exportable a PDF/HTML con resultados y conclusiones.
  5. 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 en EPSG: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 o requirements.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 columna source y qa_flag.
  • Guardar en Parquet con partición por año (partition_cols["year"]= si usan pyarrow).

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 con make all o un único comando

Preguntas que deben responder en el reporte

  1. ¿Cómo varían clima y contaminación entre comunas y estaciones?
  2. ¿Qué relación exploratoria se observa entre NO2 y temperatura/humedad?
  3. ¿Qué episodios extremos destacan y qué cobertura de datos tuvieron?
  4. ¿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)

Entrega

  • Fecha límite: Indicar según cronograma del curso.

Go to the course's home or to my website.