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ério | Pandas | Polars |
|---|---|---|
| Performance | Single-thread | Multi-core nativo |
| Memória | Alto consumo | Mais eficiente (Apache Arrow) |
| Avaliação | Eager (imediata) | Lazy (plano otimizado) |
| API | Madura, ampla | Moderna, mais consistente |
| Escala | Até ~1-2 GB RAM | Até 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