Saltar al contenido
← Volver a proyectos

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.

  1. API ERA5

    Open-Meteo, reanálisis de ECMWF

  2. Extract

    Por ciudad y década, con reintentos

  3. DuckDB

    Carga idempotente con upsert

  4. dbt

    Staging, intermediate y marts, con tests

  5. 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.

Ver el dashboardVer el repositorio