Le cose più interessanti della nuova versione

fotografato da 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 carichi di lavoro dei nostri panda. Include una serie di miglioramenti e anche una serie di nuove deprecazioni.

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

Faccio parte del team principale dei panda. Sono un ingegnere open source per Arrotolato dove lavoro su Dask, incluso il miglioramento dell’integrazione dei panda.

Evitare NumPy object-dtype per le colonne stringa

Uno dei principali punti dolenti dei panda è la rappresentazione inefficiente delle stringhe. Questo è un argomento su cui lavoriamo da parecchio 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 precedentiche include confronti di memoria e misurazioni delle prestazioni (tldr: è impressionante).

Abbiamo deciso di introdurre una nuova opzione di configurazione che memorizzerà tutte le colonne stringa in un array PyArrow. Non devi più preoccuparti di trasmettere colonne di stringhe, funzionerà e basta.

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. Devi installare PyArrow per utilizzare questa opzione.

PyArrow ha un comportamento diverso rispetto al dtype dell’oggetto NumPy, il che può rendere difficile capirlo in dettaglio. Abbiamo implementato la stringa dtype utilizzata per questa opzione per essere compatibile con la semantica NumPy. Si comporterà esattamente come farebbero le colonne oggetto NumPy. Incoraggio tutti a provarlo!

Supporto PyArrow migliorato

Abbiamo introdotto DataFrame supportato da PyArrow in Pandas 2.0. Negli ultimi mesi uno dei nostri obiettivi principali è stato quello di migliorare l’integrazione tra i panda. Il nostro obiettivo era rendere il passaggio dai DataFrames supportati da NumPy il più semplice possibile. Un’area su cui ci siamo concentrati è stata la risoluzione dei colli di bottiglia delle prestazioni, poiché in passato ciò aveva causato rallentamenti imprevisti.

Diamo un’occhiata ad 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 Panda 2.0.3 rispetto a Panda 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)

Questo particolare esempio è 5 volte più veloce nella nuova versione. merge è un’altra funzione comunemente usata che ora sarà più veloce. Ci auguriamo che l’esperienza con i DataFrames supportati da PyArrow sia ora molto migliore.

Copia su scrittura

La funzione Copy-on-Write è stata inizialmente introdotta in Pandas 1.5.0 e si prevede che diventerà il comportamento predefinito in Pandas 3.0. Copy-on-Write offre già una buona esperienza su Pandas 2.0.x. Ci siamo concentrati principalmente sulla correzione dei bug noti e sul renderlo più veloce. Consiglierei di utilizzare questa modalità in produzione ora. Ho scritto una serie di post sul blog spiegando cos’è il Copy-on-Write E come funziona. Questi post del blog entrano nei dettagli e spiegano come funziona internamente Copy-on-Write e cosa puoi aspettarti da esso. Ciò include prestazioni e comportamento.

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

Deprecato l’upcasting silenzioso nelle operazioni simili a setiten

Storicamente, i panda cambierebbero silenziosamente il dtype di una delle tue colonne se impostavi un valore incompatibile. Diamo un’occhiata ad un esempio:

ser = pd.Series((1, 2, 3))

0 1
1 2
2 3
dtype: int64

Abbiamo una serie con numeri interi, che risulterà in un dtype intero. Impostiamo la lettera "a" nella seconda riga:

ser.iloc(1) = "a"

0 1
1 a
2 3
dtype: object

Questo cambia il dtype della tua serie in oggetto. Object è l’unico dtype che può contenere numeri interi e stringhe. Questo è un grosso problema per molti utenti. Le colonne degli oggetti occupano molta memoria, i calcoli non funzioneranno più, le prestazioni diminuiscono e molte altre cose. Ha anche aggiunto molti involucri speciali internamente per accogliere queste cose. I cambiamenti silenziosi di tipo nel mio DataFrame erano un grosso fastidio per me in passato. Questo comportamento è ora deprecato e genererà un FutureWarning:

FutureWarning: Setting an item of incompatible dtype is deprecated and will raise in a future 
error of pandas. Value 'a' has dtype incompatible with int64, please explicitly cast to a
compatible dtype first.
ser.iloc(1) = "a"

Operazioni come il nostro esempio genereranno un errore in Pandas 3.0. I dtype delle colonne DataFrames rimarranno coerenti tra le diverse operazioni. Dovrai essere esplicito quando vuoi cambiare il tuo dtype, il che aggiunge un po’ di codice ma lo rende più facile da seguire per i futuri sviluppatori.

Questa modifica influisce su tutti i dtype, ad esempio anche l’impostazione di un valore float in una colonna intera aumenterà.

Aggiornamento alla nuova versione

Puoi installare la nuova versione di Panda con:

pip install -U pandas

O:

mamba install -c conda-forge pandas=2.1

Questo ti darà la nuova versione nel tuo ambiente.

Conclusione

Abbiamo esaminato un paio di miglioramenti che ti aiuteranno a scrivere codice più efficiente. Ciò include miglioramenti delle prestazioni, attivazione più semplice delle colonne di stringhe supportate da PyArrow e ulteriori miglioramenti per Copy-on-Write. Abbiamo anche assistito a una deprecazione che renderà più semplice prevedere il comportamento dei panda nella prossima versione principale.

Grazie per aver letto. Sentiti libero di contattarci per condividere i tuoi pensieri e feedback.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *