course
Dacă folosești des Python pentru analiză de date, la fel ca mine, observi repede că citirea fișierelor CSV este una dintre cele mai comune sarcini. Totuși, pe măsură ce seturile de date cresc, această metodă poate deveni lentă sau consumatoare de memorie.
Polars este o bibliotecă DataFrame rapidă și modernă pentru Python, concepută ca alternativă de înaltă performanță la Pandas. Poate gestiona seturi mari de date mult mai fluid decât instrumentele tradiționale, deoarece este construită cu accent pe viteză și consum redus de memorie.
Funcția centrală Polars pl.read_csv() oferă o soluție simplă pentru a încărca fișiere CSV într-un DataFrame, cu opțiuni integrate pentru a controla parsarea, tipurile de date și utilizarea memoriei.
În acest ghid, îți voi arăta cum să citești fișiere CSV, să controlezi parsarea și să gestionezi seturi mari de date folosind funcția Polars pl.read_csv(). Dacă abia începi, aruncă o privire la cursul nostru Introducere în Polars ca să înveți cum să manipulezi date și să extragi insight-uri cu Polars.
Utilizare de bază a pl.read_csv()
Înainte să mergem mai departe, vezi tutorialul nostru Python Polars ca să-ți configurezi mediul.
Acum, să vedem cum funcționează pl.read_csv():
# import the module
import polars as pl
# Load CSV into a Polars DataFrame
fuel_data = pl.read_csv("Fuel_Consumption_2000-2022.csv")
# Preview first few rows
print(fuel_data.head())
În exemplul de mai sus, Polars citește fișierul și îl încarcă într-un DataFrame. Funcția returnează un DataFrame Polars, o structură tabelară de date, similară cu ceea ce ai obține în pandas.
Implicit, pl.read_csv():
-
Presupune că primul rând conține numele coloanelor (
has_header=True) -
Deduce automat tipurile de date ale coloanelor
-
Folosește virgula (
,) ca delimitator -
Citește întregul fișier în memorie
Parametri comuni în pl.read_csv()
Acum că ai învățat cum încarcă pl.read_csv() datele, să vedem cum poți folosi următorii parametri pentru a adapta modul în care Polars îți parsează datele.
Calea fișierului și sursa
Polars îți permite să încarci date din surse diferite. Poți trece o cale locală ca șir, un obiect Pathlib sau chiar un URL. De exemplu, codul următor citește un fișier csv mare de pe web care conține PIB-ul diferitelor țări în diverși ani.
# Reading from a URL
url = "https://raw.githubusercontent.com/datasets/gdp/master/data/gdp.csv"
gdp_data = pl.read_csv(url)
Delimitatori și separatori
Nu toate fișierele CSV folosesc virgule. Poți folosi argumentul separator pentru a gestiona taburi, punct și virgulă, bare verticale sau alte caractere. Exemplul de mai jos arată cum să specifici separatorii la citirea fișierelor
# Reading a Semicolon-separated file
sales_data = pl.read_csv("2024_sales.csv", separator=";")
# Reading a Tab-separated file (TSV)
orders_data = pl.read_csv("all_orders.tsv", separator="\t")
Gestionarea header-ului
După cum am văzut, Polars presupune că primul rând din date conține numele coloanelor. Dacă fișierul tău nu are un rând de header, folosește parametrul has_header=False, ca mai jos. Polars va atribui automat nume de coloane precum column_1, column_2, column_3 și așa mai departe.
# Load file without a header
orders_data = pl.read_csv("all_orders.csv", has_header=False)
Poți și să redenumești coloanele oferind numele specifice. De exemplu:
# Providing specific column names
sales_data = pl.read_csv("sales_April.csv", new_columns=[
"OrderDate", "OrderNumber", "ProductKey", "SalespersonKey", "Salesperson"])
Encodare
Fișierele CSV pot folosi encodări de text diferite. Dacă întâmpini caractere ciudate sau erori, specifică encodarea:
# Load CSV into a Polars DataFrame
fuel_data = pl.read_csv("Fuel_Consumption_2000-2022.csv", encoding="utf8")
Alte opțiuni comune de encodare includ ”latin1” și ”utf8-lossy”, care gestionează corect caracterele invalide.
Cum să selectezi coloane când citești CSV în Polars
Când lucrezi cu fișiere CSV mari, adesea nu ai nevoie de fiecare coloană. Polars îți permite să încarci doar coloanele de care ai nevoie, folosind parametrul columns.
# Load only specific columns
fuel_data = pl.read_csv("Fuel_Consumption_2000-2022.csv",
columns=["YEAR", "MAKE", "MODEL"]
)
Dacă selectezi coloanele necesare încă de la încărcarea fișierului, reduci utilizarea memoriei prin evitarea datelor inutile. Această metodă accelerează citirea fișierelor și îmbunătățește performanța întregului flux.
Cum să gestionezi tipurile de date (schema) în CSV-urile Polars
Polars este o bibliotecă cu tipare stricte, ceea ce înseamnă că fiecare coloană trebuie să aibă un tip de date consecvent, cum ar fi toate întregi sau toate șiruri.
Deducere automată a tipurilor
Implicit, Polars îți inspectează datele și determină automat tipurile coloanelor. Metoda implicită funcționează bine în majoritatea cazurilor, dar uneori poate interpreta greșit coloanele, de exemplu tratând ID-urile ca întregi în loc de șiruri.
Specificarea manuală a schemei
Când vrei consistență în DataFrame-ul tău, ar trebui să specifici manual schema datelor. Asta asigură consistență între mai multe fișiere și te ajută să eviți erorile legate de tipuri în etapele ulterioare de procesare.
În majoritatea cazurilor, folosește schema_overrides pentru a specifica tipul de date al unor coloane anume, permițând Polars să deducă restul coloanelor
import polars as pl
# Manually overriding specific data types
empl_data = pl.read_csv(
"all_employees.csv",
schema_overrides={
"id": pl.Int64,
"name": pl.String,
"age": pl.Int64,
"salary": pl.Float64
}
)
Sau folosește schema pentru a defini întreaga structură a DataFrame-ului.
# Manually define the full schema
empl_data = pl.read_csv(
"all_employees.csv",
schema={
"id": pl.Int64,
"name": pl.String,
"age": pl.Int64,
"salary": pl.Float64
}
)
Cum să gestionezi valorile lipsă în CSV-urile Polars
Implicit, Polars detectează automat aceste valori lipsă și le reprezintă ca null. Uneori aceste valori lipsă sunt reprezentate prin șiruri specifice, precum ”NA”, ”N/A” sau ”missing”. Le poți defini folosind null_values pentru a le trata ca null.
# Treating "N/A" and "EMPTY" as nulls
survey_data = pl.read_csv(
"survey_results.csv",
null_values=["N/A", "EMPTY", "null"]
)
Gestionând corect valorile lipsă, asiguri tipuri de date consecvente și previi calcule incorecte, reducând erorile în timpul analizei și modelării.
Citirea fișierelor CSV mari în Polars
Când lucrezi cu seturi mari de date care depășesc memoria RAM disponibilă, Polars chiar strălucește, procesând datele fără a încărca întregul fișier dintr-odată.
Încărcare leneșă cu scan_csv()
În loc să încarce imediat datele în memorie ca read_csv(), Polars oferă alternativa leneșă, scan_csv(), care construiește un plan de interogare optimizat și execută doar operațiile necesare.
În exemplul de mai jos, pl.scan_csv scanează fișierul CSV fără a-l încărca, construiește o interogare pentru a prelua doar coloanele „YEAR”, „MAKE” și „MODEL” unde marca mașinii este „ACURA”, apoi execută acea interogare. Această acțiune va încărca în memorie doar porțiunea filtrată de date, nu întregul fișier.
# Lazily reference the file (no data loaded yet)
fuel_consumption = pl.scan_csv("Fuel_Consumption_2000-2022.csv")
fuel_consumption_filtered = fuel_consumption.select(
["YEAR", "MAKE", "MODEL"]).filter(pl.col("MAKE") == "ACURA")
# Execute the query and load only the required data
fuel_consumption_acura = fuel_consumption_filtered.collect()
Îți recomand să folosești scan_csv() când:
- Lucrezi cu fișiere mari care nu încap confortabil în memorie
- Aplici mai multe transformări, precum filtrare, selectare și agregare de date
- Vrei optimizarea interogării înainte de execuție
Streaming și eficiență a memoriei
Polars permite, de asemenea, procesarea în flux a datelor în bucăți, menținând memoria de vârf constantă indiferent de dimensiunea fișierului.
Pentru fișiere CSV mari, pornește cu scan_csv() pentru a crea o interogare leneșă. Fișierul nu este încărcat complet când se apelează scan_csv().
# Read data in chunks
fuel_consumption = pl.scan_csv("Fuel_Consumption_2000-2022.csv",
low_memory=True)
Deoarece metoda de mai sus încă folosește read_csv, cea mai bună abordare este să combini execuția leneșă cu streaming.
În exemplul de mai jos, Polars procesează fișierul într-o pipelină, rând cu rând în loturi, păstrând în memorie doar rândurile filtrate (unde “CYLINDERS” > 3) la un moment dat.
# Lazily reference the file (no data loaded yet)
fuel_consumption = pl.scan_csv("Fuel_Consumption_2000-2022.csv")
result = fuel_consumption.filter(pl.col("CYLINDERS") > 3)
# Stream execution instead of loading everything at once
fuel_consumption_high = result.collect(engine="streaming")
Avantaj de performanță vs. Pandas
Comparativ cu pandas, Polars oferă adesea performanțe mai bune pentru citirea și procesarea CSV-urilor, după cum vom vedea în secțiunea următoare.
Polars read_csv vs Pandas read_csv
Tabelul de mai jos rezumă diferența dintre Polars și Pandas la citirea CSV-urilor în Python.
|
Aspect |
Polars |
Pandas |
|
Viteză |
Mai rapid datorită multi-threading-ului și parsării optimizate |
Mai lent pe fișiere mari (în mare parte single-threaded) |
|
Utilizarea memoriei |
Amprentă mai mică; suportă lazy + streaming |
Încarcă întregul set de date în memorie în mod eager |
|
Sintaxă |
|
|
|
Model de execuție |
Suportă execuție leneșă ( |
Execuție eager (imediată) doar |
|
Optimizare |
Optimizare de interogări integrată (proiecție, filtrare) |
Optimizare automată limitată |
|
Caz de utilizare ideal |
Seturi de date mari, fluxuri critice de performanță |
Seturi de date mici, analiză rapidă |
Îți recomand să citești articolul nostru despre diferențele dintre Pandas vs. Polars ca să determini care instrument se potrivește cel mai bine nevoilor tale analitice.
Citirea CSV-urilor din surse diferite
După cum am văzut, poți folosi Polars pentru a citi fișiere csv din surse diferite. Din exemplele de mai sus, ți-am arătat cum să citești csv din fișiere locale și URL-uri.
În plus, Polars poate gestiona automat fișiere CSV comprimate. De exemplu, codul următor citește date dintr-un fișier .gzip.
# Read gzip-compressed CSV
census_data = pl.read_csv("2018_census.csv.gz")
Erori comune și depanare
Chiar și cu un engine de înaltă performanță ca Polars, poți întâmpina în continuare unele probleme, mai ales la citirea unui fișier csv. Mai jos sunt câteva dintre problemele comune pe care le-am întâlnit și cum le poți rezolva.
-
Erori de encodare: Poți vedea o eroare precum
UnicodeDecodeError, ceea ce înseamnă că fișierul nu folosește encodare UTF-8, o problemă des întâlnită la fișiere mai vechi sau CSV-uri exportate din anumite versiuni de Excel. Pentru a rezolva, setează encodarea potrivită sau folosește“utf8-lossy”dacă fișierul are caractere inconsistente sau defecte. -
Probleme cu delimitatorii: Dacă DataFrame-ul se încarcă dar toate datele sunt înghesuite într-o singură coloană, Polars nu a recunoscut separatorul. Ca să rezolvi, setează explicit delimitatorul corect folosind argumentul
separator, cum ar fi punct și virgulă (;), tab (\t) sau bară verticală (|). -
Tipuri de date incorecte: Uneori, Polars poate deduce greșit tipurile de coloane, de exemplu citind ID-uri numerice ca șiruri sau întâmpinând erori de parsare. Când se întâmplă asta, poți folosi
schema_overridespentru a specifica tipul de date pentru anumite coloane. Dacă vrei să definești tipurile pentru fiecare coloană, foloseșteschema. Poți, de asemenea, creșteinfer_schema_length, astfel încât Polars să examineze mai multe rânduri înainte de a deduce schema. -
Probleme de memorie cu fișiere mari: Dacă procesul tău Python se blochează la încărcarea unui fișier mare, înseamnă că ai epuizat RAM-ul. Ca să rezolvi, treci de la
read_csv()lascan_csv()pentru încărcare leneșă, ca să reduci utilizarea memoriei și să îmbunătățești performanța. Poți, de asemenea, să încarci mai puține coloane din setul de date sau să folosești execuția în flux pentru a încărca datele în bucăți.
Concluzie
Funcția read_csv() din Polars este simplu de folosit, dar suficient de puternică pentru sarcini din lumea reală. Din punctul meu de vedere, Polars are un avantaj clar când lucrezi cu seturi de date în creștere.
Ca pas următor, consultă blogul nostru despre engine-ul GPU Polars pentru a afla mai multe despre diversele sale aplicații. Dacă ești gata să pui mâna pe tastatură, urmărește codul nostru Super Bowl Analytics with Polars ca să rezolvi întrebări analitice reale, să aplici calcule și să aplici tehnici ML de bază pentru probleme de analytics în sport.
Întrebări frecvente
Care este diferența dintre read_csv() și scan_csv() în Polars?
read_csv() încarcă datele eager în memorie, în timp ce scan_csv() folosește execuție leneșă și procesează datele doar când apelezi .collect().
Când ar trebui să folosesc scan_csv() în loc de read_csv()?
Folosește scan_csv() pentru seturi mari de date sau când legi mai multe transformări, deoarece optimizează execuția și reduce utilizarea memoriei.
Poate Polars să citească doar anumite coloane dintr-un fișier CSV?
Da, folosește parametrul columns=[...] în read_csv() sau selectează coloane într-o interogare leneșă cu scan_csv().
Cum gestionez valorile lipsă în fișierele CSV Polars?
Polars tratează valorile goale ca null implicit, iar tu poți defini marcatori personalizați pentru null folosind null_values=.
Suportă Polars fișiere CSV comprimate?
Da, poate citi formate comprimate precum .gz și .zip fără extragere manuală.