Comment aider les pandas à traiter de grandes quantités de données?

La bibliothèque pandas est l'un des meilleurs outils pour l'analyse exploratoire des données . Mais cela ne signifie pas que les pandas sont un outil universel adapté à la résolution de tout problème. En particulier, nous parlons de traiter de grandes quantités de données. Il m'est arrivé de passer très, très longtemps, à attendre que les pandas lisent beaucoup de fichiers, ou les traitent, calculant sur la base des informations qu'ils contiennent des indicateurs qui m'intéressent. Le fait est que les pandas ne prennent pas en charge les mécanismes de traitement de données parallèles. Par conséquent, ce package ne tire pas pleinement parti des capacités des processeurs multicœurs modernes. Les grands ensembles de données des pandas sont traités lentement.



Récemment, je me suis mis à la recherche de quelque chose qui pourrait m'aider dans le traitement du big data. J'ai réussi à trouver ce que je cherchais, j'ai intégré l'outil trouvé dans mon pipeline de traitement de données. Je l'utilise pour travailler avec de grandes quantités de données. Par exemple, pour lire des fichiers contenant 10 gigaoctets de données, pour les filtrer et les agréger. Lorsque je parviens à résoudre de tels problèmes, j'enregistre ce que j'ai obtenu dans un fichier CSV plus petit qui convient aux pandas, puis je commence à travailler avec les données obtenues à l'aide de pandas.

Voici un cahier Jupyter contenant des exemples de ce matériau que vous pouvez expérimenter.

Dask


L'outil que j'utilise pour traiter de grandes quantités de données est la bibliothèque Dask . Il prend en charge le traitement parallèle des données, vous permettant d'accélérer le travail des outils existants. Cela inclut numpy, pandas et sklearn. Dask est un projet open source gratuit. Il utilise des API Python et des structures de données, ce qui facilite l'intégration de Dask dans des projets existants. Si nous décrivons brièvement Dask, alors nous pouvons dire que cette bibliothèque simplifie la résolution de problèmes ordinaires et permet de résoudre des problèmes d'une complexité énorme.

Comparaison des pandas et des dask


Je peux décrire les possibilités de Dask ici, car cette bibliothèque a beaucoup de choses intéressantes, mais à la place, je ne considère qu'un exemple pratique. Au cours du travail, je rencontre généralement des ensembles de fichiers volumineux, dont les données stockées doivent être analysées. Jouons une de mes tâches typiques et créons 10 fichiers, chacun contenant 100 000 enregistrements. Chacun de ces fichiers a une taille de 196 Mo.

from sklearn.datasets import make_classification
import pandas as pd
for i in range(1, 11):
    print('Generating trainset %d' % i)
    x, y = make_classification(n_samples=100_000, n_features=100)
    df = pd.DataFrame(data=x)
    df['y'] = y
    df.to_csv('trainset_%d.csv' % i, index=False)

Maintenant, lisez ces fichiers à l'aide de pandas et mesurez le temps nécessaire pour les lire. Il n'y a pas de support intégré dans les pandas glob, nous devons donc lire les fichiers en boucle:

%%time
import glob
df_list = []
for filename in glob.glob('trainset_*.csv'):
    df_ = pd.read_csv(filename)
    df_list.append(df_)
df = pd.concat(df_list)
df.shape

Il a fallu 16 secondes aux pandas pour lire ces fichiers:

CPU times: user 14.6 s, sys: 1.29 s, total: 15.9 s
Wall time: 16 s

Si nous parlons de Dask, on peut noter que cette bibliothèque vous permet de traiter des fichiers qui ne tiennent pas en mémoire. Cela se fait en les divisant en blocs et en compilant des chaînes de tâches. Mesurons le temps dont Dask a besoin pour lire ces fichiers:

import dask.dataframe as dd
%%time
df = dd.read_csv('trainset_*.csv')
CPU times: user 154 ms, sys: 58.6 ms, total: 212 ms
Wall time: 212 ms

Dask a pris 154 ms! Comment est-ce possible? En fait, ce n'est pas possible. Dask implémente un paradigme de tâche retardée. Les calculs sont effectués uniquement lorsque leurs résultats sont nécessaires. Nous décrivons le graphique d'exécution, qui donne à Dask la capacité d'optimiser l'exécution des tâches. Répétez l'expérience. Notez que la fonction read_csvde Dask a un support intégré pour travailler avec glob:

%%time
df = dd.read_csv('trainset_*.csv').compute()
CPU times: user 39.5 s, sys: 5.3 s, total: 44.8 s
Wall time: 8.21 s

L'utilisation de la fonction computeforce Dask à retourner le résultat, pour lequel vous devez vraiment lire les fichiers. Le résultat est que Dask lit les fichiers deux fois plus vite que les pandas.

On peut dire que Dask vous permet d'équiper des projets Python avec des outils de mise à l'échelle.

Comparaison de l'utilisation du processeur dans Pandas et Dask


Dask utilise-t-il tous les cœurs de processeur du système? Comparez l'utilisation des ressources du processeur dans les pandas et dans Dask lors de la lecture de fichiers. Le même code que nous avons examiné ci-dessus s'applique ici.


Utilisation des ressources du processeur lors de la lecture de fichiers avec des pandas


Utilisation des ressources du processeur lors de la lecture de fichiers à l'aide de Dask

Quelques images animées ci-dessus vous permettent de voir clairement comment les pandas et Dask utilisent les ressources du processeur lors de la lecture des fichiers.

Que se passe-t-il dans les entrailles de Dask?


Une trame de données Dask se compose de plusieurs trames de données pandas, qui sont séparées par des index. Lorsque nous exécutons une fonction read_csvdepuis Dask, elle lit le même fichier par plusieurs processus.

Nous pouvons même visualiser un graphique de cette tâche.

exec_graph = dd.read_csv('trainset_*.csv')
exec_graph.visualize()


Graphique d'exécution Dask lors de la lecture de plusieurs fichiers

Inconvénients de Dask


Peut-être que vous avez maintenant la pensée suivante: "Si la bibliothèque Dask est si bonne, pourquoi ne pas simplement l'utiliser à la place des pandas?" Mais pas si simple. Seules certaines fonctions pandas sont portées sur Dask. Le fait est que certaines tâches sont difficiles à paralléliser. Par exemple, trier des données et affecter des index à des colonnes non triées. Dask n'est pas un outil qui résout absolument toutes les tâches d'analyse et de traitement des données. Il est recommandé d'utiliser cette bibliothèque uniquement pour travailler avec des ensembles de données qui ne tiennent pas entièrement en mémoire. Étant donné que la bibliothèque Dask est basée sur les pandas, tout ce qui fonctionne lentement dans les pandas restera lent dans Dask. Comme je l'ai déjà dit, Dask est un outil utile que vous pouvez intégrer dans un pipeline de traitement de données, mais cet outil ne remplace pas d'autres bibliothèques.

Installer Dask


Pour installer Dask, vous pouvez utiliser la commande suivante:

python -m pip install "dask[complete]"

Sommaire


Dans cet article, je n'ai abordé que superficiellement les capacités de Dask. Si vous êtes intéressé par cette bibliothèque - jetez un œil à ces excellents tutoriels sur Dask et à la documentation de datafreymam Dask. Et si vous voulez savoir quelles fonctions prennent en charge les trames de données Dask, lisez la description de l' API DataFrame.

Souhaitez-vous utiliser la bibliothèque Dask?

Nous vous rappelons que nous poursuivons le concours de pronostics dans lequel vous pouvez gagner un tout nouvel iPhone. Il est encore temps de s'y attaquer et de faire les prévisions les plus précises sur les valeurs d'actualité.


All Articles