|
1 | | -# Interactuando con la API de Spotify |
| 1 | +# Interactuando con la API v2 del World Bank |
2 | 2 |
|
3 | | -Spotify se puede utilizar como fuente de datos para varios proyectos de ciencia de datos. En este ejercicio, aprenderemos a interactuar con la API de esta red social. `Spotipy` es una librería de código abierto y para Python que permite hacer un uso a alto nivel de la API de Spotify. |
| 3 | +En este proyecto vas a construir un flujo de datos completo: consumo de API, transformacion a DataFrame, analisis visual y carga a base de datos SQL. |
4 | 4 |
|
5 | | -## Paso 1: Crear una cuenta de desarrollador de Spotify |
| 5 | +## Contexto del ejercicio |
6 | 6 |
|
7 | | -Antes de comenzar a programar, necesitas acceso a las credenciales de desarrollador de Spotify. Visita [developer.spotify.com](https://developer.spotify.com/documentation/web-api). |
| 7 | +Trabajaras con la API publica del World Bank v2 (sin autenticacion). El objetivo es analizar la evolucion socioeconomica y ambiental de 5 paises elegidos por ti entre 2010 y 2024. |
8 | 8 |
|
9 | | -- Inicia sesión con tu cuenta de Spotify (o crea una si aún no tienes una). |
| 9 | +### Seleccion del dataset |
10 | 10 |
|
11 | | -- Ve a Dashboard y haz clic en Create an App. Completa los campos requeridos. En Redirect URI, escribe: `http://localhost/` |
| 11 | +1. Elige 5 paises (ISO3) que te interesen. |
| 12 | +2. Elige los indicadores que quieras analizar. |
| 13 | +3. Recomendacion de indicadores (opcional): |
12 | 14 |
|
| 15 | +- `SP.POP.TOTL`: Poblacion total |
| 16 | +- `NY.GDP.PCAP.CD`: PIB per capita (USD actuales) |
| 17 | +- `EN.ATM.CO2E.PC`: Emisiones de CO2 per capita (toneladas metricas) |
| 18 | +- `SP.DYN.LE00.IN`: Esperanza de vida al nacer (anios) |
13 | 19 |
|
14 | | - |
| 20 | +API base: `https://api.worldbank.org/v2` |
15 | 21 |
|
| 22 | +## Requisitos tecnicos |
16 | 23 |
|
17 | | -Una vez creada la app, dirígete a la sección **Settings** para copiar tu `Client ID` y `Client Secret`. Los usarás más adelante para autenticarte ante la API. |
| 24 | +Debes trabajar en un archivo `.ipynb` y usar: |
18 | 25 |
|
19 | | -## Paso 2: Configuración inicial |
| 26 | +- `requests` |
| 27 | +- `pandas` |
| 28 | +- `matplotlib` y/o `seaborn` |
| 29 | +- `sqlalchemy` |
20 | 30 |
|
21 | | -- Abre la terminal y asegúrate de tener instalada la librería `Spotipy`, que es la que usaremos para conectarnos con la API de Spotify: |
| 31 | +## Paso 1: Preparar entorno |
22 | 32 |
|
23 | | - ```bash |
24 | | - pip install spotipy |
25 | | - ``` |
| 33 | +Instala dependencias: |
26 | 34 |
|
27 | | -## Paso 3: Variables de entorno |
28 | | - |
29 | | -Ya tienes el archivo `.env` en la raíz del proyecto. Asegúrate de que contenga las siguientes variables con tus credenciales de Spotify (reemplaza el contenido con tus propios datos): |
30 | | - |
31 | | -```env |
32 | | -CLIENT_ID=your_client_id |
33 | | -CLIENT_SECRET=your_client_secret |
| 35 | +```bash |
| 36 | +pip install requests pandas matplotlib seaborn sqlalchemy |
34 | 37 | ``` |
35 | 38 |
|
36 | | -> ⚠️ Es importante que coloques tus datos en las variables de entorno para evitar exponer tus credenciales si subes el proyecto a un repositorio. |
37 | | - |
38 | | -Ahora, en el archivo `app.py`, agrega el siguiente código para leer las variables de entorno: |
39 | | - |
40 | | -```python |
41 | | -import os |
42 | | -import pandas as pd |
43 | | -import seaborn as sns |
44 | | -from dotenv import load_dotenv |
45 | | -
|
46 | | -# load the .env file variables |
47 | | -load_dotenv() |
| 39 | +Crea un notebook, por ejemplo: `src/world_bank_analysis.ipynb`. |
48 | 40 |
|
49 | | -# Get credential values |
50 | | -client_id = os.environ.get("CLIENT_ID") |
51 | | -client_secret = os.environ.get("CLIENT_SECRET") |
52 | | -``` |
| 41 | +## Paso 2: Explorar la API |
53 | 42 |
|
54 | | -Con esto, tus credenciales estarán listas para ser utilizadas en la autenticación con la API de Spotify. |
| 43 | +Revisa estos endpoints de referencia: |
55 | 44 |
|
| 45 | +- Paises: `https://api.worldbank.org/v2/country` |
| 46 | +- Indicadores: `https://api.worldbank.org/v2/indicator` |
56 | 47 |
|
57 | | -## Paso 4: Inicializar la biblioteca Spotipy |
| 48 | +Verifica la estructura de respuesta. La API pagina resultados (habitualmente hasta `per_page=50`), asi que debes pensar una estrategia para recorrer paginas y almacenar toda la informacion necesaria. |
58 | 49 |
|
59 | | -- Importar Spotipy. |
60 | | -- Realizar la conexión con la API. Para ello, puedes utilizar la función `spotipy.Spotify()`. |
| 50 | +Request de ejemplo en Python (plantilla): |
61 | 51 |
|
62 | 52 | ```python |
63 | | -import spotipy |
64 | | -from spotipy.oauth2 import SpotifyClientCredentials |
65 | | - |
66 | | -auth_manager = SpotifyClientCredentials(client_id=client_id, client_secret=client_secret) |
67 | | -spotify = spotipy.Spotify(auth_manager=auth_manager) |
| 53 | +import requests |
| 54 | + |
| 55 | +url = "https://api.worldbank.org/v2/country" |
| 56 | +params = { |
| 57 | + "format": "json", |
| 58 | + "per_page": 50, |
| 59 | + "page": 1 |
| 60 | +} |
| 61 | + |
| 62 | +response = requests.get(url, params=params, timeout=30) |
| 63 | +response.raise_for_status() |
| 64 | +payload = response.json() |
| 65 | + |
| 66 | +# payload[0] -> metadatos de paginacion |
| 67 | +# payload[1] -> datos de la pagina actual |
| 68 | +print("Metadatos:", payload[0]) |
| 69 | +print("Primer elemento:", payload[1][0]) |
68 | 70 | ``` |
69 | 71 |
|
70 | | -> 💡 NOTA: Utiliza la siguiente documentación como guía sobre los parámetros: https://spotipy.readthedocs.io/en/2.22.1 |
71 | | -
|
72 | | -## Paso 5: Realizar solicitudes a la API |
73 | | - |
74 | | -- Comienza a interactuar con la API de Spotify: Obtén de tu artista favorito, el top 10 de sus canciones. Para ello, tendrás que buscar el `ID` del artista para usarlo en la librería. Este identificador es la dirección web que tiene el artista en Spotify: |
75 | | - |
76 | | - |
77 | | - |
78 | | -- Una vez tengas la respuesta de la API, quédate con el elemento `tracks`, que contendrá las canciones con más reproducciones del artista, quédate con el nombre de la canción, la popularidad y la duración (en minutos). |
79 | | - |
80 | | -> ⚠️ **NOTA** sobre posibles mensajes al ejecutar el código. Es posible que al finalizar la ejecución del script aparezca un mensaje como: |
81 | | -
|
82 | | -``` |
83 | | - Exception ignored in: <function Spotify.__del__ ...> |
84 | | - TypeError: isinstance() arg 2 must be a type, a tuple of types, or a union |
85 | | -``` |
86 | | - |
87 | | -Este mensaje proviene de la librería `spotipy` y **no afecta la funcionalidad de tu código ni los resultados de la API**. Puedes ignorarlo de forma segura; se trata de un detalle interno de limpieza de objetos (**garbage collection**) que no interrumpe tu análisis. |
88 | | - |
89 | | - |
90 | | -## Paso 6: Transformar a Pandas DataFrame |
91 | 72 |
|
92 | | -Puesto que el resultado obtenido en estos pasos es susceptible de tener formato de tabla, conviértelo en un DataFrame importando los datos en su formato de diccionario. A continuación, ordena las canciones por popularidad creciente y muestra el top 3 resultante. |
| 73 | +*IMPORTANTE:* El código mencionado arriba es orientativo. En el link de abajo tienes toda la información necesaria para llevar a cabo un llamado a la API: |
93 | 74 |
|
94 | | -## Paso 7: Analizar relación estadística |
| 75 | +https://datahelpdesk.worldbank.org/knowledgebase/articles/898581 |
95 | 76 |
|
96 | | -¿Tiene relación la duración con la popularidad? ¿Podríamos decir que una canción que dure poco tiempo puede ser más popular que otra que dure más? Analízalo graficando un `scatter plot` y argumenta tu respuesta. |
| 77 | +## Paso 3: Descargar datos |
97 | 78 |
|
| 79 | +Descarga series temporales 2010-2024 para los paises e indicadores que elegiste. |
98 | 80 |
|
99 | | -## ¿Te sientes con ganas de profundizar? 😎 |
100 | | -**Exploración avanzada de atributos musicales - Análisis extendido con enfoque interpretativo** |
| 81 | +Objetivo: |
101 | 82 |
|
102 | | -Si ya lograste conectarte a la API de Spotify, extraer información de tu artista favorito y representar datos básicos como popularidad y duración, te invitamos a realizar esta versión extendida del proyecto. Esta actividad opcional te permitirá incorporar nuevas variables musicales, aplicar pensamiento analítico y redactar conclusiones claras y bien fundamentadas a partir de los datos. |
| 83 | +- Consumir la API para varios paises e indicadores |
| 84 | +- Manejar paginacion cuando aplique |
| 85 | +- Guardar respuestas en una estructura temporal (lista de diccionarios) |
103 | 86 |
|
104 | | ---- |
| 87 | +## Paso 4: Transformar respuesta a DataFrames |
105 | 88 |
|
106 | | -### Propuesta 🚀 |
107 | | -Aprovecha que ya tienes acceso a los datos del artista para profundizar en el análisis incluyendo nuevas métricas que ofrece la API. El objetivo es detectar patrones o características interesantes y expresarlas en un lenguaje comprensible para cualquier lector. |
| 89 | +Crea una tabla (DataFrame) por indicador para facilitar comparaciones entre paises. |
108 | 90 |
|
109 | | -#### Variables recomendadas para explorar: |
| 91 | +Columnas sugeridas por tabla: |
110 | 92 |
|
111 | | -- **Danceability**: Qué tan fácil es bailar la canción. |
112 | | -- **Valence**: Qué tan positiva o feliz suena. |
113 | | -- **Energy**: Intensidad o fuerza general. |
114 | | -- **Tempo**: Velocidad (en BPM). |
| 93 | +- `country` |
| 94 | +- `year` |
| 95 | +- `value` |
115 | 96 |
|
116 | | ---- |
| 97 | +Limpieza minima: |
117 | 98 |
|
118 | | -1. **Recupera los atributos adicionales:** Utiliza el método `audio_features()` para obtener los atributos musicales de las canciones de tu artista: |
| 99 | +- Eliminar filas con `value` nulo cuando sea necesario |
| 100 | +- Convertir `year` a entero |
| 101 | +- Convertir `value` a numerico |
119 | 102 |
|
120 | | - ```python |
121 | | - track_ids = [track["id"] for track in results["tracks"]] |
122 | | - features = sp.audio_features(track_ids) |
123 | | - ``` |
| 103 | +## Paso 5: Analisis y visualizaciones |
124 | 104 |
|
125 | | -2. **Crea un nuevo DataFrame con la información completa:** Combina los datos obtenidos anteriormente (`nombre, popularidad, duración`) con las nuevas métricas. |
| 105 | +Genera al menos 2 graficos y explica hallazgos en celdas Markdown. |
126 | 106 |
|
127 | | -3. **Realiza un análisis sencillo:** Explora los valores promedio, busca extremos, identifica correlaciones visuales o estadísticamente. |
| 107 | +Ejemplos: |
128 | 108 |
|
129 | | - - ¿Qué valores destacan en este artista? |
| 109 | +1. Line chart: evolucion de un indicador por pais (2010-2024) |
| 110 | +2. Scatter plot: relacion entre dos indicadores para un anio reciente |
130 | 111 |
|
131 | | - - ¿Existe alguna tendencia entre popularidad y otro atributo? |
| 112 | +## Paso 6: Cargar resultados a base de datos SQL |
132 | 113 |
|
133 | | - - ¿Hay algo que no esperabas encontrar? |
| 114 | +Usa SQLite con SQLAlchemy para persistir datos: |
134 | 115 |
|
135 | | - Crea una gráfica sencilla que complemente tu conclusión. |
| 116 | +- Base de datos: `world_bank_analysis.db` |
| 117 | +- Recomendacion didactica: una tabla por indicador (ejemplo: `indicator_gdp_per_capita`, `indicator_life_expectancy`, etc.) |
136 | 118 |
|
137 | | -4. **Haz visible tu trabajo:** Con base en el análisis, redacta una o dos frases que sinteticen lo que descubriste y publicalo en LinkedIn. El objetivo es comunicar tu hallazgo de forma objetiva, breve y con respaldo en los datos. |
| 119 | +Flujo recomendado: |
138 | 120 |
|
139 | | - > **Ejemplo:** |
140 | | - > |
141 | | - > "Las canciones más populares del artista analizado tienen un nivel de “danceability” promedio de > 0.82, lo que sugiere una clara orientación hacia lo bailable. 🕺💃 #SpotifySecrets" |
| 121 | +1. Crear engine con SQLAlchemy |
| 122 | +2. Guardar cada DataFrame con `to_sql(..., if_exists="replace")` |
| 123 | +3. Leer una muestra con `pd.read_sql()` para validar carga |
142 | 124 |
|
| 125 | +## Cierre |
143 | 126 |
|
| 127 | +¡Ya tienes todo para comenzar! |
| 128 | +Tomate tu tiempo para investigar la documentacion de la API y entender bien la estructura de las respuestas. |
| 129 | +Si te surge cualquier duda durante el proceso, contacta a tus mentores. |
0 commit comments