Travailler sereinement avec des données grâce à Pandas
- 2021-05-18
- Publié par : Christophe DELEUZE
- Catégorie : Pandas
Nous avons tous eu au moins une fois besoin dans notre vie, en tant que pythoniste, d’analyser des tableaux de données. Or, à l’age de l’innocence, quand il s’agissait de fichiers CSV par exemple, nous nous sommes quasiment tous amusés à les parser (découper) par nous-mêmes. Mais, quand vient l’age de la maturité, nous n’avons plus vraiment envie de réinventer la roue. Alors, on cherche une alternative et si vous voulez faire de l’analyse de données en Python, la librairie incontournable se nomme : pandas ! Celle-ci a pour objectif de vous apporter un vrai confort dans la manipulation de données. Elle vous fera gagner du temps tout en conservant un code lisible. Mais outre l’aspect purement analytique, une autre de ses grandes forces réside dans sa capacité à pouvoir importer et exporter des données dans de multiples formats :
Avant de commencer, on sort son environnement virtuel et on pip install pandas.
Lire des fichiers CSV avec pandas
Lire et Parser un CSV, c’est une tâche assez courante. On peut le faire à la main avec open() :
def parser_csv_old_school(fichier = "data.csv", separateur = ";"):
lines = []
with open(fichier) as f:
lines = f.readlines()
data = [line.split(";") for line in lines]
return [line.split(separateur) for line in lines]
Ou bien, on peut utiliser la librairie pandas :
import pandas as pd
dataframe = pd.read_csv("data.csv")
Les dataframes ont l’avantage d’optimiser l’affichage en console des tableaux. Voici un exemple de print() classique d’un dataframe :
0 1 2
A 1.1 2.7 5.3
C 3.3 5.4 1.5
B 2.0 10.0 9.0
D 4.0 7.0 15.0
C’est beau, propre et lisible. En résumé, c’est fait pour vous aider à y voir clair.
Mais le dataframe peut aussi écrire un fichier CSV :
import pandas as pd
# Chargement du fichier csv
dataframe = pd.read_csv("data.csv")
# Ici je rajoute une colonne, mais on pourrait faire n'importe quel traitement
dataframe["nouvelle_colonne"] = 0
# Puis je sauvegarde dans un autre fichier
dataframe.to_csv("data2.csv")
Sauf que le format CSV n’est pas toujours adapté. En effet, ce format gère très mal les caractères spéciaux. Il est donc facile d’avoir de mauvaises surprises quand on exporte et réimporte un CSV, notamment si les données contiennent des caractères Unicode.
Pour palier à cela, la librairie pandas possède son propre format qui vous garanti l’intégrité des données sauvegardées dans un fichier : le format Pickle. Il fonctionne de la même façon que pour un CSV :
import pandas as pd
# Chargement d'un csv de base
dataframe = pd.read_csv("data.csv")
# Puis je sauvegarde dans le format pickle
dataframe.to_pickle("data2.pkl")
Les Tableaux HTML avec pandas
Mais pandas ne s’arrête pas là, cette librairie propose nativement plein d’autres formats. Vous avez besoin d’afficher dans une page html un tableau ? Pas de soucis, on peut le faire avec to_html() :
import pandas as pd
# Chargement d'un csv de base
dataframe = pd.read_csv("data.csv")
# Générer un tableau html des données
dataframe.to_html()
Maintenant, ajouter dans votre code un connecteur lié à une messagerie instantanée (Teams par exemple) et vous pourrez afficher en toute simplicité, dans des canaux de discussions, vos tableaux correctement formatés.
Le format JSON
Évidemment, si votre problématique est de fournir des données à un utilisateur, via une API REST par exemple (FastAPI / Flask), il vous suffira d’exploiter le format JSON :
import pandas as pd
# Chargement d'un csv de base
dataframe = pd.read_csv("data.csv")
dataframe.to_json()
Vous noterez que chaque fonction vient avec son lot de paramètres personnalisés. Je vous conseille de prendre le temps de les regarder en fonction de vos besoins : Documentation pandas.
Les autres formats
Vous l’aurez compris dans mes exemples précédents : vous en aurez fini avec les galères de changements de formats. Normalement, les formats précédemment abordés précédemment répondront à 95% de vos besoins à l’exception des bases de données. Toutefois, pour les 5% restant, voici un tableau récapitulatif des formats que vous pourrez manipuler avec pandas :
La magie de la lecture des bases de données avec SQLALchemy et pandas
Vous ne l’aurez sans aucun doute pas remarqué, mais le tableau précédent n’inclut pas tout ce qui pourrait concerner les bases de données.
Voici ce qu’il manque :
| Format | Lire | Ecrire |
|---|---|---|
| SQL | pandas.read_sql | pandas.DataFrame.to_sql |
| Query SQL | pandas.read_sql_query | |
| Table SQL | pandas.read_sql_table |
Exploiter des données issues d’une base de données, ce n’est pas toujours quelque chose de simple. Il faut souvent s’adapter à la base de données et au langage associé. Pour cela, nous avons besoin d’une librairie qui va nous permettre d’interroger les bases.
Or, comme chaque base a souvent son propre langage, elle vient avec ses propres librairies / connecteurs dont voici la liste non exhaustive des plus courantes :
| Base de données | Connecteurs Python |
|---|---|
| Microsoft SQL Server | pyodbc / mssql / pymssql |
| MySQL / MariaDB | pymysql |
| Oracle | pyoracle |
| PostgreSQL | psycopg2 |
| SQlite | pysqlite |
Sauf que pandas n’inclus pas toutes ces librairies. Par contre, pandas embarque l’ORM SQLAlchemy qui sait discuter avec beaucoup de monde.
Concrètement, le rôle d’un ORM (Object–Relational Mapping) est de convertir des données entre des systèmes de types incompatibles à l’aide de la programmation orientés objet. Ce qui est très pratique, car cela permet à pandas d’avoir une seule interface pour communiquer avec toutes les bases de données incluses dans SQLAlchemy.
La seule subtilité à connaître, c’est que vous aurez besoin de choisir et d’installer avec pip install au moins un connecteur. Ce connecteur n’aura pas besoin d’être importé dans votre code. Une fois fait, vous devrez créer une connexion avec SQLAlchemy et la fournir à pandas. Je suis sympa, voici un exemple avec un connecteur psycopg2 :
import pandas as pd
from sqlalchemy import create_engine
def sql_engine(user, password, dialect="postgresql", driver="psycopg2", server_name="mon_serveur", database_name="ma_db"):
engine = create_engine(f"{dialect}+{driver}://{user}:{password}@{server_name}/{database}")
connection = engine.connect()
return connection
sql_connection = sql_engine("moi", "secret")
dataframe = pd.read_sql("select * from ma_table", sql_connection)
À partir d’ici, vous connaissez l’essentiel pour interagir avec des données en base.
Enfin, n’oubliez pas de ranger tout ça proprement, dans une classe par exemple.
Le mot de la fin
pandas est un bon compromis qui vous fera gagner beaucoup de temps pour gérer efficacement la lecture et l’écriture de vos données. Cette superbe librairie est indispensable dans le traitement des données. D’ailleurs, ce n’est pas pour rien que tous les frameworks Python du Machine Learning l’exploitent et avec raison ! Ce qui est sûr, c’est que pandas saura s’adapter à votre utilisation sans que vous ayez le besoin de coder des méthodes complexes pour sérialiser et désérialiser vos données.Besoin d’en savoir ? Un truc vous chagrine dans l’article ? N’hésitez pas à le partager dans les commentaires.
Bonne semaine les Pythonistes.