Spotify Text I/O – Python
Development
- Curso
- Especialización Python EOI
- Módulo
- Lenguaje
- Tecnologías
- Python, Text I/O, CSV
Usar Python para leer/escribir CSV
Fue el primer proyecto que hicimos con Python en el Curso de Especialización de la EOI. Consistió en hacer un pequeño mod, usando el lenguaje python sin usar librerías externas para acceder y modificar un csv a través de la shell.
Puedes encontrar el código fuente aquí, en la carpeta entregables:
Requerimientos e instrucciones:
El objetivo del miniproyecto es integrar la mayoría de los elementos del lenguaje de programación Python vistos hasta ahora e implementar una pequeña base de datos para canciones de Spotify utilizando el paradigma de orientación a objetos.
🎧 Fichero de datos
Vamos a partir de un fichero de datos extraído de Kaggle que contiene las 50 canciones más escuchadas en el mundo en Spotify durante el año 2019.
He limpiado este fichero para quedarnos únicamente con los datos que nos interesan. Las columnas con las que vamos a trabajar son las siguientes:
- Col. 0 ➡️
Track Name
: nombre de la canción (cadena de texto). - Col. 1 ➡️
Artist Name
: nombre del artista (cadena de texto). - Col. 2 ➡️
Genre
: género de la canción (cadena de texto). - Col. 3 ➡️
Beats Per Minute
: tempo de la canción (valor entero). - Col. 4 ➡️
Energy
: indica lo “energética” que es la canción (valor entero). - Col. 5 ➡️
Danceability
: indica lo “bailable” que es la canción (valor entero). - Col. 6 ➡️
Length
: duración de la canción (valor entero).
✍🏻 Requisitos del programa
Nuestro programa permitirá modificar la velocidad de las canciones variando sus bpm (beats per minute) o pulsaciones por minuto.
Ejemplos de ejecución:
> python mod_bpm.py 10 # increase songs in 10bpm
> python mod_bpm.py -25 # decrease songs in 25bpm
🥏 Código a implementar
spotify.py
class Song:
def __init__(self, track, artist, genre, bpm, energy, danceability, length):
# your code here
def __str__(self):
# your code here
def change_speed(self, relative_bpm):
# your code here
@staticmethod
def load_songs(path):
# your code here
return songs
@staticmethod
def save_songs(songs, path):
# your code here
mod_bpm.py
import sys
from spotify import Song
'''Information about headers in datafile
0: track name
1: artist name
2: genre
3: beats per minute
4: energy
5: danceability
6: length'''
input_file = '../files/top50.csv'
output_file = '../files/top50_mod.csv'
relative_bpm = int(sys.argv[1]) # read keyboard input
# load songs (from input_file)
# change speed of all songs
# save songs (to output_file)
🍩 Detalles de implementación
__init__
Constructor de la clase para almacenar parámetros.
__str__
El formato de salida debe ser una línea con los campos separados por comas, tal y como está definido en el fichero de entrada.
load_songs
Leer el fichero de datos, crear un objeto de tipo Song
por cada línea del fichero y devolver una lista con todas las canciones (objetos).
save_songs
El parámetro songs
será una lista de canciones. Almacenar todas las canciones en el fichero de salida con el mismo formato que el fichero de entrada. Utilizar de forma implícita la llamada al método __str__
de cada objeto.
change_speed
Actualizar parámetros:
Si aumentamos en $x$ bpms una determinada canción, el resto de parámetros se actualiza así:
- La energía aumenta en $2x$
- La bailavilidad aumenta en $3x$
- La longitud disminuye en $x$
Si disminuimos en $y$ bpms una determinada canción, el resto de parámetros se actualiza así:
- La energía disminuye en $2y$
- La bailavilidad disminuye en $3y$
- La longitud aumenta en $y$
🔍 Comprobación de resultados
Para comprobar si tu programa está funcionando bien, te dejo la salida de dos ejecuciones:
> python mod_bpm.py 10
➡️ top50_mod_plus10.csv> python mod_bpm.py -5
➡️ top50_mod_minus5.csv
La forma más sencilla es comparar el fichero de salida de tu programa top50_mod.csv
con el correspondiente de los anteriores. La herramienta diff
compara dos ficheros y nos dice si son exactamente iguales:
> diff -s top50_mod.csv top50_mod_plus10.csv
Files top50_mod.csv and top50_mod_plus10.csv are identical
> diff -s top50_mod.csv top50_mod_minus5.csv
Files top50_mod.csv and top50_mod_minus5.csv are identical
📊 Rúbrica de evaluación
Fichero | Item | Valoración |
---|
- | Salida correcta | 30%
mod_bpm.py
| Carga de canciones | 5%mod_bpm.py
| Modificación de velocidad | 5%mod_bpm.py
| Escritura de canciones | 5%spotify.py
|__init__
| 5%spotify.py
|__str__
| 5%spotify.py
|change_speed
| 10%spotify.py
|load_songs
| 20%spotify.py
|save_songs
| 15%