Lignes 7 et 8. On calcule la distribution des différentes bases dans la séquence. On utilise pour cela la méthodecount() qui renvoie le nombre de fois qu’une chaîne de caractères (les différentes bases) se trouve dans une autre (la séquence).
Ligne 10. On définit la position en abscisse des barres. Dans cet exemple, la variablex vaut array([0, 1, 2, 3]). Ligne 11. La fonctionbar() construit le diagramme en bâtons. Elle prend en argument la position des barres (x) et leurs hauteurs (distribution).
Ligne 12. La fonctionxtics() redéfinit les étiquettes (c’est-à-dire le nom des bases) sur l’axe des abscisses.
Lignes 13 à 15. On définit les légendes des axes et le titre du graphique. On insère un retour à la ligne\n dans le titre pour qu’il soit réparti sur deux lignes.
Ligne 16. Enfin, on enregistre le graphique généré au format png.
On espère que ces courts exemples vous auront convaincu de l’utilité du module matplotlib. Sachez qu’il peut faire bien plus, par exemple générer des histogrammes ou toutes sortes de graphiques utiles en analyse de données. Le site de matplotlib fournit de nombreux exemples détaillés24, n’hésitez pas à le consulter.
17.4 Module pandas
Le module pandas25a été conçu pour l’analyse de données. Il est particulièrement puissant pour manipuler des données structurées sous forme de tableau.
Pour charger pandas dans la mémoire de Python, on utilise la commandeimport habituelle :
1 >>> import pandas
Pandas est souvent chargé avec un nom raccourci, comme pour NumPy et matplotlib :
1 >>> import pandas as pd
17.4.1 Series
Le premier type de données apporté par pandas est la series, qui correspond à un vecteur à une dimension.
1 >>> s = pd. Series ([10 , 20, 30, 40] , index = ['a', 'b', 'c', 'd ']) 2 >>> s 3 a 10 4 b 20 5 c 30 6 d 40 7 dtype : int64
Avec pandas, chaque élément de la série de données possède une étiquette qui permet d’appeler les éléments. Ainsi, pour appeler le premier élément de la série, on peut utiliser son index, comme pour une liste (0 pour le premier élément) ou son étiquette (ici,"a") :
1 >>> s [0] 2 10
3 >>> s["a"] 4 10
Bien sûr, on peut extraire plusieurs éléments, par leurs indices ou leurs étiquettes :
1 >>> s [[1 ,3]] 2 b 20 3 d 40 4 dtype : int64 5 >>> s [[" b","d "]] 6 b 20 7 d 40 8 dtype : int64
Les étiquettes permettent de modifier et d’ajouter des éléments :
1 >>> s["c"] = 300 2 >>> s["z"] = 50 3 >>> s 4 a 10 5 b 20 6 c 300 7 d 40 8 z 50 9 dtype : int64 24.https://matplotlib.org/gallery/index.html 25.https://pandas.pydata.org/
Chapitre 17. Quelques modules d’intérêt en bioinformatique 17.4. Module pandas
Enfin, on peut filtrer une partie de la series :
1 >>> s[s >30] 2 c 300 3 d 40 4 z 50 5 dtype : int64
et même combiner plusieurs critères de sélection :
1 >>> s[(s >20) & (s <100)] 2 d 40
3 z 50 4 dtype : int64
17.4.2 Dataframes
Un autre type d’objet particulièrement intéressant introduit par pandas sont les dataframes. Ceux-ci correspondent à des tableaux à deux dimensions avec des étiquettes pour nommer les lignes et les colonnes.
Remarque
Si vous êtes familier avec le langage de programmation et d’analyse statistique R, les dataframes de pandas se rapprochent de ceux trouvés dans R.
Voici comment créer un dataframe avec pandas à partir de données fournies comme liste de lignes :
1 >>> df = pd. DataFrame ( columns =[" a", "b", "c", "d"], 2 ... index =[" chat ", " singe ", " souris "], 3 ... data =[ np. arange (10 , 14) , 4 ... np. arange (20 , 24) , 5 ... np. arange (30 , 34)]) 6 >>> df 7 a b c d 8 chat 10 11 12 13 9 singe 20 21 22 23 10 souris 30 31 32 33
Ligne 1. Le dataframe est créé avec la fonction DataFrame() à laquelle on fournit plusieurs arguments. L’argument columns indique le nom des colonnes, sous forme d’une liste.
Ligne 2. L’argumentindex définit le nom des lignes, sous forme de liste.
Lignes 3-5. L’argumentdata fournit le contenu du dataframe, sous la forme d’une liste de valeurs correspondantes à des lignes. Ainsinp.arange(10, 14) qui est équivalent à [10, 11, 12, 13] correspond à la première ligne du dataframe.
Le même dataframe peut aussi être créé à partir des valeurs fournies en colonnes sous la forme d’un dictionnaire :
1 >>> data = {"a": np. arange (10 , 40, 10) , 2 ... "b": np. arange (11 , 40, 10) , 3 ... "c": np. arange (12 , 40, 10) , 4 ... "d": np. arange (13 , 40, 10)} 5 >>> df = pd. DataFrame . from_dict ( data ) 6 >>> df. index = [" chat ", " singe ", " souris "] 7 >>> df
8 a b c d
9 chat 10 11 12 13 10 singe 20 21 22 23 11 souris 30 31 32 33
Lignes 1-4. Le dictionnaire data contient les données en colonnes. La clé associée à chaque colonne est le nom de la colonne.
Ligne 5. Le dataframe est créé avec la fonctionpd.DataFrame.from_dict() à laquelle on passe data en argument. Ligne 6. On peut définir les étiquettes des lignes de n’importe quel dataframe avec l’attributdf.index.
17.4.3 Quelques propriétés
Les dimensions d’un dataframe sont données par l’attribut.shape :
1 >>> df. shape 2 (3, 4)
Ici, le dataframedf a 3 lignes et 4 colonnes.
17.4. Module pandas Chapitre 17. Quelques modules d’intérêt en bioinformatique
1 >>> df. columns
2 Index (['a', 'b', 'c', 'd '], dtype =' object ')
3 >>> df. columns = [" Paris ", " Lyon ", " Nantes ", " Pau "] 4 >>> df
5 Paris Lyon Nantes Pau 6 chat 10 11 12 13
7 singe 20 21 22 23
8 souris 30 31 32 33
La méthode.head(n) renvoie les n premières lignes du dataframe (par défaut, n vaut 5) :
1 >>> df. head (2)
2 Paris Lyon Nantes Pau 3 chat 10 11 12 13
4 singe 20 21 22 23
17.4.4 Sélection
Les mécanismes de sélection fournis avec pandas sont très puissants. En voici un rapide aperçu :
Sélection de colonnes
On peut sélectionner une colonne par son étiquette :
1 >>> df [" Lyon "] 2 chat 11 3 singe 21 4 souris 31
ou plusieurs colonnes en même temps :
1 >>> df [[" Lyon ", " Pau "]] 2 Lyon Pau 3 chat 11 13 4 singe 21 23 5 souris 31 33
Pour la sélection de plusieurs colonnes, les étiquettes d’intérêt sont rassemblées dans une liste.
Sélection de lignes
Pour sélectionner une ligne, il faut utiliser l’instruction.loc() et l’étiquette de la ligne :
1 >>> df. loc [" singe "] 2 Paris 20
3 Lyon 21 4 Nantes 22 5 Pau 23
6 Name : singe , dtype : int64
Ici aussi, on peut sélectionner plusieurs lignes :
1 >>> df. loc [[" singe ", " chat "]] 2 Paris Lyon Nantes Pau
3 singe 20 21 22 23
4 chat 10 11 12 13
Enfin, on peut aussi sélectionner des lignes avec l’instruction.iloc et l’indice de la ligne (la première ligne ayant l’indice 0) : 1 >>> df. iloc [1] 2 Paris 20 3 Lyon 21 4 Nantes 22 5 Pau 23
6 Name : singe , dtype : int64 1 >>> df. iloc [[1 ,0]]
2 Paris Lyon Nantes Pau
3 singe 20 21 22 23
4 chat 10 11 12 13
On peut également utiliser les tranches (comme pour les listes) :
1 >>> df. iloc [0:2]
2 Paris Lyon Nantes Pau 3 chat 10 11 12 13
4 singe 20 21 22 23
Chapitre 17. Quelques modules d’intérêt en bioinformatique 17.4. Module pandas
Sélection sur les lignes et les colonnes
On peut bien sûr combiner les deux types de sélection (en ligne et en colonne) :
1 >>> df. loc [" souris ", " Pau "] 2 33
3 >>> df. loc [[" singe ", " souris "], [' Nantes ', 'Lyon ']]
4 Nantes Lyon
5 singe 22 21
6 souris 32 31
Notez qu’à partir du moment où on souhaite effectuer une sélection sur des lignes, il faut utiliserloc (ou iloc si on utilise les indices).
Sélection par condition
Remémorons-nous d’abord le contenu du dataframedf :
1 >>> df
2 Paris Lyon Nantes Pau 3 chat 10 11 12 13
4 singe 20 21 22 23
5 souris 30 31 32 33
Sélectionnons maintenant toutes les lignes pour lesquelles les effectifs à Pau sont supérieurs à 15 :
1 >>> df[ df [" Pau "] >15 ]
2 Paris Lyon Nantes Pau
3 singe 20 21 22 23
4 souris 30 31 32 33
De cette sélection, on ne souhaite garder que les valeurs pour Lyon :
1 >>> df[ df [" Pau "] >15 ][" Lyon "] 2 singe 21
3 souris 31
4 Name : Lyon , dtype : int64
On peut aussi combiner plusieurs conditions avec& pour l’opérateur et :
1 >>> df[ (df [" Pau "] >15) & (df [" Lyon "] >25) ] 2 Paris Lyon Nantes Pau
3 souris 30 31 32 33
et| pour l’opérateur ou :
1 >>> df[ (df [" Pau "] >15) | (df [" Lyon "] >25) ] 2 Paris Lyon Nantes Pau
3 singe 20 21 22 23
4 souris 30 31 32 33
17.4.5 Combinaison de dataframes
En biologie, on a souvent besoin de combiner deux tableaux de chiffres à partir d’une colonne commune. Par exemple, si on considère les deux dataframes suivants :
1 >>> data1 = {" Lyon ": [10 , 23, 17] , " Paris ": [3, 15, 20]} 2 >>> df1 = pd. DataFrame . from_dict ( data1 )
3 >>> df1 . index = [" chat ", " singe ", " souris "] 4 >>> df1 5 Lyon Paris 6 chat 10 3 7 singe 23 15 8 souris 17 20 et
1 >>> data2 = {" Nantes ": [3, 9, 14] , " Strasbourg ": [5, 10, 8]} 2 >>> df2 = pd. DataFrame . from_dict ( data2 )
3 >>> df2 . index = [" chat ", " souris ", " lapin "] 4 >>> df2
5 Nantes Strasbourg
6 chat 3 5
7 souris 9 10