Salta ai contenuti

Polars - Foglio di aiuto della libreria Fast DataFrame

Polars - Foglio di aiuto della libreria Fast DataFrame

Polars è una libreria DataFrame ad alte prestazioni scritta in Rust con binding per Python, R e Node. È multi-thread per impostazione predefinita, costruito sulla memoria colonnare Apache Arrow e offre un”API lazy con un ottimizzatore di query che riordina e elimina il lavoro prima dell”esecuzione. Su set di dati grandi è tipicamente molte volte più veloce di pandas e utilizza meno memoria, mentre la sua API di espressione si compone più chiaramente. È diventata la raccomandazione predefinita per il nuovo lavoro di dati nel 2026.

Installazione

MetodoComando
pippip install polars
uvuv add polars
Con extrapip install "polars[all]" (excel, database, plotting)
Verificapython -c "import polars as pl; print(pl.__version__)"

Lettura e scrittura

OperazioneCodice
CSVpl.read_csv("data.csv")
Parquetpl.read_parquet("data.parquet")
JSONpl.read_json("data.json")
Databasepl.read_database(query, connection)
Lazy CSVpl.scan_csv("data.csv") (rinviato)
Lazy Parquetpl.scan_parquet("*.parquet")
Writedf.write_parquet("out.parquet")

Eager vs Lazy (l’idea chiave)

import polars as pl

# Eager: esegue immediatamente
df = pl.read_csv("sales.csv")
result = df.filter(pl.col("amount") > 100).group_by("region").agg(pl.col("amount").sum())

# Lazy: costruisce un piano, ottimizza, quindi esegui su .collect()
result = (
    pl.scan_csv("sales.csv")
      .filter(pl.col("amount") > 100)
      .group_by("region")
      .agg(pl.col("amount").sum())
      .collect()
)

La modalità lazy consente all”ottimizzatore di spingere i filtri verso il basso fino alla scansione e leggere solo le colonne necessarie — spesso un grande speedup su file grandi. Preferisci scan_* + .collect() per i carichi di lavoro reali.

Espressioni (l’API principale)

EspressioneFa
pl.col("x")Riferimento a una colonna
pl.col("x").sum()Aggrega
pl.col("x").alias("y")Rinomina output
pl.col("*")Tutte le colonne
pl.lit(5)Valore letterale
pl.when(cond).then(a).otherwise(b)Condizionale

Selezione e filtro

CompitoCodice
Seleziona colonnedf.select("a", "b")
Colonna calcolatadf.with_columns((pl.col("a") * 2).alias("a2"))
Filtra righedf.filter(pl.col("a") > 10)
Condizioni multipledf.filter((pl.col("a") > 10) & (pl.col("b") == "x"))
Head/taildf.head(10), df.tail(10)
Ordinadf.sort("a", descending=True)
Unicodf.unique(subset=["a"])

Aggregazione e raggruppamento

(df.group_by("region")
   .agg(
       pl.col("amount").sum().alias("total"),
       pl.col("amount").mean().alias("avg"),
       pl.col("order_id").n_unique().alias("orders"),
   ))
AggregazioneEspressione
Sum/mean/min/max.sum(), .mean(), .min(), .max()
Count.count(), .n_unique()
First/last.first(), .last()
Quantile.quantile(0.95)
List collect.implode()

Join

TipoCodice
Innera.join(b, on="id")
Lefta.join(b, on="id", how="left")
Outera.join(b, on="id", how="full")
Antia.join(b, on="id", how="anti")
Semia.join(b, on="id", how="semi")
As-of (time)a.join_asof(b, on="ts")

Stringhe, date, elenchi

NamespaceEsempio
.strpl.col("s").str.to_uppercase(), .str.contains("x")
.dtpl.col("t").dt.year(), .dt.truncate("1h")
.listpl.col("l").list.len(), .list.first()
.castpl.col("a").cast(pl.Int64)

Interop

ObiettivoCodice
pandasdf.to_pandas() / pl.from_pandas(pdf)
Arrowdf.to_arrow()
NumPydf.to_numpy()
DuckDBInterroga direttamente frame Polars da DuckDB

Polars vs pandas

AspettoPolarspandas
EngineRust, multi-threadPython/C, principalmente single-thread
MemoryArrow colonnareSupportato da NumPy
Lazy optimizerNo
APIExpression-based, componibileIndex-centrica
EcosystemCrescita rapidaVasto, maturo

Per l”analisi SQL-first su file, abbinato con DuckDB; pandas rimane prezioso per la vastità dell”ecosistema.

Risorse