Itérer sur un dataframe Pandas (Partie 3/3)
Les vectorisations Pandas et Numpy
Nous avons vu dans les 2 premières parties de cette série d'articles plusieurs méthodes pour itérer sur les lignes d'un dataframe Pandas.
Dans notre objectif d'incrémenter de 1 un champs numérique, toutes les méthodes utilisées traitaient les valeurs individuellement.
Dans cette partie nous allons voir comment chaque colonne peut être traitée comme étant un vecteur.
Pour rappel, nous travaillons sur les mêmes données que les 2 premières parties de cette série, à savoir la base clients d'une banque.
Cette base contient 41.188 lignes pour 21 colonnes.
Sur ces 21 colonnes, 11 sont de nature qualitative (situation maritale, niveau d'éducation, etc ...) et 10 sont quantitatives
(âge, nombre de campagnes dont le client a fait l'objet, etc ...).
C'est précisément le nombre de campagnes (colonne "campaign") qui nous intéresse et pour l'exemple nous voulons simplement incrémenter
de 1 cette variable.
Chargeons tout d'abord nos données :
import pandas as pd
bank = pd.read_csv('bank-datas.csv', sep=';',)
Vectorisation Pandas
Le fait de sommer directement une colonne Pandas, que ce soit avec une autre ou bien avec une variable quelconque, va nous permettre de
bénéficier de plusieurs apports non négligeables. Tout d'abord, la colonne va être considérée comme un vecteur. Pour la machine, sommer
2 vecteurs ou 2 valeurs individuelles revient quelque peu à la même chose, nous gagnons donc un temps considérable.
Par ailleurs, Pandas va gérer pour nous la mémoire de manière plus efficace et sera même en mesure d'utiliser un traitement parallèle si
besoin.
%%timeit -n 1000
nb_campaign = ( bank['campaign'] + 1).to_list()
Le code est des plus simples.
Verdict : un temps moyen de 593 µs par itération.
Vectorisation Numpy
La vectorisation Numpy fonctionne à l'identique celle de Pandas. Nous gagnons exclusivement sur le fait que Numpy est spécialisé, et de fait, fait état de fonctions moins surchargées que Pandas.
%%timeit -n 1000
nb_campaign = (bank['campaign'].to_numpy() + 1).tolist()
Verdict : un temps moyen de 453 µs par itération.
Conclusion
Voilà, nous avons fait le tour des possibilités qui nous sont offertes. Chacun fera ses choix en fonction du contexte et en ayant désormais en tête qu'il existe un panel de solutions dont les performances peuvent varier drastiquement.
Retrouvez dans la rubrique "Nos datasets" toutes les données dont vous aurez besoin pour tester et pratiquer !