Polars é uma biblioteca Python de manipulação de dados tabulares construída em Rust. É significativamente mais rápida que Pandas por usar processamento paralelo (multi-core) e avaliação lazy (executa o plano de query otimizado, não operação a operação).

Por que usar Polars no lugar de Pandas

CritérioPandasPolars
PerformanceSingle-threadMulti-core nativo
MemóriaAlto consumoMais eficiente (Apache Arrow)
AvaliaçãoEager (imediata)Lazy (plano otimizado)
APIMadura, amplaModerna, mais consistente
EscalaAté ~1-2 GB RAMAté dezenas de GB (sem distribuição)

Para volumes maiores, usar PySpark.

Eager vs. Lazy

import polars as pl
 
# Eager: executa imediatamente (como Pandas)
df = pl.read_csv("dados.csv")
resultado = df.filter(pl.col("status") == "ativo").group_by("categoria").agg(pl.sum("valor"))
 
# Lazy: constrói plano de execução, só executa no .collect()
resultado = (
    pl.scan_csv("dados.csv")                        # scan_ = lazy
    .filter(pl.col("status") == "ativo")
    .group_by("categoria")
    .agg(pl.sum("valor"))
    .collect()                                       # executa tudo de uma vez, otimizado
)

Prefira Lazy em pipelines: Polars otimiza o plano (predicate pushdown, projection pushdown) antes de executar.

Operações essenciais

# Leitura
df = pl.read_csv("dados.csv")
df = pl.read_parquet("dados.parquet")
df = pl.read_json("dados.json")
 
# Inspeção
df.shape
df.dtypes
df.describe()
 
# Seleção e filtros
df.select(["col1", "col2"])
df.filter(pl.col("valor") > 100)
df.filter((pl.col("status") == "ativo") & (pl.col("valor") > 0))
 
# Transformações
df.with_columns(
    (pl.col("preco") * 1.1).alias("preco_com_imposto"),
    pl.col("nome").str.to_uppercase().alias("nome_upper"),
)
 
df.rename({"old_name": "new_name"})
df.drop("coluna_desnecessaria")
df.drop_nulls(subset=["campo_obrigatorio"])
df.fill_null({"campo": 0})
 
# Agrupamentos
df.group_by("categoria").agg(
    pl.sum("valor").alias("total"),
    pl.count("pedido_id").alias("qtd"),
    pl.max("data").alias("ultima_compra"),
)
 
# Joins
df_left.join(df_right, on="chave", how="left")

Polars no pipeline de dados

Polars é ideal como substituto direto do Pandas em:

  • Scripts de ingestão e transformação local
  • Tasks de Airflow que processam arquivos médios/grandes
  • Preparação de dados para carga em DW (via .write_parquet() ou DuckDB)
# Padrão comum: Polars + DuckDB para análise local
import duckdb
 
df = pl.scan_parquet("s3://bucket/dados/*.parquet").collect()
duckdb.sql("SELECT categoria, SUM(valor) FROM df GROUP BY 1").pl()

Ver também: python-engenharia-dados | python-pandas | python-pyspark