Servidor disponible solo los jueves de 10:30 a 12:30 y los viernes de 10:00 a 13:00 (hora de Madrid); fuera de ese horario está apagado. Fuera del horario, usa la documentación local del material que te descargaste (el README.md de cada carpeta).
G214 · CUNEF
Inicio / tema4 / 04.05-euriboripc

Tema 4 · 5 · Ejercicio adicional B: Euribor e IPC (cruzar dos fuentes abiertas)

Presentación del Tema 4: «Ejercicio B · Cruzar dos fuentes abiertas en el lago» y «Ejercicio B · paso a paso». Duración: 60 a 120 minutos. Coste: céntimos (los dos CSV pesan menos de 1,1 MB). Es un ejercicio opcional de ampliación.

Qué vas a hacer

Vas a bajar dos series de datos abiertos (el Euribor a 1 año del Banco Central Europeo y el IPC del INE), describirlas con dos tablas externas independientes, cruzarlas por año y mes en una tabla Parquet (macro_curated) y responder preguntas como «¿cuántos meses tuvo el Euribor negativo?» o «¿cuál se movió antes, el Euribor o el IPC?». Las diapositivas dan el enunciado; este README da los enlaces, los comandos y las cifras para comprobarte.

Qué se crea en AWS (dentro del stack de 04.01): los CSV en s3://<tu-bucket>/raw/euribor/ y raw/ipc/, y en la base demo_datalake_db las tablas euribor_raw, ipc_raw (externas) y macro_curated (Parquet, con ficheros en athena-results/tables/).

Qué contiene esta carpeta

Fichero Para qué sirve Paso en que se usa
4-athena-macro.sql SQL de apoyo, la solución probada: comandos de descarga y subida (en comentarios), tablas raw, CTAS con filtro y TRY_CAST, preguntas, correlación con desfase y INNER frente a LEFT JOIN Pasos 3 a 6
README.md Esta guía -

Intenta resolver el ejercicio primero por tu cuenta y usa 4-athena-macro.sql para comprobar tu SQL o si te atascas. Cómo usarlo: ábrelo con cat o nano en CloudShell (o desde tu PC), copia las sentencias en el editor de Athena sustituyendo BUCKET_AQUI por el valor de tu bucket (echo "$BUCKET") y ejecútalas de una en una, con el workgroup demo-athena-workgroup y la base demo_datalake_db. Los valores esperados van en comentarios encima de cada sentencia; no dejes un comentario detrás del ; en la misma línea (la API de Athena lo toma por una segunda sentencia y da MALFORMED_QUERY, Only one sql statement is allowed).

Antes de empezar

Cómo llevar los ficheros a CloudShell

  1. En tu PC, comprime esta carpeta (04.05-euriboripc) en un zip y no la descomprimas.
  2. En CloudShell (región eu-north-1): Actions > Upload file > 04.05-euriboripc.zip.
  3. Descomprime y entra:
unzip -o 04.05-euriboripc.zip && cd 04.05-euriboripc && chmod -R u+rwX . && chmod +x *.sh 2>/dev/null; ls

Si ya subiste g214-materiales.zip (README principal), no necesitas este zip: entra con cd ~/g214-materiales/tema4/04.05-euriboripc y, si algún fichero da Permission denied, ejecuta allí chmod -R u+rwX . && chmod +x *.sh.

(Esta carpeta no tiene scripts .sh: el chmod no hace nada. Los datos se descargan con curl y el SQL se pega en Athena.)

Paso a paso

Paso 1 · Averigua tu bucket

BUCKET=$(aws cloudformation describe-stacks --stack-name g214-datalake-demo --region eu-north-1 \
  --query "Stacks[0].Outputs[?OutputKey=='S3Bucket'].OutputValue" --output text)
echo "$BUCKET"

Paso 2 · Descargar y subir los datos

curl -L -o euribor_ecb.csv "https://data-api.ecb.europa.eu/service/data/FM/M.U2.EUR.RT.MM.EURIBOR1YD_.HSTA?format=csvdata"
curl -L -o ipc_ine.csv "https://www.ine.es/jaxiT3/files/t/es/csv_bdsc/50902.csv?nocab=1"
aws s3 cp euribor_ecb.csv "s3://$BUCKET/raw/euribor/" --region eu-north-1
aws s3 cp ipc_ine.csv "s3://$BUCKET/raw/ipc/" --region eu-north-1

Qué verás: dos líneas upload: .... (4-athena-macro.sql trae también un head -3 de los dos ficheros para que veas las cabeceras.)

Paso 3 · Dos tablas raw independientes

Cada una con su SerDe y su cabecera descartada (apartado 1 del SQL): euribor_raw con separador , (solo las 10 primeras columnas) e ipc_raw con separador ;. Después comprueba que se leen: SELECT COUNT(*) FROM demo_datalake_db.euribor_raw; (393) y SELECT COUNT(*) FROM demo_datalake_db.ipc_raw; (14.976).

Paso 4 · La CTAS macro_curated y las tres trampas

Apartado 2 del SQL: una clave común (año y mes) y un JOIN de las dos series. Tres trampas que el SQL de la presentación original no resolvía:

  1. CAST(valor AS DOUBLE) falla con la coma decimal del INE (Cannot cast '119,942' to DOUBLE): usa TRY_CAST(REPLACE(valor, ',', '.') AS DOUBLE).
  2. Sin filtrar el IPC la CTAS «funciona» pero sale mal: cada mes se multiplica por las 52 series y salen 14.976 filas en vez de 288, sin ningún error. Filtra WHERE grupo = 'Índice general' AND tipo_dato = 'Variación anual' (con tilde) en el CTE del IPC.
  3. El Euribor llega a 2026 y el IPC no: el INNER JOIN pierde esos meses (eso es lo que pide comparar con el LEFT JOIN).

Qué verás: macro_curated con 288 filas (de 2002-01 a 2025-12).

Paso 5 · Las preguntas (apartado 3 del SQL)

Qué debes ver: 74 meses con Euribor negativo; la mayor diferencia entre IPC y Euribor en 2022-03 (Euribor -0,2374, IPC 9,8, diferencia 10,037; le siguen 2022-07 y 2022-06).

«¿Cuál se movió antes?» El fichero incluye la correlación del Euribor de un mes con el IPC k meses después, con k de -12 a 12 (UNNEST(SEQUENCE(-12, 12)) y CORR): sale 0,651 con k = -12, 0,424 con k = 0 y 0,068 con k = +12, es decir, el IPC se mueve antes que el Euribor (la respuesta admite razonamiento).

Paso 6 · INNER JOIN frente a LEFT JOIN

INNER JOIN: 288 filas. LEFT JOIN desde el Euribor: 393 filas (con IPC solo 288: el Euribor tiene 105 meses sin IPC).

Errores frecuentes

Qué ves Causa Solución
Cannot cast '119,942' to DOUBLE El INE usa coma decimal TRY_CAST(REPLACE(valor, ',', '.') AS DOUBLE)
macro_curated sale con 14.976 filas en vez de 288 No filtraste la serie del IPC WHERE grupo = 'Índice general' AND tipo_dato = 'Variación anual'
El Euribor y el IPC no tienen las mismas filas Es normal: el Euribor llega a 2026 y el IPC a 2025 Compara INNER y LEFT JOIN (paso 6)
euribor_raw muestra las columnas desplazadas o vacías El CSV tiene 39 columnas y declaraste otras Declara solo las 10 primeras: TIME_PERIOD es la 9 y OBS_VALUE la 10
MALFORMED_QUERY / Only one sql statement is allowed Hay un comentario -- ... detrás de un ; en la misma línea Pon el comentario en la línea de encima o bórralo; ejecuta de una en una
Las rutas s3://BUCKET_AQUI/... fallan No sustituiste BUCKET_AQUI Pon el valor de echo "$BUCKET"

Limpieza

Solo lo de esta actividad, en este orden (el stack NO se borra aquí: se borra al final del Tema 4 desde 04.01, y debe ser lo último). Si vas a borrar el stack, todo esto se va con él.

  1. En Athena: DROP TABLE IF EXISTS demo_datalake_db.macro_curated;, DROP TABLE IF EXISTS demo_datalake_db.euribor_raw; y DROP TABLE IF EXISTS demo_datalake_db.ipc_raw; (solo borran la descripción).
  2. En CloudShell:
aws s3 rm "s3://$BUCKET/raw/euribor/" --recursive --region eu-north-1
aws s3 rm "s3://$BUCKET/raw/ipc/"     --recursive --region eu-north-1
rm -f euribor_ecb.csv ipc_ine.csv

Los ficheros de macro_curated están en s3://$BUCKET/athena-results/tables/<id>/ y se van con el stack.

Cómo sabes que has terminado

Anterior: 04.04 Calidad del aire de Madrid · Siguiente: 04.06 Optimizar y presupuesto