Novità in Pandas 2.1

Pandas 2.1 News

Le cose più interessanti della nuova release

Foto di Lukas W. su Unsplash

pandas 2.1 è stato rilasciato il 30 agosto 2023. Diamo un’occhiata alle novità introdotte da questa versione e a come ci aiuterà a migliorare i nostri carichi di lavoro su pandas. Include una serie di miglioramenti e anche un insieme di nuove deprecazioni.

pandas 2.1 si basa fortemente sull’integrazione con PyArrow che è diventata disponibile con pandas 2.0. Ci siamo concentrati molto sulla creazione del supporto per nuove funzionalità che si prevede diventeranno le impostazioni predefinite con pandas 3.0. Scopriamo cosa significa per te. Esamineremo nel dettaglio i miglioramenti più importanti.

Faccio parte del team principale di pandas. Sono un ingegnere open source per Coiled, dove lavoro su Dask, inclusa l’ottimizzazione dell’integrazione con pandas.

Evitare il tipo di dati oggetto NumPy per le colonne di stringhe

Uno dei principali punti critici in pandas è la rappresentazione inefficiente delle stringhe. Questo è un argomento su cui abbiamo lavorato per molto tempo. Il primo dtype di stringa supportato da PyArrow è diventato disponibile in pandas 1.3. Ha il potenziale per ridurre l’utilizzo della memoria di circa il 70% e migliorare le prestazioni. Ho approfondito questo argomento in uno dei miei post precedenti, che include confronti di memoria e misurazioni delle prestazioni (in breve: è impressionante).

Abbiamo deciso di introdurre una nuova opzione di configurazione che memorizzerà tutte le colonne di stringhe in un array PyArrow. Non dovrai più preoccuparti di convertire le colonne di stringhe, funzionerà automaticamente.

Puoi attivare questa opzione con:

pd.options.future.infer_string = True

Questo comportamento diventerà predefinito in pandas 3.0, il che significa che le colonne di stringhe saranno sempre supportate da PyArrow. È necessario installare PyArrow per utilizzare questa opzione.

PyArrow ha un comportamento diverso dal tipo di dati oggetto NumPy, il che può rendere difficile capirlo nel dettaglio. Abbiamo implementato il dtype di stringa utilizzato per questa opzione in modo da essere compatibile con le semantica di NumPy. Si comporterà esattamente come farebbero le colonne di oggetti NumPy. Incoraggio tutti a provarlo!

Migliorato il supporto PyArrow

Abbiamo introdotto DataFrame supportato da PyArrow in pandas 2.0. Uno dei principali obiettivi per noi è stato migliorare l’integrazione all’interno di pandas negli ultimi mesi. Abbiamo cercato di rendere il passaggio da DataFrames supportati da NumPy il più semplice possibile. Una delle aree su cui ci siamo concentrati è stata la risoluzione dei colli di bottiglia delle prestazioni, poiché ciò ha causato rallentamenti imprevisti in precedenza.

Diamo un’occhiata a un esempio:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
        "foo": np.random.randint(1, 10, (1_000_000, )),
        "bar": np.random.randint(1, 100, (1_000_000,)),
    }, dtype="int64[pyarrow]")

grouped = df.groupby("foo")

Il nostro DataFrame ha 1 milione di righe e 10 gruppi. Diamo un’occhiata alle prestazioni su pandas 2.0.3 rispetto a pandas 2.1:

# pandas 2.0.3
10.6 ms ± 72.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
# pandas 2.1.0
1.91 ms ± 3.16 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

In questa specifica esempio, la nuova versione è 5 volte più veloce. merge è un’altra funzione comunemente utilizzata che ora sarà più rapida. Speriamo che l’esperienza con i DataFrame supportati da PyArrow sia molto migliore ora.

Copia su Scrittura

La Copia su Scrittura è stata introdotta inizialmente in pandas 1.5.0 ed è prevista diventi il comportamento predefinito in pandas 3.0. La Copia su Scrittura offre già un’esperienza positiva su pandas 2.0.x. Ci siamo principalmente concentrati sulla correzione di bug noti e sul miglioramento delle prestazioni. Consiglio di utilizzare questa modalità in produzione ora. Ho scritto una serie di articoli del blog che spiegano cos’è la Copia su Scrittura e come funziona. Questi articoli approfondiscono l’argomento e spiegano come funziona internamente e cosa ci si può aspettare da essa. Ciò include prestazioni e comportamento.

Abbiamo visto che Copy-on-Write può migliorare le prestazioni dei flussi di lavoro reali di oltre il 50%.

Deprecazione dell’upcasting silenzioso nelle operazioni simili a setiten

Storicamente, pandas modificava silenziosamente il dtype di una delle tue colonne se impostavi un valore incompatibile. Vediamo un esempio:

ser = pd.Series([1, 2, 3])0    11    22    3dtype: int64

Abbiamo una Serie con interi, che risultano in un dtype intero. Impostiamo la lettera "a" nella seconda riga:

ser.iloc[1] = "a"0    11    a2    3dtype: object

Questo cambia il dtype della tua Serie in oggetto. L’oggetto è l’unico dtype che può contenere interi e stringhe. Questo è un grande problema per molti utenti. Le colonne di tipo oggetto occupano molta memoria, i calcoli non funzionano più, le prestazioni diminuiscono e molte altre cose. Ha anche aggiunto molti casi speciali internamente per accomodare queste cose. Le modifiche silenziose di dtype nel mio DataFrame erano un fastidio maggiore per me in passato. Questo comportamento è ora deprecato e genererà un FutureWarning:

FutureWarning: L'impostazione di un elemento di dtype incompatibile è deprecata e genererà un errore futuro di pandas. Il valore 'a' ha un dtype incompatibile con int64, eseguire prima un cast esplicito in un dtype compatibile.  ser.iloc[1] = "a"

Operazioni come il nostro esempio genereranno un errore in pandas 3.0. I dtypes delle colonne di un DataFrame rimarranno consistenti tra diverse operazioni. Sarai obbligato a essere esplicito quando desideri cambiare il tuo dtype, il che aggiunge un po’ di codice ma rende più facile da seguire per i futuri sviluppatori.

Questa modifica riguarda tutti i dtypes, ad esempio impostare un valore float in una colonna intera genererà un errore.

Aggiornamento alla nuova versione

Puoi installare la nuova versione di pandas con:

pip install -U pandas

O:

mamba install -c conda-forge pandas=2.1

Questo ti fornirà la nuova versione nel tuo ambiente.

Conclusioni

Abbiamo esaminato un paio di miglioramenti che ti aiuteranno a scrivere codice più efficiente. Ciò include miglioramenti delle prestazioni, una modalità di selezione più semplice per le colonne di stringhe sostenute da PyArrow e ulteriori miglioramenti per Copy-on-Write. Abbiamo anche visto una deprecazione che renderà il comportamento di pandas più prevedibile nella prossima versione principale.

Grazie per la lettura. Sentiti libero di contattarci per condividere le tue opinioni e feedback.