Dataframes: Pandas vs. Dask. Un’analisi comparativa

Un confronto tra le librerie di manipolazione dati più diffuse di Python

Articolo in lingua originale di Ulrik Thyge Pedersen (Contatti: LinkedIn e Kaggle)

Foto di Peter Burdon su Unsplash

 

Introduzione

I DataFrame sono una struttura di dati molto utilizzata per la manipolazione e l’analisi dei dati in Python. Pandas e Dask sono due librerie popolari che forniscono la funzionalità dei DataFrame in Python.

Dataframe di Pandas

Pandas è una libreria open-source per l’analisi dei dati veloce, potente e flessibile che fornisce una struttura dati DataFrame per lavorare con dati tabellari. Pandas si basa su NumPy e fornisce funzioni di manipolazione dei dati e strumenti di visualizzazione dei dati facili da usare.

Il DataFrame di Pandas è una struttura di dati bidimensionale simile a una tabella, con colonne di tipi potenzialmente diversi. È simile a un foglio di calcolo o a una tabella SQL, con colonne denominate e righe numerate. Pandas fornisce una ricca serie di operazioni per la manipolazione e la trasformazione dei dati, tra cui l’unione, il raggruppamento, il filtraggio e il pivoting.

Ecco un esempio di creazione di un DataFrame di Pandas:

import pandas as pd

data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dave'],

     'Age': [25, 30, 35, 40],

     'Gender': ['Female', 'Male', 'Male', 'Male']}

df = pd.DataFrame(data)

print(df)

Questo porterà ad ottenere come output il seguente DataFrame:

    Name  Age  Gender

0  Alice     25    Female

1  Bob       30    Male

2  Charlie   35    Male

3  Dave      40     Male

Dataframe di Dask

Dask è una libreria flessibile di calcolo parallelo per il calcolo analitico in Python. Dask fornisce una struttura dati DataFrame, progettata per lavorare con insiemi di dati più grandi della memoria. I DataFrame di Dask sono costruiti sulla base dei DataFrame di Pandas e forniscono un’API simile.

I DataFrame di Dask sono progettati per funzionare con framework di calcolo parallelo come dask.distributed, che consente a Dask di scalare i calcoli su più core e più macchine. I DataFrames di Dask possono essere utilizzati per gestire insiemi di dati troppo grandi per essere memorizzati su una singola macchina.

Ecco un esempio di creazione di un DataFrame di Dask:

import dask.dataframe as dd
data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dave'],
'Age': [25, 30, 35, 40],
'Gender': ['Female', 'Male', 'Male', 'Male']}
df = dd.from_pandas(pd.DataFrame(data), npartitions=2)
print(df.compute())

Questo codice genererà come output lo stesso DataFrame dell’esempio precedente, ma sarà un DataFrame Dask con due partizioni.

Foto di Arjay Bernardo su Unsplash

Differenze tra Pandas e Dask

Sebbene Pandas e Dask DataFrames condividano un’API simile, ci sono alcune differenze fondamentali da tenere a mente.

In primo luogo, Pandas è stato progettato per lavorare con insiemi di dati che si adattano alla memoria di una singola macchina. Dask, invece, è stato progettato per lavorare con insiemi di dati più grandi della memoria, che possono richiedere un’elaborazione distribuita.

In secondo luogo, le operazioni di Dask possono essere valutate pigramente, il che consente un uso più efficiente della memoria e del calcolo. Le operazioni di Pandas sono valutate in modo eager, il che può essere meno efficiente in termini di memoria per i grandi insiemi di dati.

Infine, la funzionalità di calcolo distribuito di Dask consente di scalare il calcolo su più core e più macchine. Pandas è limitato a una sola macchina.

È importante scegliere la libreria appropriata in base alle dimensioni e alla complessità dell’insieme di dati e alle risorse di calcolo disponibili.

 

Confronto tra API di Pandas e Dask

Performance

Pandas è una libreria veloce per la manipolazione dei dati su insiemi di dimensioni medio-piccole. Tuttavia, può diventare lenta e richiedere molta memoria con insiemi di dati di grandi dimensioni. Dask, invece, utilizza l’elaborazione parallela per gestire insiemi di dati più grandi della memoria ed è più adatto al calcolo distribuito su insiemi di dati più grandi.

Per dimostrare questa differenza di prestazioni, possiamo creare un grande dataset e confrontare i tempi di elaborazione di Pandas e Dask per alcune operazioni comuni.

import pandas as pd
import dask.dataframe as dd
import time


# create a large dataset
n_rows = 10000000
df_pandas = pd.DataFrame({'A': range(n_rows), 'B': range(n_rows)})

# time Pandas operations
start_time = time.time()
df_pandas.groupby('A').sum()
end_time = time.time()
print('Pandas groupby time:', end_time - start_time)

# convert Pandas dataframe to Dask dataframe
df_dask = dd.from_pandas(df_pandas, npartitions=4)

# time Dask operations
start_time = time.time()
df_dask.groupby('A').sum().compute()
end_time = time.time()
print('Dask groupby time:', end_time - start_time)

Eseguendo questo codice su una macchina con 4 core e 16GB di RAM otteniamo il seguente output:

Pandas groupby time: 6.717131614685059
Dask groupby time: 1.140073299407959

Come possiamo vedere, Dask è significativamente più veloce di Pandas per questa operazione su un ampio dataset.

 

Foto di Federico Beccari su Unsplash

Facilità di utilizzo

Pandas è una libreria più user-friendly e più semplice da usare rispetto a Dask. Pandas è una libreria più facile da usare rispetto a Dask. Pandas ha una sintassi semplice e intuitiva e le sue funzioni sono progettate per lavorare insieme senza problemi. Dask, invece, richiede conoscenze più specialistiche e può richiedere un ulteriore apprendimento.

Per mostrare la differenza di facilità d’uso, confrontiamo le sintassi per alcune operazioni comuni in Pandas e Dask:

# create a dataframe
df_pandas = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df_dask = dd.from_pandas(df_pandas, npartitions=2)

# select a column
df_pandas['A']
df_dask['A']

# filter rows
df_pandas[df_pandas['A'] > 1]
df_dask[df_dask['A'] > 1]

# groupby and aggregate
df_pandas.groupby('A').sum()
df_dask.groupby('A').sum().compute()

Come possiamo vedere, la sintassi di Pandas e Dask è molto simile, ma Dask richiede un metodo compute() aggiuntivo da richiamare quando si eseguono di aggregazioni.

Scalabilità

Dask è progettato per scalare e gestire insiemi di dati più grandi della memoria, mentre Pandas è limitato a dataset che entrano nella memoria. Dask può distribuire i calcoli su più core o addirittura su più macchine, consentendo di gestire dataset molto più grandi di Pandas.

Per dimostrare la scalabilità di Dask, confrontiamo il tempo di elaborazione di un insieme di dati più grande utilizzando Pandas e Dask.

# create a larger dataset
n_rows = 100000000
df_pandas = pd.DataFrame({'A': range(n_rows), 'B': range(n_rows)})

# time Pandas operations
start_time = time.time()
df_pandas.groupby('A').sum()
end_time = time.time()
print('Pandas groupby time:', end_time - start_time)

# convert Pandas dataframe to Dask dataframe
df_dask = dd.from_pandas(df_pandas, npartitions=4)

# time Dask operations
start_time = time.time()
df_dask.groupby('A').sum().compute()
end_time = time.time()
print('Dask groupby time:', end_time - start_time)

Eseguendo questo codice su una macchina con 4 core e 16GB di RAM otteniamo il seguente output:

Pandas groupby time: 170.04002714157104
Dask groupby time: 26.93851613998413

Come si può vedere, Dask è molto più veloce di Pandas per quest’operazione eseguita su un dataset più ampio. L’abilità di scalabilità di Dask lo rende una scelta migliore per la gestione di dataset più ampi.

Foto di Daniele Franchi su Unsplash

Conclusione

In conclusione, sia Pandas che Dask sono strumenti potenti per la manipolazione e l’analisi dei dati in Python. Pandas è più adatto per dataset di piccole-medie dimensioni che entrano in memoria, mentre Dask è progettato per gestire dataset di dimensioni maggiori rispetto alla memoria attraverso l’elaborazione distribuita.

Mentre Pandas è più facile da usare, le prestazioni e la scalabilità di Dask lo rendono una scelta migliore per gestire insiemi di dati più grandi. Tuttavia, Dask richiede conoscenze più specialistiche e può richiedere un ulteriore apprendimento.

È importante scegliere la libreria appropriata in base alle dimensioni e alla complessità del set di dati, oltre che alle risorse di calcolo disponibili!

 

Share:

Contenuti
Torna in alto