# Tema 3 · 5 · Ejercicios 4 y 5: tipos de datos (países) e importar el Euribor Presentación del Tema 3: «Ejercicio 4» (países) y «Ejercicio 5», «Ejercicio 5 · paso a paso (II): cargar y comprobar» y «Ejercicio 5 · paso a paso (III): validar con una app (Streamlit)» (CSV del Euribor y validación con la app web). Duración: 15 minutos el ejercicio 4 y el 5, más unos 5 minutos para crear la máquina de la app del Euribor (el script lo hace todo). Coste: ninguno propio con la RDS y Adminer que ya tienes encendidos; la app corre en una máquina `euribor` (una `t3.small`, céntimos por hora, que se apaga sola a las 4 horas). > **Etiquetas de lo que creas.** La máquina `euribor` y su Security Group los crea `gestionar-euribor.sh` ya etiquetados (`curso` = `G214`, `universidad` = `CUNEF`, `actividad` = `03.05-paiseseuribor` y `script` = `gestionar-euribor.sh`); `eliminar` los borra por esas etiquetas. Usas además tu RDS ([03.01](../03.01-RDSMariaDB.md)). Más detalle (cómo etiquetar con la CLI, cómo buscar y qué hacer en una emergencia): [README principal](../../README.md), sección «Etiquetas». ## Qué vas a hacer Dos ejercicios de SQL sobre tu RDS. **Parte A (ejercicio 4):** crear la base `paises`, comprobar por qué ordenar un número guardado como texto da un orden incorrecto y arreglarlo cambiando el tipo de la columna. **Parte B (ejercicio 5):** crear la base `banco`, importar la serie mensual del Euribor desde un CSV con Adminer, contrastar cifras con SQL y validar visualmente los datos con una app Streamlit que corre en tu máquina EC2 `euribor` (la crea `gestionar-euribor.sh`). ``` Parte A: SQL en Adminer ──> RDS: base paises (tabla countries) Parte B: euribor.csv ──(Import en Adminer)──> RDS: base banco, tabla euribor (381 filas) ▲ EC2 «euribor» (Streamlit, puerto 8501) ──3306── gráfico fecha/valor ``` **Qué se crea en AWS:** una EC2 `euribor` (Amazon Linux 2023, `t3.small`), un Security Group (puertos 22 y 8501) y un bucket temporal con los ficheros de la app (`app.py` y `requirements.txt`), todo con `./gestionar-euribor.sh crear`. Con `--rds` se añade la regla que deja a la máquina llegar a tu RDS. Se apaga sola a las 4 horas. Las bases `paises` y `banco` viven en tu RDS. ## Qué contiene esta carpeta | Fichero | Para qué sirve | En qué paso se usa | |---|---|---| | `ejercicios.txt` | SQL para copiar y pegar con el resultado esperado en comentarios: ejercicio 4 (países) y ejercicio 5 (`banco`, `euribor`, medias por año, máximo y reto) | Pasos 1 a 6 | | `euribor.csv` | Serie mensual del Euribor ya limpia: 381 líneas, **sin cabecera**, tres columnas (fecha, periodo, valor) | Paso 3 | | `app.py` | La app Streamlit (visor `fecha` / `valor` de una tabla SQL; solo lee). Copia de referencia del que lleva el script (`./gestionar-euribor.sh extraer` lo escribe) | Paso 7 | | `requirements.txt` | `streamlit`, `pandas`, `SQLAlchemy`, `pymysql` y `psycopg2-binary` (sin versión fija para `streamlit`: la máquina instala la última al crearse) | Paso 7 | | `README.md` | Esta guía | Siempre | ## Antes de empezar - [ ] RDS MariaDB `Available` ([03.01](../03.01-RDSMariaDB.md)) y Adminer conectado ([03.02](../03.02-adminer/README.md)). - [ ] Los ficheros `.txt` y `.csv` están en tu PC; ábrelos con un editor de texto, no con Excel (Excel pierde formatos). - [ ] (Para los pasos 7 y 8) Tu RDS (la de [03.01](../03.01-RDSMariaDB.md)); en el paso 7 crearás la máquina con `--rds nombre-de-tu-rds`. No hace falta que la RDS sea pública ni abrir su Security Group a tu IP: el script deja pasar solo a la máquina. - Variables de entorno: ninguna. Los datos de conexión se escriben en la barra lateral de la app. - La parte A es independiente de la actividad [03.03](../03.03-sqlestudiantes/README.md), pero su ejercicio 2B (`JOIN`) usa la base `paises` que se crea aquí: si quieres hacerlo, vuelve a él después. ## Cómo llevar los ficheros a donde toque El SQL y el CSV se llevan a Adminer desde tu PC (copiar y pegar en **SQL command**, o el enlace **Import** de una tabla). La app del Euribor **no se instala ni se copia**: la crea `gestionar-euribor.sh`, que lleva `app.py` dentro (desde CloudShell, con la carpeta de esta actividad descomprimida). ## Paso a paso ### Parte A. Ejercicio 4: países **Paso 1. Crear la base y la tabla.** Pega en **SQL command** el bloque `Ejercicio 4` de `ejercicios.txt` (borra y recrea la base `paises` para poder repetir el ejercicio; crea `countries` con 5 países). Ejecútalo por partes si quieres ver cada resultado. Qué verás: `SELECT country_id, country_name FROM countries WHERE region_id = 1 ORDER BY country_name;` devuelve Greece (7) y Spain (1). **Paso 2. Orden por población: el problema y el arreglo.** `country_population` está guardada como `text`: al ordenarla, Austria (9.1) sale la **última** aunque sea la menor (se ordena como texto). El arreglo es pasar la columna a número (con `NOT NULL`: sin él, la columna lo pierde) con el `ALTER TABLE ... MODIFY country_population DECIMAL(6,2) NOT NULL;` del fichero. Repite el `SELECT ... ORDER BY country_population`. Qué verás: ahora Austria sale la primera: Austria 9.10, Greece 10.30, Spain 48.60, Italy 59.00, France 68.40. ### Parte B. Ejercicio 5: CSV del Euribor **Paso 3. Crear `banco.euribor` e importar `euribor.csv`.** 1. Crea la base `banco` y la tabla `euribor` con el SQL de la presentación (o el bloque `Ejercicio 5` de `ejercicios.txt`, que borra y recrea la base `banco`: se puede repetir). 2. Importa: en Adminer, elige la base `banco` > la tabla `euribor` > **select data** > el enlace **Import** (está al pie de la página, plegado) > elige `euribor.csv` > separador `CSV,` > **Import**. **No** es el **Import** del menú de la izquierda: ese es para ficheros `.sql`. 3. El fichero ya está preparado: 381 líneas, **sin cabecera**, separador coma, punto decimal, fechas `AAAA-MM-DD` y cada campo entre comillas dobles, con las tres columnas en el orden de la tabla (`fecha`, `periodo`, `valor`). Las comillas no dan problema. Si descargas tú la serie del BCE, tendrás que limpiarla como explica la diapositiva; `euribor.csv` te sirve de respaldo o para contrastar el formato. Qué verás: `381 rows have been imported`. El número de filas de la tabla debe coincidir con las líneas del fichero, **381** (si sale una más, has importado una cabecera). Se comprueba con `SELECT COUNT(*) FROM euribor;`. **Paso 4. Contrastar cifras.** Usa las sentencias del bloque `Ejercicio 5` de `ejercicios.txt`. Qué verás: mínimo -0.5047, máximo 8.0200 (el 1995-03-31 en este fichero, que usa el **último día de cada mes**); media por año (entre otras): 2005 2.3342, 2021 -0.4906, 2022 1.0877 y 2023 3.8628 (son medias anuales, no máximos); máximo histórico `1995-03-31 8.0200`. Reto opcional (año con la subida más fuerte, diferencia de medias anuales): 2023, media 3.8628, subida 2.7751. Si prefieres descargar tú la serie del BCE: `https://data-api.ecb.europa.eu/service/data/FM/M.U2.EUR.RT.MM.EURIBOR1YD_.HSTA?format=csvdata` devuelve un CSV de 393 filas con **una sola cabecera** de 40 columnas (no varias líneas de metadatos); de él solo te interesan `TIME_PERIOD` (con formato `1994-01`: tienes que añadirle el día para tener una fecha; `euribor.csv` usa el último día del mes, `1994-01-31`, pero también vale el día 1, `1994-01-01`: las medias por año salen iguales y solo cambia la fecha del máximo, 1995-03-31 o 1995-03-01) y `OBS_VALUE`, y tienes que construir la columna `periodo`. Ojo: la serie actual tiene **393 meses** (hasta 2026-09), no 381, así que con tu propio CSV el `COUNT(*)` será otro; los 381 y las cifras de arriba son los de `euribor.csv`. **Paso 5. Si te equivocas al importar.** Si importas dos veces, tendrás las filas duplicadas (la tabla no tiene clave primaria). Vacía la tabla con `TRUNCATE TABLE euribor;` e importa una sola vez. **Paso 6 (opcional). Ficheros grandes.** `euribor.csv` pesa 12 KB y cabe siempre. Si Adminer rechaza el fichero, mira `Maximum allowed file size` en «Errores frecuentes». **Paso 7. Validar con la app Streamlit en tu EC2.** En CloudShell, dentro de esta carpeta (con el nombre de **tu** RDS; tarda unos 5 minutos): ```bash ./gestionar-euribor.sh crear --rds nombre-de-tu-rds ``` Qué verás: el recuadro **Tu app del Euribor** con `http://IP:8501`; la app puede tardar 1-2 minutos más en responder tras crear (`./gestionar-euribor.sh estado` te dice `HTTP 200` cuando ya está lista). Si la máquina se apagó (a las 4 horas), `./gestionar-euribor.sh crear` la arranca y renueva el plazo (la IP cambia: usa la nueva). **Paso 8. Usar la app.** 1. En la barra lateral, **Conexión**: `Tipo de BD` = `MySQL / MariaDB`; **Host** = tu endpoint (sustituye el texto ``); **Puerto** `3306`; **Usuario** `admin`; **Contraseña**. Pulsa **Conectar**. Debe salir `Conexión OK (modo listado). Elige la base de datos abajo.` 2. Elige la base en **Base de datos** (si existe `banco`, sale ya seleccionada) y pulsa **Usar esta base**. Debe salir `Conectado a la base banco`. 3. Elige la **Tabla** (si existe `euribor`, sale seleccionada). La tabla tiene que tener columnas `fecha` y `valor` (da igual mayúsculas o minúsculas). 4. Aparecen el filtro de rango de fechas, la vista previa (primeras 50 filas), el gráfico, los estadísticos y el botón de descarga del CSV. Si el gráfico se dibuja, los tipos de datos de tu tabla son correctos. **Refrescar datos** vuelve a leer la tabla. Avisos de la app: `La tabla seleccionada no contiene columnas requeridas 'Fecha' y 'Valor'` (la tabla no tiene esas columnas), `No hay tablas en esta base/schema.` (has elegido otra base: elige `banco` y pulsa **Usar esta base**), `No se pudieron obtener fechas mín/máx` (tabla vacía o fechas mal cargadas) y `No se pudo conectar` con el detalle del error. Si abres la app antes de crear `banco` o de importar el CSV y luego no aparecen la base o la tabla, la app ha guardado en memoria las listas antiguas: en la app abre el menú ☰ (arriba a la derecha), elige **Clear cache**, recarga la página y conecta de nuevo. ## Errores frecuentes | Síntoma | Causa | Solución | |---|---|---| | `Error 1146 Table '...' doesn't exist` al pegar el ejercicio 4 o 5 | Falta `CREATE DATABASE`/`USE` o se pegó sin `;` | Usa los bloques de `ejercicios.txt` (llevan `CREATE DATABASE`, `USE` y `;`) | | Error al pegar un bloque desde el PowerPoint | PowerPoint mete caracteres no imprimibles | Copia el bloque de `ejercicios.txt` | | `euribor` tiene más filas que líneas tiene el CSV | Se importó una cabecera, o se importó dos veces | `TRUNCATE TABLE euribor;` e importa una sola vez un CSV sin cabecera | | Importaste con el **Import** del menú izquierdo y falla | Ese Import es para ficheros `.sql` | Usa el enlace **Import** al pie de **select data** de la tabla | | `Unable to upload a file. Maximum allowed file size is 2MB.` | Adminer con los límites de PHP por defecto | Ver [03.02](../03.02-adminer/README.md) (con los scripts actuales no debería pasar para un fichero de 12 KB) | | `No se pudo conectar` con un error largo debajo | La máquina se creó sin `--rds` (no puede llegar a la RDS), endpoint mal escrito o contraseña incorrecta | `./gestionar-euribor.sh crear --rds NOMBRE` (añade el acceso sin duplicar nada) y revisa el endpoint | | `http://IP:8501` no abre | La máquina está parada o instalando, o tu red bloquea el puerto 8501 o las direcciones IP directas | `./gestionar-euribor.sh estado` (si está parada, `crear` la arranca); espera 1-2 minutos; prueba desde otra red (por ejemplo, el móvil como punto de acceso) | | `banco` o `euribor` no aparecen en las listas de la app | La app guarda en memoria las listas antiguas (creaste la base o la tabla después de abrirla) | Menú ☰ > **Clear cache**, recarga la página y conecta de nuevo | | `No hay tablas en esta base/schema.` | Has elegido otra base | Elige `banco` y pulsa **Usar esta base** | | `La tabla seleccionada no contiene columnas requeridas 'Fecha' y 'Valor'` | La tabla no tiene esas columnas | Revisa la tabla `euribor` (columnas `fecha`, `periodo`, `valor`) | | `No se pudieron obtener fechas mín/máx` | La tabla está vacía o las fechas están mal cargadas | Reimporta el CSV (paso 3) | Esta app sí funciona con una RDS MariaDB 11.x (se conecta cifrada), a diferencia de la web `estudiantes.php` de [03.04](../03.04-webappexportar/README.md). ## Limpieza La app del Euribor corre en su propia máquina, que se borra con: `./gestionar-euribor.sh eliminar` (borra la máquina, el Security Group, el acceso a tu RDS y los ficheros temporales; es repetible). Si no la borras, se apaga sola a las 4 horas, pero no se elimina. Las bases `paises` y `banco` viven en tu RDS y se van con ella. La RDS y Adminer **no** se borran aquí: Adminer en la limpieza de [03.02](../03.02-adminer/README.md) y la RDS en la de [03.01](../03.01-RDSMariaDB.md), después de la última actividad que las use (03.09). ## Cómo sabes que has terminado - [ ] Ejercicio 4: tras cambiar el tipo de `country_population`, el orden por población es Austria, Greece, Spain, Italy, France. - [ ] `banco.euribor` tiene 381 filas con `euribor.csv` (mínimo -0.5047, máximo 8.0200, media de 2023 = 3.8628). - [ ] La app del Euribor (`app.py`, en tu máquina `euribor`) conecta, elige `banco.euribor` y dibuja el gráfico. - [ ] Has ejecutado `./gestionar-euribor.sh eliminar` (o sabes que la máquina se apaga sola a las 4 horas y la borrarás al terminar). Anterior: [03.04 · Web app y ejercicio 3](../03.04-webappexportar/README.md) · Siguiente: [03.06 · ACID y rigidez de esquema](../03.06-acidrigidez/README.md)