Files
1ereNSI/representation_construits/evaluation/TP01_Spotify.ipynb

477 lines
15 KiB
Plaintext
Raw Normal View History

{
"cells": [
{
"cell_type": "markdown",
"id": "cell-0",
"metadata": {},
"source": [
"# TP Évaluation - Gestion de Playlists Spotify\n",
"\n",
"**Durée : 1h30**\n",
"\n",
"**Nom :** \n",
"\n",
"**Prénom :**\n",
"\n",
"---\n",
"\n",
"Dans ce TP, vous allez manipuler des structures de données Python pour gérer des playlists musicales.\n",
"\n",
"**Compétences évaluées :**\n",
"- Manipulation de listes et dictionnaires\n",
"- Parcours et filtrage de données\n",
"- Écriture de fonctions"
]
},
{
"cell_type": "markdown",
"id": "cell-1",
"metadata": {},
"source": [
"## Données initiales\n",
"\n",
"Voici les données avec lesquelles vous allez travailler. **Exécutez cette cellule avant de commencer.**"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-2",
"metadata": {},
"outputs": [],
"source": [
"# Base de données de chansons\n",
"# Chaque chanson est un dictionnaire avec : titre, artiste, duree (en secondes), annee, streams\n",
"catalogue = [\n",
" {\"titre\": \"Blinding Lights\", \"artiste\": \"The Weeknd\", \"duree\": 203, \"annee\": 2020, \"streams\": 3500000000},\n",
" {\"titre\": \"Shape of You\", \"artiste\": \"Ed Sheeran\", \"duree\": 234, \"annee\": 2017, \"streams\": 3400000000},\n",
" {\"titre\": \"Dance Monkey\", \"artiste\": \"Tones and I\", \"duree\": 210, \"annee\": 2019, \"streams\": 2800000000},\n",
" {\"titre\": \"Rockstar\", \"artiste\": \"Post Malone\", \"duree\": 218, \"annee\": 2017, \"streams\": 2700000000},\n",
" {\"titre\": \"One Dance\", \"artiste\": \"Drake\", \"duree\": 173, \"annee\": 2016, \"streams\": 2600000000},\n",
" {\"titre\": \"Sunflower\", \"artiste\": \"Post Malone\", \"duree\": 158, \"annee\": 2018, \"streams\": 2500000000},\n",
" {\"titre\": \"Closer\", \"artiste\": \"The Chainsmokers\", \"duree\": 244, \"annee\": 2016, \"streams\": 2400000000},\n",
" {\"titre\": \"Starboy\", \"artiste\": \"The Weeknd\", \"duree\": 230, \"annee\": 2016, \"streams\": 2300000000},\n",
" {\"titre\": \"Perfect\", \"artiste\": \"Ed Sheeran\", \"duree\": 263, \"annee\": 2017, \"streams\": 2200000000},\n",
" {\"titre\": \"Heat Waves\", \"artiste\": \"Glass Animals\", \"duree\": 239, \"annee\": 2020, \"streams\": 2100000000},\n",
" {\"titre\": \"Bad Guy\", \"artiste\": \"Billie Eilish\", \"duree\": 194, \"annee\": 2019, \"streams\": 2000000000},\n",
" {\"titre\": \"Levitating\", \"artiste\": \"Dua Lipa\", \"duree\": 203, \"annee\": 2020, \"streams\": 1900000000},\n",
" {\"titre\": \"Save Your Tears\", \"artiste\": \"The Weeknd\", \"duree\": 216, \"annee\": 2020, \"streams\": 1800000000},\n",
" {\"titre\": \"Thinking Out Loud\", \"artiste\": \"Ed Sheeran\", \"duree\": 281, \"annee\": 2014, \"streams\": 1700000000},\n",
" {\"titre\": \"Stay\", \"artiste\": \"The Kid LAROI\", \"duree\": 141, \"annee\": 2021, \"streams\": 1600000000}\n",
"]\n",
"\n",
"# Playlist de l'utilisateur (initialement vide)\n",
"ma_playlist = []"
]
},
{
"cell_type": "markdown",
"id": "cell-3",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 1 - Exploration du catalogue (25 min)\n",
"\n",
"### 1.1 Affichage formaté (4 pts)\n",
"\n",
"Écrivez une fonction `afficher_chanson(chanson)` qui prend un dictionnaire représentant une chanson et affiche ses informations.\n",
"\n",
"Exemple de sortie attendue :\n",
"```\n",
"Blinding Lights - The Weeknd (2020) | 3:23\n",
"```\n",
"\n",
"*Aide : la durée est en secondes. Pour convertir : minutes = duree // 60, secondes = duree % 60*"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-4",
"metadata": {},
"outputs": [],
"source": [
"def afficher_chanson(chanson):\n",
" # Récupérer les informations\n",
" titre = chanson[\"titre\"]\n",
" artiste = chanson[\"artiste\"]\n",
" annee = chanson[\"annee\"]\n",
" duree = chanson[\"duree\"]\n",
" \n",
" # Convertir la durée en minutes:secondes\n",
" minutes = duree // 60\n",
" secondes = duree % 60\n",
" \n",
" # Afficher (compléter le print)\n",
" # Votre code ici\n",
" pass\n",
"\n",
"# Test\n",
"afficher_chanson(catalogue[0])"
]
},
{
"cell_type": "markdown",
"id": "cell-5",
"metadata": {},
"source": [
"### 1.2 Statistiques de base (4 pts)\n",
"\n",
"Écrivez une fonction `statistiques_catalogue(liste_chansons)` qui renvoie un dictionnaire contenant :\n",
"- `\"nombre\"` : le nombre total de chansons\n",
"- `\"duree_totale\"` : la durée totale en secondes\n",
"- `\"streams_total\"` : le nombre total de streams"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-6",
"metadata": {},
"outputs": [],
"source": [
"def statistiques_catalogue(liste_chansons):\n",
" nombre = 0\n",
" duree_totale = 0\n",
" streams_total = 0\n",
" \n",
" for chanson in liste_chansons:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return {\n",
" \"nombre\": nombre,\n",
" \"duree_totale\": duree_totale,\n",
" \"streams_total\": streams_total\n",
" }\n",
"\n",
"# Test\n",
"stats = statistiques_catalogue(catalogue)\n",
"print(\"Nombre de chansons :\", stats[\"nombre\"])\n",
"print(\"Duree totale :\", stats[\"duree_totale\"], \"secondes\")\n",
"print(\"Streams total :\", stats[\"streams_total\"])"
]
},
{
"cell_type": "markdown",
"id": "cell-7",
"metadata": {},
"source": [
"### 1.3 Liste des artistes (4 pts)\n",
"\n",
"Écrivez une fonction `artistes_uniques(liste_chansons)` qui renvoie la **liste sans doublons** de tous les artistes présents dans le catalogue, triée par ordre alphabétique.\n",
"\n",
"*Aide : vous pouvez utiliser `liste.sort()` pour trier une liste, et vérifier si un élément est déjà dans la liste avec `if element not in liste`*"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-8",
"metadata": {},
"outputs": [],
"source": [
"def artistes_uniques(liste_chansons):\n",
" artistes = []\n",
" \n",
" for chanson in liste_chansons:\n",
" artiste = chanson[\"artiste\"]\n",
" # Ajouter l'artiste s'il n'est pas déjà dans la liste\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Trier la liste\n",
" artistes.sort()\n",
" return artistes\n",
"\n",
"# Test\n",
"print(\"Artistes :\", artistes_uniques(catalogue))"
]
},
{
"cell_type": "markdown",
"id": "cell-9",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 2 - Gestion de playlist (35 min)\n",
"\n",
"### 2.1 Recherche de chansons (5 pts)\n",
"\n",
"Écrivez une fonction `rechercher_par_artiste(liste_chansons, artiste)` qui renvoie la liste des chansons d'un artiste donné."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-10",
"metadata": {},
"outputs": [],
"source": [
"def rechercher_par_artiste(liste_chansons, artiste):\n",
" resultats = []\n",
" \n",
" for chanson in liste_chansons:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return resultats\n",
"\n",
"# Test\n",
"print(\"Chansons de The Weeknd :\")\n",
"for c in rechercher_par_artiste(catalogue, \"The Weeknd\"):\n",
" afficher_chanson(c)"
]
},
{
"cell_type": "markdown",
"id": "cell-11",
"metadata": {},
"source": [
"### 2.2 Recherche par année (5 pts)\n",
"\n",
"Écrivez une fonction `rechercher_par_annee(liste_chansons, annee)` qui renvoie la liste des chansons d'une année donnée."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-12",
"metadata": {},
"outputs": [],
"source": [
"def rechercher_par_annee(liste_chansons, annee):\n",
" resultats = []\n",
" \n",
" for chanson in liste_chansons:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return resultats\n",
"\n",
"# Test\n",
"print(\"Chansons de 2020 :\")\n",
"for c in rechercher_par_annee(catalogue, 2020):\n",
" afficher_chanson(c)"
]
},
{
"cell_type": "markdown",
"id": "cell-13",
"metadata": {},
"source": [
"### 2.3 Ajouter et retirer des chansons (6 pts)\n",
"\n",
"Écrivez deux fonctions :\n",
"\n",
"1. `ajouter_a_playlist(playlist, chanson)` : ajoute une chanson à la playlist **si elle n'y est pas déjà** (vérification par le titre). Renvoie `True` si l'ajout a réussi, `False` sinon.\n",
"\n",
"2. `retirer_de_playlist(playlist, titre)` : retire la chanson ayant ce titre de la playlist. Renvoie `True` si la suppression a réussi, `False` si la chanson n'était pas dans la playlist."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-14",
"metadata": {},
"outputs": [],
"source": [
"def ajouter_a_playlist(playlist, chanson):\n",
" # Vérifier si la chanson est déjà dans la playlist\n",
" for c in playlist:\n",
" if c[\"titre\"] == chanson[\"titre\"]:\n",
" return False\n",
" \n",
" # Si on arrive ici, la chanson n'est pas dans la playlist\n",
" # Votre code ici\n",
" pass\n",
"\n",
"def retirer_de_playlist(playlist, titre):\n",
" # Chercher la chanson avec ce titre\n",
" for i in range(len(playlist)):\n",
" if playlist[i][\"titre\"] == titre:\n",
" # Votre code ici (utiliser del ou pop)\n",
" pass\n",
" \n",
" return False\n",
"\n",
"# Tests\n",
"ma_playlist = []\n",
"print(ajouter_a_playlist(ma_playlist, catalogue[0])) # True\n",
"print(ajouter_a_playlist(ma_playlist, catalogue[0])) # False (deja present)\n",
"print(ajouter_a_playlist(ma_playlist, catalogue[1])) # True\n",
"print(\"Playlist :\", len(ma_playlist), \"chansons\")\n",
"print(retirer_de_playlist(ma_playlist, \"Blinding Lights\")) # True\n",
"print(retirer_de_playlist(ma_playlist, \"Blinding Lights\")) # False\n",
"print(\"Playlist :\", len(ma_playlist), \"chansons\")"
]
},
{
"cell_type": "markdown",
"id": "cell-15",
"metadata": {},
"source": [
"### 2.4 Top artistes (6 pts)\n",
"\n",
"Écrivez une fonction `compter_streams_par_artiste(liste_chansons)` qui renvoie un **dictionnaire** où les clés sont les noms d'artistes et les valeurs sont leur nombre total de streams.\n",
"\n",
"*Aide : utilisez `dico.get(cle, 0)` pour récupérer une valeur avec une valeur par défaut de 0 si la clé n'existe pas*"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-16",
"metadata": {},
"outputs": [],
"source": [
"def compter_streams_par_artiste(liste_chansons):\n",
" streams_par_artiste = {}\n",
" \n",
" for chanson in liste_chansons:\n",
" artiste = chanson[\"artiste\"]\n",
" streams = chanson[\"streams\"]\n",
" \n",
" # Ajouter les streams au total de l'artiste\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return streams_par_artiste\n",
"\n",
"# Test\n",
"streams = compter_streams_par_artiste(catalogue)\n",
"print(\"Streams par artiste :\")\n",
"for artiste, total in streams.items():\n",
" print(\" \", artiste, \":\", total)"
]
},
{
"cell_type": "markdown",
"id": "cell-17",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 3 - Bonus (20 min)\n",
"\n",
"### 3.1 Chanson la plus populaire (4 pts)\n",
"\n",
"Écrivez une fonction `chanson_plus_populaire(liste_chansons)` qui renvoie la chanson (dictionnaire) ayant le plus de streams."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-18",
"metadata": {},
"outputs": [],
"source": [
"def chanson_plus_populaire(liste_chansons):\n",
" if len(liste_chansons) == 0:\n",
" return None\n",
" \n",
" meilleure = liste_chansons[0]\n",
" \n",
" for chanson in liste_chansons:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return meilleure\n",
"\n",
"# Test\n",
"top = chanson_plus_populaire(catalogue)\n",
"print(\"Chanson la plus populaire :\")\n",
"afficher_chanson(top)"
]
},
{
"cell_type": "markdown",
"id": "cell-19",
"metadata": {},
"source": [
"### 3.2 Trier par streams (4 pts)\n",
"\n",
"Écrivez une fonction `trier_par_streams(liste_chansons)` qui renvoie une **nouvelle liste** des chansons triées par nombre de streams décroissant.\n",
"\n",
"*Aide : utilisez `sorted(liste, key=..., reverse=True)`. La clé peut être une fonction lambda : `lambda c: c[\"streams\"]`*"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-20",
"metadata": {},
"outputs": [],
"source": [
"def trier_par_streams(liste_chansons):\n",
" # Votre code ici\n",
" pass\n",
"\n",
"# Test\n",
"print(\"Top 5 des chansons :\")\n",
"top5 = trier_par_streams(catalogue)[:5]\n",
"for c in top5:\n",
" afficher_chanson(c)"
]
},
{
"cell_type": "markdown",
"id": "cell-21",
"metadata": {},
"source": [
"### 3.3 Créer une playlist automatique (6 pts)\n",
"\n",
"Écrivez une fonction `creer_playlist_auto(liste_chansons, duree_max)` qui crée une playlist en ajoutant les chansons les plus populaires tant que la durée totale ne dépasse pas `duree_max` (en secondes).\n",
"\n",
"Renvoie la playlist créée."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cell-22",
"metadata": {},
"outputs": [],
"source": [
"def creer_playlist_auto(liste_chansons, duree_max):\n",
" # Trier par streams décroissant\n",
" chansons_triees = trier_par_streams(liste_chansons)\n",
" \n",
" playlist = []\n",
" duree_actuelle = 0\n",
" \n",
" for chanson in chansons_triees:\n",
" # Vérifier si on peut ajouter cette chanson\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return playlist\n",
"\n",
"# Test : playlist de 10 minutes max (600 secondes)\n",
"playlist_auto = creer_playlist_auto(catalogue, 600)\n",
"print(\"Playlist automatique :\")\n",
"duree_totale = 0\n",
"for c in playlist_auto:\n",
" afficher_chanson(c)\n",
" duree_totale = duree_totale + c[\"duree\"]\n",
"print(\"Duree totale :\", duree_totale, \"secondes\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.9.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
}