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
- Necesitas el Data Lake de 04.01 Crear el Data Lake (stack
g214-datalake-democreado, regióneu-north-1). No depende de 04.02, 04.03 ni 04.04. Cómo leer Data scanned: 04.02. - Workgroup
demo-athena-workgroupy basedemo_datalake_dbseleccionados en Athena.
Cómo llevar los ficheros a CloudShell
- En tu PC, comprime esta carpeta (
04.05-euriboripc) en un zip y no la descomprimas. - En CloudShell (región
eu-north-1): Actions > Upload file >04.05-euriboripc.zip. - 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 concd ~/g214-materiales/tema4/04.05-euriboripcy, si algún fichero daPermission 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
- BCE, Euribor a 1 año, mensual:
https://data-api.ecb.europa.eu/service/data/FM/M.U2.EUR.RT.MM.EURIBOR1YD_.HSTA?format=csvdata(145 KB; 393 filas, de 1994-01 a 2026-09). Trae 39 columnas: el periodo (2024-03) es la columna 9 (TIME_PERIOD) y el valor la 10 (OBS_VALUE);euribor_rawdeclara solo las 10 primeras. - INE, IPC (tabla 50902):
https://www.ine.es/jaxiT3/files/t/es/csv_bdsc/50902.csv?nocab=1(937 KB; 14.976 filas, de 2002M01 a 2025M12: esta tabla no tiene meses de 2026). Separador;, decimal con coma (119,942), BOM al inicio, 4 columnas (Grupos ECOICOP;Tipo de dato;Periodo;Total) y 52 series mezcladas (13 grupos x 4 tipos de dato x 288 meses).
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:
CAST(valor AS DOUBLE)falla con la coma decimal del INE (Cannot cast '119,942' to DOUBLE): usaTRY_CAST(REPLACE(valor, ',', '.') AS DOUBLE).- 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. - El Euribor llega a 2026 y el IPC no: el
INNER JOINpierde esos meses (eso es lo que pide comparar con elLEFT 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.
- En Athena:
DROP TABLE IF EXISTS demo_datalake_db.macro_curated;,DROP TABLE IF EXISTS demo_datalake_db.euribor_raw;yDROP TABLE IF EXISTS demo_datalake_db.ipc_raw;(solo borran la descripción). - 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
- [ ]
macro_curatedtiene 288 filas (2002-01 a 2025-12). - [ ] Tienes 74 meses de Euribor negativo y la mayor diferencia en 2022-03.
- [ ]
INNER JOINda 288 filas yLEFT JOIN393, y sabes explicar la diferencia. - [ ] Sabes explicar las tres trampas (coma decimal, series mezcladas, años distintos).
Anterior: 04.04 Calidad del aire de Madrid · Siguiente: 04.06 Optimizar y presupuesto