TD G3 : exemple de grosse librairie : utilisation du module PANDAS pour travailler sur des données au format CSV¶
Une façon courante de stocker des données est d'utiliser le format .csv (pour Comma-Separated Values). Ce type de fichier peut directement être obtenu à partir d'un tableur (Excel ou Libre office par exemple) lors du choix de l'enregistrement du fichier.
Il existe en python un module csv permettant de gérer ce type de fichiers, mais on va utiliser une bibliothèque un peu plus élaborée pour ceux qui veulent faire de la data science, elle se nomme pandas (pour Panel Datas). Elle nous permettra de gérer assez facilement des tableaux à double entrée.
Il y a beaucoup de documentation sur Internet (notamment la doc officielle ). Voyons simplement ici quelques fonctionnalités basiques de ce module sur un exemple.
Commençons par afficher le contenu d'un fichier .csv ainsi que quelques renseignements complémentaires.
import pandas as pd
df = pd.read_csv('notes.csv')
print(df.to_string())
print('Format de la table :',df.shape)
print('Nombre de lignes :',df.shape[0])
print('Nombre de colonnes :',df.shape[1])
print('Liste des labels des colonnes :',list(df.columns))
print('Liste des labels des lignes :',list(df.index))
La variable dfest un objet spécial appelé DataFrame. On peut comme on vient de le voir produire une affichage complet de la table avec la méthode to_string() ou obtenir un tuple donnant le nombre de lignes (1er argument) et le nombre de colonnes (2e argument) avec l'attribut .shape.
On peut en outre accéder à une colonne ou une ligne particulière de la table. Voyons cela en exercice.
Exercice 1¶
Faisons quelques calculs statistiques sur le fichier notes précédent.
Q1. On souhaite calculer la moyenne de la classe sur certains exercices. Pour cela, si le dataFrame est df, on peut récupérer un itérateur (c'est à dire une sorte de liste) sur la colonne souhaitée (par exemple celle dont le label est 'Exo 1') en écrivant: lst_notes = df['Exo 1'].
Compléter le code ci-dessous pour obtenir la moyenne à l'exercice 1.
import pandas as pd
df = pd.read_csv('notes.csv')
def moyenne(data, label_col : str)->float :
""" reçoit une DataFrame Pandas ainsi que le label d'une
colonne au format str, et renvoie la moyenne des
valeurs de cette colonne """
lst_notes = df[label_col] # on récupère directement la colonne : label_col
moy = # à compléter
return moy
print("Moyenne à l'exo 1 :", moyenne(df,'Exo 1'))
Q2. À l'aide d'une boucle, faire afficher les moyennes de chaque exercice pour obtenir un résultat du type :
Moyenne à l'Exo 1: 4.85
Moyenne à l'Exo 2: 4.89
Moyenne à l'Exo 3: 5.74
Moyenne à l'Exo 4: 6.69
Moyenne à l'Exo 5: 1.82
On rappelle que df.columns renvoie la liste des étiquettes des colonnes et que le format d'affichage avec deux décimales dans les f-strings est f"...{nombre flottant:.2f}..."
# affichage de la moyenne de chaque exo :
for # à compléter
Remarque : PANDAS propose des fonctions toutes faites pour ce genre de travail. Par exemple on obtient le même résultat en faisant:
# En utilisant les fonctions de pandas !
print(df.mean(axis=0)) # axis = 0 -> moyenne par colonne
Q3. On souhaite maintenant constituer la liste des notes totales obtenues par chaque élève. Pour cela, on peut récupérer un itérateur (on a déjà dit une sorte de liste) sur la ligne souhaitée (par exemple celle d'indice 3, sachant comme d'habitude que la numérotation commence à 0) en écrivant lig = df.loc[3].
(On rappelle si besoin que l'on peut obtenir le nombre de lignes avec l'attribut df.shape).
Compléter le script de la fonction suivante:
def liste_notes(df) -> list :
""" reçoit un DataFrame et renvoie la liste dont chaque
valeur est la somme d'une ligne, c'est à dire la liste
de notes obtenues par chaque étudiant"""
lst = []
for lig in df.index: # ou bien range(df.shape[0])
# à compléter
pass
return lst
# on teste :
print("Liste des notes par étudiant :")
print(liste_notes(df))
Remarque : directement avec les fonctions de PANDAS :
# En utilisant les fonctions de pandas !
print(df.sum(axis=1)) # axis = 1 -> somme par ligne
Q4. Sachant que la note maximale possible pour ce devoir était de 52, calculer alors la moyenne de la classe obtenue sur ce contrôle, ramenée sur 20.
lst_notes = liste_notes(df)
moyenne_classe = sum(lst_notes)/len(lst_notes)/52*20
print(f"La moyenne de la classe ramenée sur 20 est {moyenne_classe}")
Cette librairie pandas permet de faire beaucoup de choses, mais ce n'est pas un objectif pour nous cette année de l'étudier... L'idée ici est de voir comment une librairie bien choisie permet de grandement faciliter le travail.