Mareas

marea, clima y próximos días · datos del INA + SMN
SIEMPRE ACTUALIZADO
ESTACIÓN
DÍAS
ALTURA ACTUAL
1.87 m

+0.17 m en la ultima hora

Pleamar 23:59 · 2,07 m
Bajamar 06:00 · 1,03 m
Temperatura 11.8 C
Viento 10 km/h SE
Lluvia 0.5 mm
EVOLUCIÓN DEL DÍA
Altura de marea
Subiendo
Evolución diaria de la altura de marea
PromedioProm MínimaMin MáximaMax
TABLA

Valores por hora

promedio, mínimo y máximo
Hora Prom ↓ Mín ↑ Máx
00:00 1.65 m 1.40 m 1.90 m
01:00 1.63 m 1.39 m 1.89 m
02:00 1.52 m 1.28 m 1.78 m
03:00 1.38 m 1.13 m 1.63 m
04:00 1.22 m 0.97 m 1.47 m
05:00 1.09 m 0.84 m 1.34 m
06:00 1.03 m 0.79 m 1.28 m
07:00 1.09 m 0.84 m 1.34 m
08:00 1.23 m 0.98 m 1.48 m
09:00 1.38 m 1.13 m 1.63 m
10:00 1.51 m 1.26 m 1.76 m
11:00 1.58 m 1.33 m 1.83 m
12:00 1.58 m 1.33 m 1.83 m
13:00 1.54 m 1.29 m 1.79 m
14:00 1.47 m 1.22 m 1.72 m
15:00 1.40 m 1.15 m 1.65 m
16:00 1.31 m 1.06 m 1.56 m
17:00 1.25 m 1.00 m 1.50 m
18:00 1.28 m 1.03 m 1.53 m
19:00 1.39 m 1.15 m 1.65 m
20:00 1.55 m 1.31 m 1.81 m
21:00 1.73 m 1.48 m 1.98 m
22:00 1.90 m 1.66 m 2.16 m
23:00 2.02 m 1.77 m 2.27 m
23:59 2.07 m 1.82 m 2.32 m
última actualización · 15/10 16:00
Ver detalle técnico →
// DETALLE TÉCNICO

Arquitectura e implementación

Un pipeline construye el historial de marea y clima en BigQuery. Otro sirve la web en tiempo real.

json
Cache local por estación
bq
BigQuery MERGE, sin duplicados
dbt
dbt staging → mart
daily
Airflow orquesta y testea
Airflow: actualizar_cache, cargar_bigquery, dbt_run y dbt_test en verde
dbt: lineage de raw → staging → mart → tests
mareas_por_estacion en producción: 1.354 filas
MERGE, no append ciego

La ventana de pronóstico local se solapa día a día, así que un append ciego duplicaría filas sin límite. Cada ejecución hace MERGE por estación+fecha+hora: inserta lo nuevo, actualiza lo que cambió, y el historial de marea y clima queda disponible sin duplicados ni costo creciente.

Degradación parcial, no falla total

Cuando una fuente externa se atrasa o deja de responder, el pipeline no aborta todo el run: sigue actualizando el resto normalmente y loggea el problema puntual como warning.

+ en paralelo, sirviendo a quien visita la página ↓
api
INA + SMN 2 fuentes oficiales
fetch
Descarga JSON + ZIP/TXT
json
Cache local por estación
svc
Transform services/
ui
Template HTML + SVG + JS
CARGA

BigQuery

mareas_raw.lecturas - MERGE incremental

EN NÚMEROS

  • Primera carga: 195 filas (101 San Fernando, 47 Rosario, 47 Zárate)
  • Hoy solo San Fernando: Rosario/Zárate se muestran en vivo pero no se cargan a BigQuery
  • Cada ejecución actualiza por estación+fecha+hora: nunca duplica
MODELADO

dbt

2 stagings + 1 mart, full outer join

HACE

  • stg_mareas_ina / stg_mareas_smn separan por fuente, sin transformar
  • mareas_por_estacion cruza marea y clima por estación, fecha y hora

TESTS

  • Genéricos: not_null y accepted_values sobre el mart
  • assert_san_fernando_pronostico_reciente - error si se atrasa
  • assert_staging_sin_duplicados - confirma que el MERGE no dejó duplicados
ORQUESTACIÓN

Airflow

Motor en el repo hermano (imagen sobre apache/airflow:3.3.0); el DAG vive en este repo

HACE

  • actualizar_cache → cargar_bigquery → dbt_run → dbt_test, todos los días
  • El repo hermano monta este código como volumen: código y credenciales, nada más
  • El DAG viaja por script, no por symlink (compatibilidad con Windows)
FUENTE DE MAREAS

INA

Instituto Nacional del Agua - REST JSON

alerta.ina.gob.ar/pub/gui/datosProno
&calId=432&seriesId=26202
&timeStart=now-1days&timeEnd=now+4days

LA API ENTREGA

  • 5 valores de altura posibles por hora
  • 4 días, 3 estaciones: San Fernando, Rosario, Zárate

LA APP CALCULA

  • Mín, promedio y máx agrupando los 5 valores por hora
  • Altura actual por interpolación lineal entre registros
  • Próximo máximo y mínimo detectando cambio de pendiente
FUENTE DE CLIMA

SMN

Servicio Meteorológico Nacional - ZIP descarga

GET ssl.smn.gob.ar/dpd/zipopendata.php
?dato=pron5d

LA API ENTREGA

  • ZIP con un TXT de pronóstico por localidad
  • Temperatura, grados de viento, velocidad y precipitación
  • Fechas DD/MMM/AAAA, horas como "06Hs."

LA APP HACE

  • Descomprime el ZIP y detecta el encoding del TXT
  • Extrae el bloque de cada estación con regex
  • Convierte fecha a ISO y grados de viento a abreviatura
  • Mergea los campos meteorológicos con los datos de marea
ARQUITECTURA

App sin base de datos

Lo que ve el usuario corre sobre file-based cache - sin ORM ni migraciones

Service layer mareas/services/ separa lectura, transformación y normalización en módulos distintos.
Fallback controlado Si una fuente falla, el sistema conserva el último cache válido.
Datos ausentes Si INA o SMN devuelven un campo vacío, la interfaz lo oculta en lugar de mostrar un valor roto o en blanco.
Endpoint de refresh protegido /actualizar/ dispara un refresh real, protegido por token - pensado para un cron externo, no para el visitante.
STACK TÉCNICO

Tecnologías aplicadas

Python 3.11 + Django 4.2

Views, templates, service layer y management commands. Whitenoise sirve los estáticos.

BigQuery + dbt

Carga incremental y modelado en capas, en paralelo, sin afectar la ruta del usuario.

Airflow + Docker

Orquestación diaria en un repo hermano, con imagen propia sobre apache/airflow.

REST API - INA

Fetch con urllib, parámetros dinámicos por estación.

ZIP API - SMN

Descarga, descompresión y parseo de TXT en Python.

JSON Cache local

Persistencia por archivo, sin servidor ni base de datos.

SVG + JS vanilla

El gráfico se construye con código: paths, coordenadas y escalado calculados en JS, sin librería de visualización.

HERRAMIENTAS CLI

Management commands

Actualización y validación sin depender de la interfaz web.

mareas_actualizar_datos Obtiene datos frescos de INA y SMN, actualiza el cache.
mareas_validar_fuente Valida integridad del catálogo y los archivos de cache.
mareas_listar_estaciones Lista estaciones con estado del cache actual.
mareas_ver_contexto Muestra el contexto completo renderizado por la vista.
mareas_cargar_bigquery Sube el cache actual a BigQuery (MERGE incremental). Admite --station para una sola estación; en producción solo corre para san_fernando.
CÓDIGO

Código fuente completo

El repo público incluye la app, el modelado dbt y el DAG de Airflow completos.

Ver el código completo en GitHub →