TP – Traitement des données en tables
Lecture
Dans ce TP nous allons travailler avec un fichier csv.
Nous utiliserons le module csv de la bibliothèque standard. (standard = pas de pip install).
Commencez par un dossier TP_data ensuite, téléchargez le fichier suivant dans votre dossier TP_data :
Marvel vs DC
Maintenant, dans le même dossier créez le fichier tp_data contenant le code suivant :
La fonction
reader
du module
csv
prend en argument un fichier ouvert et renvoie une valeur spéciale représentant un fichier CSV. Avec l’aide la fonction
list
on convertie cela en tableau Python.
On remarque alors que la variable table contient un tableau de tableau de chaîne de caractères. Le première tableau contient :
['Id', 'Titre', 'Company', 'Note', 'Score', 'Durée', 'Sortie', 'Budget', "Weekend d'ouverture USA", 'USA', 'Monde']
Ce premier tableau est important, il contient les descripteurs ou attribus.
Id | Titre | Company | Note | Score | Durée | Sortie | Budget | Weekend d’ouverture USA | USA | Monde |
1 | Iron Man | Marvel | 7.9 | 79 | 126 | 2008 | 140000000 | 98618668 | 318604126 | 585366247 |
2 | The Incredible Hulk | Marvel | 6.7 | 61 | 112 | 2008 | 150000000 | 55414050 | 134806913 | 263427551 |
3 | Iron Man 2 | Marvel | 7 | 57 | 124 | 2010 | 200000000 | 128122480 | 312433331 | 623933331 |
4 | Thor | Marvel | 7 | 57 | 115 | 2011 | 150000000 | 65723338 | 181030624 | 449326618 |
5 | Captain America: The First Avenger | Marvel | 6.9 | 66 | 124 | 2011 | 140000000 | 65058524 | 176654505 | 370569774 |
6 | The Avengers | Marvel | 8 | 69 | 143 | 2012 | 220000000 | 207438708 | 623357910 | 1518812988 |
Vous pouvez afficher un peu mieux vos données avec cette simple boucle :
Quel est le contenu des variables
table[1][1]
et
table[1][6]
, de quel type sont ces variables ?
Solution
Solution
'Iron Man' et '2008'. Les deux variables sont des chaînes de caractères.
Ceci dit, cette structure de donnée n’est pas de plus pratiques… Une alternative est proposée par le module csv, la fonction
DictReader
.
On obtient un tableau de dictionnaires ordonnés (Dans ces dictionnaires, les clés resteront dans l’ordre contrairement aux dictionnaires de base)
Pour accéder, par exemple à Iron man, on peut écrire :
table[1]['Titre']
et l’année de sortie de ce film :
table[1]['sortie']
Par contre, le type des données n’est pas celui qu’on souhaite, la date reste, par exemple, en string… D’où l’exercice suivant :
Exercice :
Écrivez une fonction qui prend en entrée un dictionnaire comme ceux dans notre table et qui retourne un dictionnaire mais avec les bons types et qui vérifie que la note est bien comprise en 0 et 10. Ensuite appliquer cette fonction à toutes les lignes de la table.
map et dic.get
Solution
Cherchez avant de regarderSolution
Maintenant appliquons cette fonction à chaque ligne.
Quelques remarques :
Déjà, nous avons décidé de faire une copie de la table, nous aurions très bien pu faire une validation « en place », c’est à dire en modifiant la table originale.
Ici, on remarque que ligne[‘Score’] provoque une erreur si la clé score est absente du dictionnaire. Il existe une autre façon de faire :
ligne.get('Score', 'pas de score')
(https://www.tutorialspoint.com/python/dictionary_get.htm)
Et finalement, pour appliquer une fonction à chaque élément d’une liste il est pertinent d’avoir recours à
map
:
https://www.w3schools.com/python/ref_func_map.asp
Recherche
On souhaite interroger cette table et lui poser quelques questions, on appelle ces questions des requêtes.
Exercices :
Écrivez une fonction
present(titre, table)
qui permet de vérifier si un film est présent dans notre table, la recherche effectue à partir du titre.
Votre fonction doit réussir le tests suivants :
Solution
Cherchez un peu avantSolution
Écrivez une requête qui permet de connaitre la note d’un film à partir de son titre.
Solution
Cherchez un peu avantSolution
Écrivez une requête qui retourne le titre des films sortie une année donnée.
Pour
sortie_en(2018, table_valide)
on attend :
['Black Panther', 'Avengers: Infinity War', 'Ant-Man and the Wasp', 'Aquaman']
Solution
Cherchez un peu avantSolution
Écrivez une requête qui retourne la note moyenne des films de la table.
Solution
Cherchez un peu avantSolution
round(nombre, n)
permet d’arrondir à n chiffre après la virgule
Écrivez une requête qui retourne le film ayant fait le meilleur Weekend d’ouverture aux USA.
Solution
Cherchez un peu avantSolution
Écrivez une requête qui retourne la note moyenne d’une compagny donnée (Marvel ou DC). Comparer ces notes.
Solution
Cherchez un peu avantSolution
Sans surprise c’est Marvel qui l’emporte.
Analyse de données
Dans cette partie nous utiliserons le module mathplotlib. Une introduction est disponible ici : https://codesturm.eu/2020/04/05/matplotlib/
L’objectif est de tracer quelques courbes pour faire apparaître certaines tendances.
Ici, il s’agit plus d’une démonstration de ce qu’on peut faire avec un jeu de données et la bibliothèque matplotlib
Voici un exemple permettant de comparer les budgets de Marvel et de DC.
Un autre exemple :
A vous d’imaginer comment représenter et exploiter ces données…
Dans un prochain TP nous travaillerons sur un jeu de données plus conséquent et nous ferons appel à pandas.