Caso de estudio · Data Engineering y Data Science
¿Cuánto se calentó Argentina?
85 años de temperatura diaria de 27 ciudades, de Jujuy a Ushuaia, convertidos en un dashboard que se actualiza solo. Esto es cómo lo armé, de la API al gráfico.
+0,8 °C
más cálido que el período 1961–1990 (promedio de los últimos 10 años) (2016–2025)
Pasá el cursor o tocá un año para ver su valor.
1El problema
Quería responder con datos una pregunta simple: ¿cuánto se calentó Argentina y dónde?
- Cuánto
- Cuánto más cálidos son los últimos 10 años que el período de referencia 1961–1990.
- Dónde
- Qué zonas se calentaron más: el norte, Cuyo, la Pampa o la Patagonia.
- Cuándo
- Si se calentaron más los días o las noches, y qué meses cambiaron más.
- Extremos
- Cuántos días de calor (≥ 30 °C) y cuántas heladas hay hoy comparado con antes.
2Los datos
Los datos vienen del reanálisis ERA5 de ECMWF/Copernicus, a través de la API gratuita de Open-Meteo: temperatura diaria desde 1940 para las 24 capitales y tres ciudades más. Cada decisión apunta a que la serie sea comparable en el tiempo.
- ERA5 puro
- Toda la serie sale del mismo modelo, no de una mezcla automática de fuentes. Mezclar modelos de distinta resolución podría crear un salto artificial en una tendencia de 85 años.
- Referencia 1961–1990
- Es el período estándar de la OMM para estudiar el cambio climático.
- Tendencia desde 1980
- Antes de la era satelital ERA5 tiene menos observaciones, así que esos años son más inciertos.
- Solo años completos
- Un año a medias sesga el promedio: le falta el verano o el invierno.
3Cómo lo construí
Es un pipeline ELT: se extrae, se carga cruda y se transforma dentro del almacén de datos. Cada etapa se puede repetir sin duplicar ni romper nada.
API ERA5
Open-Meteo, reanálisis de ECMWF
Extract
Por ciudad y década, con reintentos
DuckDB
Carga idempotente con upsert
dbt
Staging, intermediate y marts, con tests
Dashboard
Sitio estático en GitHub Pages
- Extract
- Pide a la API por ciudad y década, reintenta los errores con espera creciente, respeta los límites de cuota y puede retomar donde quedó. Guarda cada respuesta tal cual, con metadatos de qué se pidió y cuándo.
- Load
- DuckDB desarma el JSON a una fila por día. La carga es idempotente: si un día llega dos veces, gana la extracción más reciente.
- Transform
- dbt en tres capas (staging, intermediate y marts). La tabla de hechos es incremental, así que toma correcciones y ciudades nuevas sin recalcular todo.
- Refresco de 90 días
- Los últimos meses de ERA5 son preliminares y se corrigen después, así que cada corrida los vuelve a pedir y reemplaza los valores.
- Dashboard
- Un sitio estático. GitHub Actions corre el pipeline los lunes y jueves y lo publica en GitHub Pages. La grilla del mapa de calor se calcula una sola vez, porque hacerlo en el navegador congelaba la página unos 2,5 segundos.
4Calidad y límites
Un dato mal cargado se nota tarde, así que cada capa tiene sus controles. También dejé escrito qué no puede afirmar el proyecto.
- Tests de dbt
- Claves únicas, valores no nulos y relaciones entre tablas; rangos físicos posibles; temperatura mínima ≤ media ≤ máxima; ningún día faltante entre el primer y el último dato.
- Frescura
- Avisa si el último dato tiene más de 16 días y falla a los 30.
- Tests de Python
- 18 tests sobre la planificación de tramos, la reanudación, los reintentos, la idempotencia y que el archivo más nuevo gane.
- Límite: la grilla
- ERA5 es una grilla de unos 25 km, no una estación: en montaña o costa la celda puede diferir del valor local.
- Límite: el promedio
- El promedio nacional es simple entre 27 ciudades. Las provincias chicas del centro y el litoral pesan más que su superficie y la Patagonia pesa menos.
5El resultado, año por año
Cada año es la diferencia entre la temperatura media del país y la del período 1961–1990 (la línea fina). La línea gruesa es el promedio móvil de 10 años: sube de forma sostenida desde el año 2000.
Pasá el cursor o tocá un año para ver su valor.