# 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](../04.01-creardatalake/README.md)): los CSV en `s3:///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](../04.01-creardatalake/README.md) (stack `g214-datalake-demo` creado, región `eu-north-1`). No depende de 04.02, 04.03 ni 04.04. Cómo leer Data scanned: [04.02](../04.02-titanic/README.md#cómo-leer-data-scanned-en-athena). - Workgroup `demo-athena-workgroup` y base `demo_datalake_db` seleccionados en Athena. ## 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: ```bash 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 ```bash 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_raw` declara 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). ```bash 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](../04.01-creardatalake/README.md), 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: ```bash 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//` y se van con el stack. ## Cómo sabes que has terminado - [ ] `macro_curated` tiene 288 filas (2002-01 a 2025-12). - [ ] Tienes 74 meses de Euribor negativo y la mayor diferencia en 2022-03. - [ ] `INNER JOIN` da 288 filas y `LEFT JOIN` 393, 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](../04.04-airemadrid/README.md) · Siguiente: [04.06 Optimizar y presupuesto](../04.06-optimizarpresupuesto/README.md)