Le module Pandas
Cela devient vite fastidieux, du Python "pur" pour manipuler des données...
Il existe heureusement des modules spécialement destinés à la manipulation et au traitement de données en Python : par exemple, le module Pandas.
C'est le module "de référence" pour tout ce qui est analyse de données, "Big data", etc... en Python.
Principe
Cette introduction à l'utilisation du module se fera avec ce fichier de données ( à enregistrer dans votre zone personnelle ).
Le module n'est pas forcément installé sur les ordinateurs du lycée, mais est disponible dans les éditeurs du site : penser à l'installer au préalable, et charger les fichiers nécessaires dans
le système de fichiers virtuel du navigateur.
Dataframe
Après avoir importé le module en début de script, on crée, à partir de données stockées par exemple dans un fichier .csv
, un tableau de données appelé dataframe :
import pandas
df = pandas.read_csv('population_pays.csv') # df est l'abréviation de dataframe
print(df)
La première ligne indique le nom des colonnes du tableau; chaque ligne commence par un index ( commençant à 0 ) permettant de la repérer
Le dataframe contenant de très nombreuses données, Pandas ne les affiche pas toutes par défaut : les points de suspension indiquent des données non affichées.
Informations sur les données
On peut obtenir de nombreuses informations sur le tableau de données lui-même.
Dé-commenter chaque ligne ci-dessous pour observer le résultat de leur exécution :
#print(df.shape) # affiche le nombre de lignes et de colonnes du dataframe
#print(df.head(3)) # affiche les 3 premières lignes
#print(df.tail(10)) # affiche les 10 dernières lignes
#print(df.columns) # affiche le nom des colonnes
#print(df.dtypes) # affiche le type de données précis de chaque colonne
#print(df.info()) # affiche plus d'informations sur les données
#print(df.describe()) # affiche des statistiques sur les données
Sélectionner une ou plusieurs colonnes
# Pour avoir la liste des pays par exemple, on sélectionne la la colonne 'Country' :
#print(df['Country'])
# On peut sélectionner plusieurs colonnes simultanément :
#print(df[['Country','Year_1960','Year_2016']]) # les noms des colonnes sont les éléments d'un tableau
# On peut créer un nouveau tableau à partir de colonnes sélectionnées :
#nouveau_df = df[['Country','Year_1960']]
#print(nouveau_df)
# On peut renommer une ou plusieurs colonnes d'un tableau :
#nouveau_df = nouveau_df.rename(columns = {'Country':'Pays'}) # pour renommer une colonne
#print(nouveau_df)
#nouveau_df = nouveau_df.rename(columns = {"Year_1960": 1960, "Year_2016": 2016}) # pour renommer plusieurs colonnes
#print(nouveau_df)
Dans Pandas, une colonne est plus qu'une simple liste. C'est un objet sur lequel il est possible de faire les mêmes opérations que sur un dataframe :
annee_2016 = df['Year_2016']
#print(annee_2016.describe()) # infos statistiques
#print(annee_2016.head(5)) # premières lignes
#print(annee_2016.mean()) # Si on veut la moyenne des population pour l'année 2016
#print(annee_2016.sort_values()) # Pour trier : affiche 1) les numéros de lignes, 2) les valeurs dans l'ordre croissant
Remarque : NaN
signifie Not a Number et indique qu'il y a probablement une valeur manquante dans la table () il doit y avoir un pays pour lequel on n'a pas
d'information sur sa population en 2016.)
Sélection de lignes suivant une ou plusieurs condition(s)
# Pour avoir la ligne de la France:
#condition = (df['Country']=='France') # On "fabrique" une condition
#print(df[condition])
# Pour avoir la liste des pays dont la population en 1960 était supérieure à 100 000 000 :
#condition = (df['Year_1960']>10**8)
#print(df[condition])
# Pour avoir la liste des pays dont la population en 1960 était supérieure à 100 000 000 ET inférieure à 200 000 000
#condition1 = (df['Year_1960']>10**8)
#condition2 = (df['Year_1960']<2*10**8)
#print(df[condition1 & condition2]) # le "and" s'écrit ici "&"
# Pour avoir la liste des pays dont la population en 1960 était supérieure à 1 000 000 000 OU inférieure à 100 000
#condition1 = (df['Year_1960']>10**9)
#condition2 = (df['Year_1960']<10**5)
#print(df[condition1 | condition2]) # le "or" s'écrit ici "|"
Trier un tableau
# Trier le tableau par ordre croissant suivant l'année 2016
print(df.sort_values(by = 'Year_2016'))
Enlever les valeurs manquantes
print(df.shape) # taille avant suppression
df = df.dropna() # suppression des lignes qui comportent des valeurs manquantes
print(df.shape)
Ajouter une nouvelle colonne
On veut mesurer par exemple l'augmentation de la population , en pourcentage, entre 1960 et 2016. On va créer une nouvelle colonne dans laquelle on écrira une formule de calcul,
puis on ajoutera cette colonne au tableau :
augmentation = (df['Year_2016']/df['Year_1960'])*100 # calcul automatique ligne par ligne
df['Augmentation']=augmentation
print(df)
Application : une base de données de films ( IMDb )
Pour cette application, vous utiliserez ce fichier de données.
- Créer un dataframe à partir du fichier de données :
- Former un nouveau tableau appelé movies_df2 en ne gardant que les colonnes suivantes, et les renommer en français, puis afficher le nouveau tableau :
'movie_title': 'Titre'
'director_name': 'Réalisateur'
'duration': 'Durée en min'
'title_year': 'Année'
'imdb_score': 'Score IMDb'
'budget': 'Budget'
'gross': 'Recette'
- Enlever les lignes présentant des valeurs manquantes :
- Ne garder que les films sortis à partir de l'année 2000 :
- Afficher cette table en classant du moins bien noté au mieux noté :
- Lequel de ces films a levé la plus grosse recette (vous pouvez vous aider d'un tri pour obtenir ce résultat) ?
- Créer une nouvelle colonne qui va mesurer la rentabilité (Recette - Budget) de chaque film et l'ajouter au tableau (ignorer les éventuels avertissements) :
- Trier le tableau pour afficher les films du moins rentable au plus rentable :
- Quels sont les films dont le score IMDb est supérieur à 8 et qui n'ont pourtant pas été rentables ?
SOLUTION