Tarea 3 - Floración y Producción Agrícola
Predicción de ENT — Floración, vegetación y exposición a pólenes

Propósito

Esta tarea conecta agricultura y fenología de la vegetación con la exposición potencial a pólenes. Construirán series espacio-temporales de índices de vegetación, identificarán períodos de floración por comuna y los compararán con clima y contaminación de la Tarea 2. El resultado será un set de features listo para modelos de la Tarea 4 y jerárquicos de la Tarea 5.

Objetivos de aprendizaje

  • Integrar datos de producción/cosechas agrícolas (INE) a nivel comunal.
  • Calcular y resumir NDVI, SAVI y NDWI desde imágenes satelitales con enmascaramiento de nubes.
  • Detectar ventanas de máxima actividad fenológica por comuna y estación.
  • Comparar patrones agrícolas/vegetacionales con clima y contaminantes (salidas de Tarea 2).
  • Entregar un pipeline reproducible en Python.

Nota

Un pipeline (de procesamiento) en este proyecto es una secuencia automatizada de etapas que transforman datos brutos (agrícolas, satelitales y climáticos) en un conjunto coherente y reproducible de indicadores por comuna. Cada etapa toma los resultados de la anterior, los transforma, los valida y los guarda en formatos standard. Un pipeline se ve así:

pipeline.svg

Figura 1: Un posible pipeline de procesamiento para la tarea 3

Insumos (mínimos)

  • Shapefile/GeoJSON de comunas y tabla de población de la Tarea 1.
  • Clima y contaminación armonizados por comuna-fecha de la Tarea 2.
  • Agricultura (INE): superficie/producción por cultivo y comuna 2024 si disponible.
  • Imágenes satelitales: Sentinel-2 L2A o Landsat-8/9 (según disponibilidad y cobertura de nubes). Bandas rojo, NIR, green y SCL/QA.

Estructura sugerida de proyecto

data/
  ine_agricola.csv
  s2/
  l8/
  clima_contam_t2.parquet
geo/ comunas.gpkg
out/
  indices_vegetación.parquet
  fenología_resumen.parquet
figs/
notebooks/

Tareas y entregables intermedios

1) Integración agrícola INE → comunas

  • Normalicen nombres/códigos de comuna y cultivo.
  • Construyan métricas por comuna-año: superficie_ha, producción_ton, diversidad_cultivos (p.ej., índice de Shannon), principales cultivos.
import pandas as pd
ine=pd.read_csv("data/ine_agricola.csv")
mapa=pd.read_parquet("data/comunas_codigos.parquet")
ine=ine.merge(mapa,how="left",on=["region","provincia","comuna"])
agg=(ine.groupby(["comuna_id","anio"])
         .agg(superficie_ha=("superficie_ha","sum"),
              produccion_ton=("produccion_ton","sum"),
              cultivos=("cultivo","nunique"))
         .reset_index())
agg.to_parquet("out/agricola_comuna_anio.parquet")
print(agg.head(3))

2) Preprocesamiento de imágenes y cálculo de índices

  • Seleccionen meses relevantes para floración por macro-estación (p.ej., SON y DJF).
  • Enmascaren nubes y sombras con la banda SCL/QA.
  • Generen composites mensuales por comuna utilizando zonal statistics.
  • Calculen NDVI, SAVI y NDWI; documenten fórmulas y bandas usadas.
import rasterio, geopandas as gpd, numpy as np
from rasterstats import zonal_stats
g=gpd.read_file("geo/comunas.gpkg").to_crs(32719)
def comp_zonal(path_red,path_nir,path_green,geom):
    with rasterio.open(path_red) as r, rasterio.open(path_nir) as n, rasterio.open(path_green) as gch:
        red, nir, gr=r.read(1).astype("float32"), n.read(1).astype("float32"), gch.read(1).astype("float32")
    ndvi=(nir-red)/((nir+red)+1e-6)
    savi=((1.5*(nir-red))/((nir+red+0.5)+1e-6))
    ndwi=(gr-nir)/((gr+nir)+1e-6)
    arr={"ndvi":ndvi,"savi":savi,"ndwi":ndwi}
    out={}
    for k,a in arr.items():
        zs=zonal_stats(geom,a,stats=["mean","median","std"],affine=r.transform,nodata=np.nan)
        out|={f"{k}_{s}":[zs[i][s] for i in range(len(zs))] for s in ["mean","median","std"]}
    return out

3) Serie temporal comuna-mes y detección de floración

  • Unifiquen índices por comuna-mes.
  • Detecten ventanas de floración con una o más reglas:
    • umbral relativo: NDVI/SAVI por encima del percentil 75 de la comuna y pendiente positiva;
    • picos mediante peak finding tras suavizado (p.ej., media móvil 3).
  • Reporten por comuna: inicio, fin, duración y magnitud del pico principal por año.
idx=pd.read_parquet("out/índices_vegetación.parquet")
idx=idx.sort_values(["comuna_id","fecha"])
idx["ndvi_smooth"]=idx.groupby("comuna_id").ndvi_mean.transform(lambda s: s.rolling(3,1).mean())
thr=idx.groupby("comuna_id").ndvi_smooth.transform(lambda s: s.quantile(0.75))
idx["flag_flor"]= (idx.ndvi_smooth>=thr) & (idx.ndvi_smooth.diff().gt(0))
win=(idx[idx.flag_flor].groupby(["comuna_id","anio"])
       .agg(inicio=("fecha","min"), fin=("fecha","max"),
            ndvi_max=("ndvi_smooth","max"), dur_dias=("fecha","nunique"))
       .reset_index())
win.to_parquet("out/fenología_resumen.parquet")
print(win.head(3))

4) Comparación con clima y contaminación de Tarea 2

  • Integren clima_contam_t2.parquet por comuna-mes.
  • Analicen asociaciones exploratorias:
    • correlaciones entre magnitud/duración de floración y temperatura, humedad, precipitación;
    • cruces con NO2, O3, SO2.
  • Entreguen 3–5 figuras estándar: mapas de pico de floración, calendarios de calor por comuna, y scatter con bandas de confianza.
fen=pd.read_parquet("out/fenología_resumen.parquet")
cc=pd.read_parquet("data/clima_contam_t2.parquet")
df=fen.merge(cc,on=["comuna_id","anio","mes"],how="left")
corr=(df[["ndvi_max","dur_dias","t2m_mean","rh_mean","pr_sum","no2_mean","o3_mean","so2_mean"]]
      .corr().round(2))
print(corr)

5) Producto final para T4–T5

  • Generen features por comuna-mes: ndvi_mean, savi_mean, ndwi_mean, ndvi_max, dur_flor, indicadores de estación y de cultivos dominantes.
  • Guarden un único features_vegetacion.parquet documentado y listo para su unión con epidemiología y socioeconómicos.

Requisitos de visualización mínima

  • Mapa coroplético de pico de floración por comuna y año reciente.
  • Calendario de calor comuna vs. mes para ndvi_mean.
  • Figura comparativa: ndvi_mean vs. t2m_mean y no2_mean en la región asignada.
import matplotlib.pyplot as plt, geopandas as gpd, pandas as pd
g=gpd.read_file("geo/comunas.gpkg")
fv=pd.read_parquet("out/fenología_resumen.parquet")
m=g.merge(fv[fv.anio==2024],on="comuna_id",how="left")
ax=g.plot(edgecolor="black",linewidth=0.2); m.plot(column="ndvi_max",legend=True,ax=ax)
plt.title("Pico de floración (NDVI máx) — 2024 — REGION_ASIGNADA"); plt.tight_layout()
plt.savefig("figs/mapa_pico_floracion_2024.png",dpi=300)

Entrega

  • Un notebook limpio y ejecutable con el pipeline completo.
  • features_vegetacion.parquet, fenología_resumen.parquet e índices_vegetación.parquet.
  • 3–5 figuras en figs/ con títulos y ejes legibles.
  • Un README.org breve con dependencias, estructura de carpetas y tiempos de ejecución aproximados.

Evaluación (9 puntos)

Criterio Puntos
Integración agrícola INE a nivel comunal (calidad y documentación) 2.0
Cálculo de NDVI/SAVI/NDWI con enmascaramiento y zonal stats 2.0
Detección y resumen de ventanas de floración por comuna-año 2.0
Análisis comparativo con clima y contaminantes (figuras y texto) 2.0
Reproducibilidad y organización (estructura, naming, README) 1.0
Total 9.0

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