La sfârșitul lunii ianuarie s-a lansat pandas 3.0.0, care a venit cu funcționalități majore în ecosistemul pentru analiza datelor în Python.

În urmă cu aproximativ trei ani scriam despre lansarea pandas 2.0.0, care era considerată cea mai importantă actualizare din ultimii 15 ani. În prezent, avem a treia versiune majoră de pandas, iar unii spun că aceasta este o actualizare și mai mare.


O să vedem în continuarea articolului vom vedea argumentele, pentru că voi descrie principalele funcționalități aduse de ultima versiune.

PyArrow ca backend implicit

pandas 1.x era construit pe fundația NumPy, care a fost creat inițial pentru calcule matematice și matriceale. Odată cu lansarea versiunii 2.0, scriam că datele nu vor mai fi reprezentate prin NumPy, ca în versiunile anterioare, ci prin Apache Arrow.

Cea mai mare schimbare în versiunea 3.0 este trecerea la PyArrow ca motor principal pentru stocarea datelor. PyArrow este biblioteca de Python care servește drept interfață pentru Apache Arrow, un framework revoluționar conceput pentru a accelera analiza datelor. De asemenea, PyArrow a fost proiectat special pentru tabele de date (DataFrames).

Acest lucru vine cu câteva avantaje pentru cei care trec la pandas 3.0:

  • Performanță – Operațiunile pe string-uri și manipularea datelor lipsă (NA) sunt mult mai rapide
  • Eficiența memoriei – PyArrow permite o gestionare mai bună a memoriei, reducând amprenta digitală a seturilor de date masive
  • Interoperabilitate – Facilitează schimbul de date cu alte instrumente (precum Apache Spark sau Ray) fără conversii costisitoare

Copy-on-Write (CoW) devine standard

Cine a lucrat până acum în pandas s-a lovit de SettingWithCopyWarning. Aceasta pare o eroare, dar în realitate este un avertisment pe care Python îl transmite pentru a indica faptul că datele e posibil să nu se fi modifica așa cum se aștepta utilizatorul.

În general, în pandas putem vedea datele originale (View) sau datele copiate (Copy). Când facem anumite schimbări, e posibil ca acestea să fie înregistrate doar în copie și să se piardă atunci când închidem sesiunea.

Cu pandas 3.0, originalul rămâne intact până în momentul în care i se cere implicit o modificare a acestuia!

Suport pentru rezoluții multiple de date și ore

Până acum, pandas era „prizonierul” nanosecundelor. Orice dată calendaristică trebuia stocată la nivel de nanosecundă, ceea ce limita intervalul de timp pe care îl puteai reprezenta (aproximativ între anii 1677 și 2262).

Din 3.0, putem folosi rezoluții de datetime în secunde (s), milisecunde (ms) sau chiar microsecunde (us).

Sintaxă nouă pentru pd.col()

Până acum, pentru a face operațiuni în lanț (method chaining), unde aveai nevoie să te referi la o coloană creată chiar în acel lanț, erai obligat să folosești funcții lambda.

pd.col(nume_coloana) creează un obiect „întârziat” (deferred object). Acesta nu conține datele propriu-zise în momentul scrierii, ci este o instrucțiune care îi spune lui pandas ca atunci când va executa respectivul cod, să caute coloana cu numele respectiv în DataFrame-ul curent.

Astfel, nu mai avem nevoie să folosim funcțiile de tip lambda, iar filtrarea va fi mai elegantă.

Noua sintaxă este ideal de folosit în cazul Method Chaining, adică atunci când legi mai multe operațiuni cu punct, de exemplu .assign().groupby().filter(). Variabilele intermediare nu vor mai fi salvate, având direct rezultatul final.

Consistență în gestionarea valorilor nule

Istoric, pandas avea o problemă dacă apărea o singură valoare lipsă într-o coloană de numere întregi (int) și transforma toată coloana în numere cu virgulă (float), pentru a putea folosi NaN
(Not a Number).

Prin integrarea mai profundă a tipurilor care acceptă valori nule (nullable) în pandas 3.0 (cum este Int64 cu „I” mare sau noile tipuri Arrow), o coloană de întregi rămâne de tip întreg chiar dacă are valori lipsă.

Interoperabilitate

Pandas 3.0 aderă mult mai strict la standardele comunității Python Data API, prin Dataframe Interchange Protocol. Acum se pot converti obiecte între pandas, Polars, cuDF (GPU) sau PyTorch mult mai ușor și, de cele mai multe ori, fără a copia datele în memorie (zero-copy).

Astfel, dacă există o parte din workflow în pandas, datele pot fi trecute cu ușurință către un model de Machine Learning în biblioteca PyTorch.

Optimizări masive la agregarea datelor

Datorită noului backend, operațiunile de agregare (groupby) și combinare (merge/join) au fost rescrise parțial.

Algoritmii de tip „hash join” sunt acum optimizați pentru structura Arrow, lucru care va duce la o reducere a timpului de execuție în special când se fac join-uri între tabele mari pe coloane de tip text sau categorice.

În final, versiunea 3.0 a eliminat foarte multe funcții și argumente care erau marcate ca „deprecated” de ani de zile, de exemplu metoda .append(), care a fost înlocuită de pd.concat().

Actualizarea la pandas 3.0

Luna aceasta este programat să apară pandas 3.0.1, care va corecta lucrurile care nu funcționează cum trebuie în pandas 3.0.0.

Pentru a instala ultima versiune din pandas 3.0 din PyPI, este suficientă o singură linie de cod:
python -m pip install --upgrade pandas==3.0.*

Așa cum am văzut mai sus, avem mai multe beneficii să facem actualizarea la pachetul pandas 3.0, acesta reprezentând un salt major în ecosistemul de analiză a datelor din Python, punând un accent major pe performanță și pe modernizarea structurilor interne.

Etichete: ,