- Le blog participatif de bioinformatique francophone depuis 2012 -

Apprivoiser l'ami ursidé de Python : Pandas

Durant mon stage de M2, j’ai eu l’occasion de cha­touiller ce drôle d’animal qu’est pan­das. En effet, j’ai tra­vaillé sur des don­nées de pro­téo­mique conte­nues dans des fichiers tabu­lés. Il s'agissait de com­pa­rer la pré­sence des pro­téines ou leur expres­sion dans dif­fé­rents échan­tillons. Les abon­dances rela­tives (la variable étu­diée) étaient indi­quées pour les dif­fé­rentes pro­téines iden­ti­fiées (plu­sieurs mil­liers et cor­res­pon­dant aux lignes du fichier) dans les dif­fé­rents échan­tillons ana­ly­sés (cor­res­pon­dant aux colonnes). J’ai donc dû mani­pu­ler ces don­nées tabu­lées pour en tirer des conclu­sions vis-à-vis du com­por­te­ment des pro­téines selon les dif­fé­rents échan­tillons. Je viens ain­si vous pré­sen­ter ce qu’est pan­das et quelques com­mandes pour pou­voir l’utiliser « de façon basique » et assez faci­le­ment afin de com­men­cer rapi­de­ment à ana­ly­ser ses don­nées. Comme vous l'aurez com­pris, il s’agira d’un article intro­duc­tif.

Mais qu’est-ce que pandas ?

Non, ce n’est pas vrai­ment un ursi­dé qui m’a aidée à tri­fouiller dans les don­nées mises à ma dis­po­si­tion. Ce n’est pas non plus des « Troubles neu­ro­psy­chia­triques pédia­triques auto-immunes asso­ciés à une infec­tion à strep­to­coque » (mer­ci Wiki­pé­dia pour la décou­verte !). Alors qu’est-ce réel­le­ment ?

Aqua­relle pan­das by Cho­po­pope

Pan­das est une biblio­thèque open source qui vise à l’analyse et la mani­pu­la­tion de don­nées en Python. L'objectif est de per­mettre la mani­pu­la­tion de grands volumes de don­nées struc­tu­rées (tabu­lées, mul­ti-dimen­sion­nelles, voire hété­ro­gènes) et de don­nées tem­po­relles de façon simple mais effi­cace et rapide dans le but de leur exploi­ta­tion. La biblio­thèque contient donc un grand nombre d'outils pour récu­pé­rer, agré­ger, com­bi­ner, trans­for­mer, trier, décou­per, dépla­cer et expor­ter les don­nées, ain­si que gérer les valeurs man­quantes, cal­cu­ler des sta­tis­tiques et pro­duire des gra­phiques.

Enfin, pan­das a été conçu à par­tir de Num­py et reprend une struc­ture de don­nées uti­li­sée dans R (les data.frame). Il est donc natu­rel de retrou­ver des simi­la­ri­tés avec ce der­nier dans l'utilisation de pan­das.

Je tiens à pré­ci­ser que, hélas, pan­das ne sait pas encore faire le café… (Déso­lée Nol­wenn :p) Peut-être durant une pro­chaine ver­sion ! D’ailleurs, vous pou­vez très bien pro­po­ser des amé­lio­ra­tions et par­ti­ci­per au déve­lop­pe­ment ici. Il y a même un Git­ter et une mai­ling list ain­si que le tra­di­tion­nel Stack Over­flow pour ceux qui auraient des ques­tions !

Documentation

La docu­men­ta­tion offi­cielle est assez impo­sante avec 2215 pages pour la ver­sion PDF mais peut être assez inter­ac­tive via le site. De plus, je conseille les pages sui­vantes qui per­mettent de se plon­ger dans pan­das rapi­de­ment pour une uti­li­sa­tion simple sans avoir à digé­rer la docu­men­ta­tion en entier (heu­reu­se­ment pour nous !) :

  • Une page qui pré­tend per­mettre d’appréhender pan­das en 10 minutes
  • Des exemples rapides d’utilisation de pan­das façon « livre de cui­sine »
  • De nom­breux tuto­riels pour les nou­veaux uti­li­sa­teurs ou sur des points pré­cis

Et en bonus, il existe des cheat sheets ! Des fiches qui réunissent les com­mandes prin­ci­pales et essen­tielles de pan­das. Elles sont très pra­tiques, à impri­mer et affi­cher à côté de son ordi pour y jeter un coup d’œil rapide et ne pas perdre du temps à cher­cher la com­mande sur inter­net ou dans la doc ! Je vous ren­voie vers celle édi­tée par l'équipe de déve­lop­pe­ment de pan­das ici. Plu­sieurs autres peuvent éga­le­ment être trou­vées sur inter­net (Duck­Duck­Go est ton ami !).

Installation

À la date de fin d’écriture de l’article, la der­nière ver­sion (release) de pan­das est la 0.22.0 (Février 2018). Elle est sup­por­tée par les ver­sions de Python 2.7, 3.5 et 3.6, vous avez donc l’embarras du choix. Avant tout, pour pou­voir « jouer » avec pan­das, il faut pas­ser par l’installation. Heu­reu­se­ment pour nous, cette der­nière est assez simple puisqu’il s’agit d’un package Python.

Avec Pip (la méthode recommandée avec l'utilisation de virtualenv)

#Ver­sion 3.X de Python
pip3 ins­tall pan­das

Avec Conda

On peut éga­le­ment pas­ser par Conda pour l’installation (pour rap­pel, deux super articles sur cet autre ani­mal : ici et ) :

Avec les gestionnaires de paquets

Ou bien en uti­li­sant les ges­tion­naires de paquets des dis­tri­bu­tions GNU/​Linux en télé­char­geant les paquets python-pan­das pour Python 2.X et python3-pan­das pour Python 3.X. Par exemple, pour une dis­tri­bu­tion de type Debian ou Ubun­tu :

#Pour Python 3.X
sudo apt-get ins­tall python3-pan­das

Autres façons

Il est évi­dem­ment pos­sible de pas­ser par le site offi­ciel. Si vous êtes plus aventurier(ère), vous pou­vez éga­le­ment télé­char­ger les codes sources depuis GitHub ou même la source tar­ball.

En conclu­sion, pas d’excuse pour ne pas trou­ver un moyen d’installer pan­das qui soit à son goût ! A noter qu'une ins­tal­la­tion sans vir­tua­lenv peut tout de même désta­bi­li­ser le sytème d'exploitation (mer­ci Nol­wenn !).

Utilisation

Import de la bibliothèque

Avant même de pen­ser à mani­pu­ler la bête, il faut l'importer :

Structures de données

Il faut savoir que pan­das uti­lise prin­ci­pa­le­ment deux struc­tures de don­nées : la Series (1 dimen­sion) et le Data­Frame (2 dimen­sions). Pour résu­mer sim­ple­ment, on va uti­li­ser la struc­ture Series lorsque l'on est en pré­sence de don­nées tabu­lées pré­sen­tant plu­sieurs lignes et une seule colonne de don­nées (de la variable nous inté­res­sant), alors que l'on va plu­tôt avoir recours au Data­Frame à par­tir de deux colonnes.

Series

Exemple de fichier de don­nées que l'on peut trai­ter avec un objet Series :

Acces­sionAbon­dance
P08637792592,97
P00533562817,06
P352227768216,5

Au niveau du code :

#Par exemple
series = pd.Series(data=[792592.97, 562817.06, 7768216.5], index=["P08637", "P00533", "P35222"])
print(series)

Affi­chage de l'objet series

DataFrame

Exemple de fichier de don­nées per­met­tant d'utiliser un Data­Frame :

Acces­sionEntry nameCondi­tion 1Condi­tion 2Condi­tion 3
P08637P13_​HUMAN792592,97971165,221175682,25
P00533EGFR_​HUMAN562817,06698207,22 
P35222CTNB1_​HUMAN7768216,52072283,57202552,25

Au niveau du code :

#Par exemple
idx = ["P08637", "P00533", "P35222"]
don­nees = {"Entry name":["P13_HUMAN", "EGFR_​HUMAN", "CTNB1_​HUMAN"], "Condi­tion 1":[792592.97, 562817.06, 7768216.5], "Condi­tion 2":[971165.22, 698207.22, 2072283.5], "Condi­tion 3":[1175682.25, None, 7202552.25]}
df = pd.DataFrame(data=donnees, index=idx)
print(df)

Affi­chage de l'objet df

Concer­nant le para­mètre data, on peut pas­ser des dic­tion­naires (de Series, arrays, etc), des Data­Frames ou des ndar­ray de num­py (voir la doc).

Différentes Manips avec Pandas

/​!\ Ici, je ne trai­te­rai que d'exemples avec des don­nées (à ana­ly­ser) numé­riques avec des index non numé­riques (chaînes de carac­tères). Je vous invite donc à adap­ter ces exemples pour des don­nées de nature dif­fé­rente ou hété­ro­gènes (et à com­plé­ter cet article avec un autre pré­sen­tant de nou­veaux exemples et nou­velles appli­ca­tions !).

Je tra­vaille­rai avec un fichier conte­nant des don­nées simu­lées qui se pré­sente comme ceci :

Fichier de don­nées

Import des données

À partir d'un fichier EXCEL

Oui, le monde n'est pas (encore) par­fait. Il arrive (trop sou­vent) qu'il faille mani­pu­ler des fichiers Excel. Mais ras­su­rez-vous, avec pan­das, nous aurons seule­ment à récu­pé­rer les don­nées du fichier et les sto­cker dans un Data­Frame (ou Series s'il n'y a qu'une seule colonne de don­nées). Nous ne tou­che­rons plus à ce type de fichier pour nos trai­te­ments.

#Par exemple
xl = pd.ExcelFile("/media/DATA/Bioinfo-fr/data_excel.xlsx")
print(xl.sheet_names)
df = xl.parse("data", index_col=0)
print(df) # Affiche le data­frame df conte­nant les don­nées de la feuille 'data' du fichier Excel data_excel.xlsx

Résul­tat de sor­tie

Une autre façon de faire est pos­sible en uti­li­sant une seule fonc­tion : read_​excel().

#Par exemple
df = pd.read_excel("/media/DATA/Bioinfo-fr/data_excel.xlsx", sheet_name=0, index_col=0)

Appa­rem­ment, d'après une réponse sur Sta­ckO­ver­flow, la pre­mière solu­tion serait plus rapide. On remarque éga­le­ment que l'on peut soit pré­ci­ser le nom de la feuille à ana­ly­ser ou direc­te­ment le numé­ro de celle-ci, ce qui est utile quand on ne connaît pas les inti­tu­lés des feuilles. Cela fonc­tionne pour les deux solu­tions, ce n'est pas dépen­dant de la façon de faire choi­sie. Je vous laisse aller lire la docu­men­ta­tion pour plus de détails.

À partir d'un fichier CSV

Quand on a plus de chance, ce sont des fichiers au for­mat csv que nous avons à notre dis­po­si­tion. De manière ana­logue à la fonc­tion read_​excel(), on uti­lise la fonc­tion read_​csv(). Il y a un para­mètre option­nel delimiter='\t' si votre fichier est au for­mat tsv.

#Par exemple
file_​csv = "/media/DATA/Bioinfo-fr/data_CSV.csv"
df = pd.read_csv(file_csv, index_col=0)

Premier aperçu des données

Une fois impor­tées, il est (enfin) pos­sible de jeter un coup d’œil à nos don­nées pour pou­voir com­men­cer à les exploi­ter. Avec les quelques fonc­tions ou variables sui­vantes, nous aurons un rapide aper­çu sur ces der­nières.

résul­tat df.dtypes
résul­tat de la fonc­tion head()
résul­tat appel fonc­tion tail()
résul­tat de l'appel de la variable index
résul­tat de l’appel à la variable columns

# Ren­voie la moyenne des don­nées (numé­riques) par colonne
df.mean() # ou df.mean(0)
# moyenne par ligne
df.mean(1)

résul­tat de l'appel de la fonc­tion des­cribe(). count : nombre de valeurs dans la colonne ; [unique, top, freq] : pour les valeurs tex­tuelles, top : valeur la plus repré­sen­tée (aléa­toire si plu­sieurs); [mean (moyenne), std (écart-type), min, max, pour­cen­tiles] : pour les valeurs numé­riques

Traitements basiques

Après avoir eu une vision glo­bale de nos don­nées grâce à quelques sta­tis­tiques, nous pou­vons les trai­ter à l'aide des infor­ma­tions obte­nues pré­cé­dem­ment.

Gérer les données manquantes et/​ou nulles

# Par exemple
df_​dropna = df.dropna(how='any')

data­frame sans valeur man­quante
data­frame avec les valeurs man­quantes rem­pla­cées par la valeur numé­rique 5

Trier les données

Sor­tie de l'appel de la fonc­tion sort_​index()
Sor­tie de l'appel de la fonc­tion sort_​values()

Valorisation des résultats/​données

Visualisation

Il est sou­vent inté­res­sant de pou­voir visua­li­ser ses don­nées sous la forme d'un gra­phique. Il est pos­sible de créer un gra­phique direc­te­ment à par­tir du data­frame et en uti­li­sant la biblio­thèque mat­plot­lib ('import matplotlib.pyplot as plt' en début de script).

gra­phique géné­ré à par­tir du data­frame

On peut évi­dem­ment choi­sir un type de gra­phique. Pour cela, il faut uti­li­ser à la place de df.plot() les méthodes asso­ciées : df.plot.type() avec 'type' étant 'line', 'bar', 'scat­ter', 'hist', 'box', etc.
On peut éga­le­ment com­plexi­fier un peu selon nos envies et notre maî­trise de mat­plot­lib. Je vous glisse (en cadeau car vous le méri­tez après avoir lu ce looong article) ici un exemple de gra­phique dont j'ai eu besoin. J'ai dû modi­fier la pré­sen­ta­tion de l'axe des abs­cisses pour pou­voir visua­li­ser les noms de pro­téines de façon lisible.

Gra­phique un peu plus com­plexe

Export des résultats/​données

L'export des don­nées est simi­laire à leur import. Au final, vous pou­vez mani­pu­ler dif­fé­rents types de fichiers, que ce soit en entrée ou en sor­tie. Un tableau réca­pi­tu­la­tif des pos­si­bi­li­tés vous per­met de le consta­ter (cf docu­men­ta­tion).

tableau réca­pi­tu­la­tif des for­mats sup­por­tés

Informations complémentaires

Il est à noter que pan­das peut être uti­li­sé au sein de IPython/​notebook Jupi­ter.

Durant l'écriture de cet article, j'ai même décou­vert qu'il exis­tait Geo­Pan­das pour mani­pu­ler les don­nées géo­gra­phiques. Donc si vous bos­sez sur du SIG, pan­das est aus­si là pour vous ;). Je ne l'ai pas uti­li­sé, mais avec un rapide coup d’œil sur la doc, j’ai pu voir qu'il repo­sait sur le même prin­cipe glo­bal avec les types de don­nées Series et Data­Frame (Geo­Se­ries et Geo­Da­ta­Frame).

De plus, pan­das offre bien d'autres pos­si­bi­li­tés et je vous invite à décou­vrir ces der­nières et à venir nous les par­ta­ger par l'écriture d'un article plus avan­cé sur l'utilisation de pan­das ! Je vous laisse (enfin) vous dépa­touiller avec Pan­das !

Enfin, je tiens à remer­cier Oli­vier Dame­ron, Nol­wenn et lroy qui se sont aventuré(e)s à relire mon article et Cho­po­pope pour sa magni­fique aqua­relle ! \o/​

Références

https://​pypi​.python​.org/​p​y​p​i​/​p​a​n​das

https://​linux​fr​.org/​n​e​w​s​/​p​a​n​d​a​s​-​u​n​e​-​b​i​b​l​i​o​t​h​e​q​u​e​-​p​o​u​r​-​m​a​n​i​p​u​l​e​r​-​f​a​c​i​l​e​m​e​n​t​-​d​e​s​-​d​o​n​n​ees

http://​samet​max​.com/​l​e​-​p​a​n​d​a​s​-​c​e​s​t​-​b​o​n​-​m​a​n​g​e​z​-​en/




Commentaires

2 réponses à “Apprivoiser l'ami ursidé de Python : Pandas”

  1. Bon­jour, mer­ci pour ce témoi­gnage. Pour aller dans le même sens, dans notre groupe bio­in­for­ma­tique ABI-SOFT à l'UMR GQE-Le Mou­lon), nous uti­li­sons Pan­da pour mani­pu­ler des don­nées de géno­ty­page de plantes et nous en sommes satis­faits. Par ailleurs j'en pro­fite pour faire la pub du fra­me­work Python Djan­go, qui per­met de faire des appli­ca­tions Web et donc affi­cher les tableaux pan­da sur le web. Cdlt. Del­phine

    1. Mer­ci pour ce retour. Je n'ai pas encore pu explo­rer assez le fra­me­work Djan­go pour tes­ter l'utilisation de Pan­das mais je vais y jeter un coup d'oeil dès que pos­sible. Mer­ci pour l'information !

Laisser un commentaire