Tips Python

Pour que même les détails sur Python, Numpy et Pandas n’aient plus de secret pour vous (Python et Data Science).

Le problème

Si vous vous êtes déjà retrouvé à vous poser plusieurs fois la même question ou même rechercher des réponses toujours sur le même concept ou syntaxe lorsque vous programmez en Python, vous n’êtes pas seul.
Dans cet article, j’ai envie de lister les détails importants qu’on a tendance à oublier lorsqu’on arrête de coder quelques semaines.

Bien qu’il soit tout à fait normal et sain de regarder les questions/réponses sur StackOverflow ou sur d’autres ressources, cela vous ralentit un peu et soulève des questions quant à votre compréhension complète du langage.

Nous vivons dans un monde où la quantité de ressources accessibles et gratuites est infinie. En une recherche Google, vous obtenez un résultat. Cependant, cela peut être à la fois une bénédiction et une malédiction. Attention: lorsque ces ressources ne sont pas gérées efficacement (mauvaise sélection par exemple), une dépendance excessive peut engendrer très vite de mauvaises habitudes sur le long terme.

Une autre mauvaise habitude c’est de copier/coller du code que vous trouvez ici et là, plutôt que de prendre le temps d’apprendre et de consolider le concept pour pouvoir reproduire le code vous-même la prochaine fois.

Cette approche est paresseuse et même si elle est géniale à court terme, elle finira par nuire à votre croissance Pythonesque, à votre productivité et à votre capacité à vous souvenir de la syntaxe à VIE.

 

Objectif

Voyons voir certains concepts et certains points de syntaxe qui sont  négligés systématiquement lors de l’analyse des données en Python.

Dans le but de consolider votre compréhension de ces concepts une fois pour toutes et de vous épargner quelques recherches de StackOverflow, voici ce qu’ON oublie toujours lorsqu’on travaille avec Python, NumPy et Pandas.

J’ai inclus 8 concepts qui a mon sens sont important dans la programmation Python et qu’on a tendance à mettre de côté ou oublier. J’essaye d’explorer chaque concept de façon concise: une courte description et un exemple. Si besoin de plus d’explications, n’hésitez pas à commenter.

 

1. Compréhension de liste (en une seule ligne)

Ecrire une boucle for chaque fois que vous avez besoin de définir une sorte de liste est fastidieux, heureusement que Python a un moyen intégré de résoudre ce problème en une seule ligne de code. La syntaxe peut être un peu difficile à comprendre, mais une fois que vous vous serez familiarisé avec cette technique, vous l’utiliserez assez souvent.

Pour comprendre la compréhension de liste en une seule ligne vs. et la création d’une liste en plusieurs lignes, regardez l’exemple ci-dessous qui présente les 2 syntaxes.

Dans cet exemple où l’on souhaite mettre au carré les nombres impairs d’une liste, soit numbers une liste contenant quelques nombres:

numbers = [1, 2, 3, 4, 5]

doubled_odds = []
for n in numbers:
    if n % 2 == 1:
        doubled_odds.append(n ** 2)

Ce qui donne:

  • On assigne une liste vide à la variable double_odds
  • On assigne à cette liste les valeurs correspondantes avec la méthode append
  • On exécute une boucle for permettant de parcourir les éléments de la liste numbers
  • On finit par une condition if permettant de vérifier si le nombre est impair

 

Ce code devient avec une compréhension de liste:

numbers = [1, 2, 3, 4, 5]
doubled_odds = [n ** 2 for n in numbers if n % 2 == 1]

 

Le passage d’une boucle for à une compréhension se fait avec:

  • On assigne directement notre variable double_odds en ouvrant les crochets
  • On copie l’expression qu’on souhaite ajouter dans la liste
  • On copie la boucle for et son contenu sans les ‘:’
  • On copie la condition if avec son contenu (également sans ‘:’)

 

2. Fonctions Lambda

En Python, la fonction Lambda est une fonction ‘anonyme’, elle n’est donc pas défini par un nom.
Alors que les fonctions ‘normales’ sont définies à l’aide du mot-clé def suivi du nom de la fonction, les fonctions anonymes sont définies à l’aide du mot-clé lambda.

Par conséquent, ces fonctions anonymes sont également appelées fonctions lambda.

A quoi elles servent?

Les fonctions Lambda sont utilisées pour créer de petites fonctions ponctuelles et anonymes dans Python. Fondamentalement, elles vous permettent d’appliquer une fonction sans créer de fonction.

La syntaxe de base des fonctions lambda est:

lambda arguments: expression

Notez que les fonctions lambda peuvent faire tout ce que font les fonctions normales, tant qu’il n’y a qu’une seule expression.
Voici un exemple simple pour avoir une meilleure idée de la puissance des fonctions lambda:

double = lambda x: x * 2
print(double(5))

> 10

 

3. Map et Filter

Une fois que vous maîtrisez les fonctions lambda, apprendre à les associer aux fonctions map et filter peut être très puissant.

Map

En gros, map prend une liste et la transforme en une nouvelle liste en effectuant une opération sur chaque élément (à partir d’une fonction lambda). Dans l’exemple ci-dessous, la fonction map parcourt chaque élément d’une liste et retourne une nouvelle liste dans laquelle chaque élément est multiplié par 2. Notez bien que la fonction list permet de retourner en sortie un objet de type liste.

# map
seq = [1, 2, 3, 4, 5]
result = list(map(lambda var: var*2, seq))
print(result)

> [2, 4, 6, 8, 10]

Filter

La fonction filter prend une liste et applique une règle (ou condition). Un peu comme map sauf qu’elle renvoie un sous-ensemble de la liste d’origine en comparant chaque élément à la règle de filtrage booléen. Dans l’exemple ci-dessous, on applique la fonction filter avec comme règle une fonction qui prend seulement les valeurs supérieurs à 2. On filtre donc notre liste pour n’afficher seulement la sous-liste de valeurs plus grandes que 2.

# filter
seq = [1, 2, 3, 4, 5]
result = list(filter(lambda x: x > 2, seq))
print(result)

> [3, 4, 5]

 

4. Arange et Linspace

Pour créer des tableaux Numpy rapides et faciles, ne cherchez pas plus loin que les fonctions arange et linspace. Chacune a un but spécifique, mais on les préfère à la fonction range car elles permettent de produire des tableaux NumPy, qui sont généralement plus faciles à utiliser pour la Data Science.

Arange

arange renvoie des valeurs espacées uniformément dans un intervalle donné. En plus d’un point de départ (start) et d’arrêt (stop), vous pouvez également définir une taille de pas (step) ou un type de données si nécessaire. Notez que le point d’arrêt est une valeur de “coupure”, donc il ne sera pas inclus dans le tableau résultant.

# np.arange(start, stop, step)
np.arange(2, 8, 2)

> array([2, 4, 6])

Linspace

linspace est très similaire mais avec tout de même une légère différence. linspace renvoie des nombres espacés uniformément sur un intervalle spécifié. Donc, étant donné un point de départ (start) et d’arrêt (stop), ainsi qu’un certain nombre de valeurs (num), linspace les espacera équitablement pour obtenir en sortie un tableau Numpy contenant exactement le nombre de valeurs spécifié (num). Notez que cette fois-ci, la valeur stop est présente dans le tableau résultant.
Ceci est particulièrement utile pour les visualisations de données et les axes du graphique.

# np.linspace(start, stop, num)
np.arange(3.0, 4.0, num=5)

> array([3.0, 3.25, 3.5, 3.75, 4.0])

 

5. L’histoire des axes

Vous avez peut-être rencontré ce problème lors de la suppression d’une colonne dans un tableau Pandas ou lors de l’addition de valeurs dans une matrice NumPy. Si non, vous y serez sans doute confronté un jour.
Prenons l’exemple de la suppression d’une colonne pour le moment:

df.drop('Row A', axis=0)
df.drop('Column A', axis=1)

Combien d’entre vous ont écrit cette ligne en ignorant ce que cela signifiait? Comme vous pouvez probablement le déduire, on définit l’axe sur 1 si l’on souhaite traiter les colonnes et sur 0 pour les lignes. Mais pourquoi?
Voici une astuce pour s’en souvenir:

df.shape

> (# of Rows, # of Columns)

En appelant l’attribut shape à partir d’un DataFrame, Pandas nous renvoie un tuple avec en première valeur le nombre de lignes et en deuxième valeur le nombre de colonnes. C’est un bon rappel pour se souvenir de l’indexage Python, les lignes sont à 0 et les colonnes à 1, un peu comme la façon dont nous déclarons la valeur de notre axe.

 

 

6. Concat, Merge et Join

Si vous êtes familier avec SQL, ces concepts seront probablement beaucoup plus faciles pour vous. Quoi qu’il en soit, ces fonctions sont essentiellement des moyens de combiner des données de manière spécifique. Il peut être difficile de savoir quel concept utilisé et à quel moment.

Concat

concat permet à l’utilisateur d’ajouter un ou plusieurs DataFrames les uns aux autres en dessous ou à côté (en fonction de la définition de l’axe).

fonction concat

Merge

merge combine plusieurs données sur des colonnes spécifiques et communes qui servent de clé primaire.

fonction merge

 

Join

join, tout comme merge, combine deux DataFrames. Cependant, il les joint en fonction de leurs indices, plutôt que par rapport à d’une colonne spécifiée.

fonction join

 

Vous pouvez consulter l’excellente documentation Pandas pour découvrir d’autres syntaxes spécifiques et des exemples plus concrets ainsi que des cas particuliers que vous pourriez rencontrer à l’avenir.

 

 

7. Apply de Pandas

apply c’est un peu une fonction map mais adapté aux DataFrames Pandas ou plus précisément aux objets Series. Si vous n’êtes pas familier, les objets Series sont assez similaires aux tableaux NumPy pour la plupart.

apply envoie une fonction à chaque élément le long d’une colonne ou d’une ligne en fonction de ce que vous spécifiez (paramètre axis). Vous pouvez imaginer à quel point cela peut être utile, en particulier pour formater et manipuler des valeurs sur une colonne DataFrame entière, sans avoir à créer de boucle.

Consultez ma formation Analyse et Visualisation de Données ici pour plus de détails et d’exemples sur l’utilisation de la méthode apply.

 

Pivot de Tables

Dernier point mais non des moindres, ce sont les tableaux croisés dynamiques. Si vous êtes familier avec Microsoft Excel, vous avez probablement déjà entendu parler des tableaux croisés dynamiques. La fonction intégrée Pandas pivot_table crée un tableau pivotant de type feuille de calcul en tant que DataFrame. Notez que les niveaux dans le tableau croisé dynamique sont stockés dans des objets MultiIndex sur l’index et les colonnes du DataFrame résultant.

Consultez ma formation Analyse et Visualisation de Données ici pour plus de détails et d’exemples sur l’utilisation de la méthode pivot_table.

 

 

Pour finir…

C’est tout pour cet article. J’espère que quelques-uns de ces aperçus vous ont permis de vous familiariser avec les méthodes, les fonctions et les concepts importants ou mêmes de les revoir.
Vous les rencontrez très fréquemment lors de l’utilisation de Python pour la Data Science.