đŹ Mini-Projet : Analyseur de DonnĂ©es CinĂ©matographiques
đŻ Objectif du projet
Créer un programme Python qui analyse une base de données de films au format CSV et permet d'effectuer diverses recherches et statistiques.
Ce projet vous permettra de mettre en pratique toutes les compétences vues dans le cours : - Lecture de fichiers CSV - Projection et sélection de données - Agrégation et calculs statistiques - Tri de données - Interface utilisateur en ligne de commande
đ Organisation du projet
Créez un dossier analyseur_films contenant :
analyseur_films/
â
âââ films.csv â Base de donnĂ©es (Ă crĂ©er)
âââ logique.py â Fonctions de traitement (Ă complĂ©ter)
âââ interface.py â Interface utilisateur (Ă crĂ©er)
1. Création de la base de données
†Fichier films.csv
Créez un fichier films.csv avec le contenu suivant (vous pouvez ajouter vos propres films !) :
titre,realisateur,annee,duree,note,genre,pays
Inception,Christopher Nolan,2010,148,8.8,Science-fiction,USA
Interstellar,Christopher Nolan,2014,169,8.6,Science-fiction,USA
Le Parrain,Francis Ford Coppola,1972,175,9.2,Drame,USA
Pulp Fiction,Quentin Tarantino,1994,154,8.9,Policier,USA
The Dark Knight,Christopher Nolan,2008,152,9.0,Action,USA
Forrest Gump,Robert Zemeckis,1994,142,8.8,Drame,USA
Matrix,Lana et Lilly Wachowski,1999,136,8.7,Science-fiction,USA
Gladiator,Ridley Scott,2000,155,8.5,Action,USA
Le Fabuleux Destin d'Amélie Poulain,Jean-Pierre Jeunet,2001,122,8.3,Comédie,France
La Haine,Mathieu Kassovitz,1995,98,8.1,Drame,France
Intouchables,Olivier Nakache et Ăric Toledano,2011,112,8.5,ComĂ©die,France
Parasite,Bong Joon-ho,2019,132,8.6,Thriller,Corée du Sud
Spirited Away,Hayao Miyazaki,2001,125,8.6,Animation,Japon
Your Name,Makoto Shinkai,2016,106,8.4,Animation,Japon
La La Land,Damien Chazelle,2016,128,8.0,Comédie musicale,USA
2. Fonctions de traitement (logique.py)
Créez le fichier logique.py et implémentez les fonctions suivantes :
†Fonction 1 : Chargement des données
import csv
def charger_films(nom_fichier):
"""
Charge les données depuis un fichier CSV.
Retourne une liste de dictionnaires.
"""
# Ă COMPLĂTER
pass
Indice : Utilisez csv.DictReader et n'oubliez pas de convertir les types (annee, duree, note en nombres).
†Fonction 2 : Recherche par titre
def rechercher_par_titre(films, titre):
"""
Recherche un film par son titre (recherche partielle, insensible Ă la casse).
Retourne la liste des films correspondants.
Exemple : rechercher_par_titre(films, "dark")
doit trouver "The Dark Knight"
"""
# Ă COMPLĂTER
pass
Indice : Utilisez .lower() pour rendre la recherche insensible Ă la casse et in pour la recherche partielle.
†Fonction 3 : Films par réalisateur
def films_par_realisateur(films, realisateur):
"""
Retourne tous les films d'un réalisateur donné.
"""
# Ă COMPLĂTER
pass
†Fonction 4 : Films par période
def films_par_periode(films, annee_debut, annee_fin):
"""
Retourne les films sortis entre annee_debut et annee_fin (inclus).
"""
# Ă COMPLĂTER
pass
†Fonction 5 : Films par genre
def films_par_genre(films, genre):
"""
Retourne tous les films d'un genre donné.
"""
# Ă COMPLĂTER
pass
†Fonction 6 : Films par pays
def films_par_pays(films, pays):
"""
Retourne tous les films d'un pays donné.
"""
# Ă COMPLĂTER
pass
†Fonction 7 : Top films
def top_films(films, n=10):
"""
Retourne les n films les mieux notés (par défaut 10).
Les films sont triés par note décroissante.
"""
# Ă COMPLĂTER
pass
†Fonction 8 : Statistiques générales
def statistiques_generales(films):
"""
Retourne un dictionnaire contenant :
- nombre_total : nombre de films
- note_moyenne : note moyenne de tous les films
- duree_moyenne : durée moyenne des films
- film_le_mieux_note : dictionnaire du film avec la meilleure note
- film_le_plus_long : dictionnaire du film le plus long
- annee_la_plus_ancienne : année du film le plus ancien
- annee_la_plus_recente : année du film le plus récent
"""
# Ă COMPLĂTER
pass
†Fonction 9 : Statistiques par réalisateur
def statistiques_realisateur(films, realisateur):
"""
Retourne un dictionnaire contenant les statistiques pour un réalisateur :
- nombre_films : nombre de films réalisés
- note_moyenne : note moyenne de ses films
- meilleur_film : titre de son film le mieux noté
"""
# Ă COMPLĂTER
pass
†Fonction 10 : Réalisateurs les plus prolifiques
def realisateurs_prolifiques(films, n=5):
"""
Retourne les n réalisateurs ayant réalisé le plus de films.
Format : liste de tuples (realisateur, nombre_de_films)
triée par nombre décroissant.
"""
# Ă COMPLĂTER
# Indice : utilisez un dictionnaire pour compter les films par réalisateur
pass
3. Interface utilisateur (interface.py)
Créez un menu interactif permettant d'utiliser toutes les fonctions :
import logique
def afficher_menu():
"""Affiche le menu principal."""
print("\n" + "="*50)
print("đŹ ANALYSEUR DE FILMS đŹ")
print("="*50)
print("1. Rechercher un film par titre")
print("2. Films d'un réalisateur")
print("3. Films par période")
print("4. Films par genre")
print("5. Films par pays")
print("6. Top films")
print("7. Statistiques générales")
print("8. Statistiques d'un réalisateur")
print("9. Réalisateurs les plus prolifiques")
print("0. Quitter")
print("="*50)
def afficher_films(films):
"""Affiche une liste de films de maniÚre formatée."""
if not films:
print("â Aucun film trouvĂ©.")
return
print(f"\nđœïž {len(films)} film(s) trouvĂ©(s) :\n")
for film in films:
print(f" âą {film['titre']} ({film['annee']}) - {film['realisateur']}")
print(f" â Note: {film['note']} | â±ïž DurĂ©e: {film['duree']} min | đ Genre: {film['genre']}")
print()
def main():
"""Fonction principale du programme."""
# Charger les données
print("đ Chargement de la base de donnĂ©es...")
films = logique.charger_films('films.csv')
print(f"â
{len(films)} films chargés avec succÚs !\n")
while True:
afficher_menu()
choix = input("Votre choix : ")
if choix == "1":
titre = input("Entrez le titre (ou une partie) : ")
resultats = logique.rechercher_par_titre(films, titre)
afficher_films(resultats)
elif choix == "2":
realisateur = input("Nom du réalisateur : ")
resultats = logique.films_par_realisateur(films, realisateur)
afficher_films(resultats)
elif choix == "3":
annee_debut = int(input("Année de début : "))
annee_fin = int(input("Année de fin : "))
resultats = logique.films_par_periode(films, annee_debut, annee_fin)
afficher_films(resultats)
elif choix == "4":
genre = input("Genre : ")
resultats = logique.films_par_genre(films, genre)
afficher_films(resultats)
elif choix == "5":
pays = input("Pays : ")
resultats = logique.films_par_pays(films, pays)
afficher_films(resultats)
elif choix == "6":
n = input("Nombre de films à afficher (défaut: 10) : ")
n = int(n) if n else 10
resultats = logique.top_films(films, n)
afficher_films(resultats)
elif choix == "7":
stats = logique.statistiques_generales(films)
print("\nđ STATISTIQUES GĂNĂRALES")
print("="*50)
print(f"Nombre total de films : {stats['nombre_total']}")
print(f"Note moyenne : {stats['note_moyenne']:.2f}/10")
print(f"Durée moyenne : {stats['duree_moyenne']:.0f} minutes")
print(f"Film le mieux noté : {stats['film_le_mieux_note']['titre']} ({stats['film_le_mieux_note']['note']})")
print(f"Film le plus long : {stats['film_le_plus_long']['titre']} ({stats['film_le_plus_long']['duree']} min)")
print(f"Période : {stats['annee_la_plus_ancienne']} - {stats['annee_la_plus_recente']}")
elif choix == "8":
realisateur = input("Nom du réalisateur : ")
stats = logique.statistiques_realisateur(films, realisateur)
if stats:
print(f"\nđ STATISTIQUES POUR {realisateur.upper()}")
print("="*50)
print(f"Nombre de films : {stats['nombre_films']}")
print(f"Note moyenne : {stats['note_moyenne']:.2f}/10")
print(f"Meilleur film : {stats['meilleur_film']}")
else:
print("â RĂ©alisateur non trouvĂ©.")
elif choix == "9":
n = input("Nombre de réalisateurs à afficher (défaut: 5) : ")
n = int(n) if n else 5
resultats = logique.realisateurs_prolifiques(films, n)
print(f"\nđ TOP {n} DES RĂALISATEURS LES PLUS PROLIFIQUES")
print("="*50)
for i, (realisateur, nb_films) in enumerate(resultats, 1):
print(f"{i}. {realisateur} : {nb_films} film(s)")
elif choix == "0":
print("\nđ Au revoir !")
break
else:
print("â Choix invalide.")
input("\nAppuyez sur Entrée pour continuer...")
if __name__ == "__main__":
main()
4. Extensions possibles (Bonus)
Une fois le projet de base terminé, vous pouvez ajouter des fonctionnalités :
đ Extension 1 : Recherche avancĂ©e
Créez une fonction recherche_avancee(films, **criteres) qui permet de combiner plusieurs critÚres :
# Exemple d'utilisation
resultats = recherche_avancee(
films,
genre="Science-fiction",
annee_min=2000,
note_min=8.5
)
đ Extension 2 : Exportation des rĂ©sultats
Ajoutez une fonction pour exporter les résultats de recherche dans un nouveau fichier CSV :
def exporter_resultats(films, nom_fichier):
"""Exporte une liste de films dans un fichier CSV."""
# Ă COMPLĂTER
pass
đ Extension 3 : Graphiques
Utilisez la bibliothÚque matplotlib pour créer des graphiques :
- Histogramme des notes
- Répartition des films par genre
- Ăvolution du nombre de films par annĂ©e
đ Extension 4 : Recommandations
Créez une fonction qui recommande des films similaires :
def recommander_films(films, titre_reference, n=5):
"""
Recommande n films similaires au film de référence.
CritĂšres de similaritĂ© : mĂȘme genre, mĂȘme rĂ©alisateur, note proche.
"""
# Ă COMPLĂTER
pass
đ Extension 5 : Gestion de favoris
Ajoutez un systÚme de favoris qui permet de : - Marquer des films comme favoris - Sauvegarder la liste de favoris dans un fichier - Charger les favoris au démarrage
5. CritÚres d'évaluation
Votre projet sera évalué sur :
| CritĂšre | Points |
|---|---|
| Fonctionnalité : Toutes les fonctions de base fonctionnent | 8 pts |
| Qualité du code : Code propre, commenté, bien structuré | 4 pts |
| Interface : Menu clair et gestion des erreurs | 3 pts |
| Créativité : Ajout de fonctionnalités bonus | 3 pts |
| Documentation : README expliquant comment utiliser le programme | 2 pts |
| TOTAL | 20 pts |
6. Conseils de réalisation
â Commencez par les bases : ImplĂ©mentez d'abord les fonctions simples (chargement, recherche par titre)
â Testez au fur et Ă mesure : VĂ©rifiez chaque fonction avant de passer Ă la suivante
â GĂ©rez les erreurs : Que se passe-t-il si le fichier n'existe pas ? Si l'utilisateur entre une annĂ©e invalide ?
â Utilisez des fonctions auxiliaires : CrĂ©ez des petites fonctions rĂ©utilisables
â Commentez votre code : Expliquez la logique complexe
â AmĂ©liorez l'affichage : Utilisez des emojis et des couleurs pour rendre l'interface agrĂ©able
7. Exemple de session
đ Chargement de la base de donnĂ©es...
â
15 films chargés avec succÚs !
==================================================
đŹ ANALYSEUR DE FILMS đŹ
==================================================
1. Rechercher un film par titre
2. Films d'un réalisateur
3. Films par période
4. Films par genre
5. Films par pays
6. Top films
7. Statistiques générales
8. Statistiques d'un réalisateur
9. Réalisateurs les plus prolifiques
0. Quitter
==================================================
Votre choix : 2
Nom du réalisateur : Nolan
đœïž 3 film(s) trouvĂ©(s) :
âą Inception (2010) - Christopher Nolan
â Note: 8.8 | â±ïž DurĂ©e: 148 min | đ Genre: Science-fiction
âą Interstellar (2014) - Christopher Nolan
â Note: 8.6 | â±ïž DurĂ©e: 169 min | đ Genre: Science-fiction
âą The Dark Knight (2008) - Christopher Nolan
â Note: 9.0 | â±ïž DurĂ©e: 152 min | đ Genre: Action
Appuyez sur Entrée pour continuer...
8. Ressources utiles
Bon courage pour ce projet ! đđŹ