Python Data Science Program
📓 Abrir notebook en GitHub

Clase 033 — Polars: DataFrames modernos

Parte: 0 — Prerrequisitos · Fuente: Polars User Guide + Vink (2020+) · ⏱️ Duración estimada: 75 min.

🎯 Objetivo

Conocer Polars — la librería de DataFrames moderna (Rust + Arrow) que está reemplazando a pandas en proyectos donde performance importa. Aprender su API (similar a pandas pero con expresiones lazy y paralelismo automático) y entender cuándo conviene Polars sobre pandas (datasets > 1 GB, pipelines con muchas transformaciones, multi-core).

📚 Resultados de aprendizaje

Al finalizar, el estudiante podrá:

🗺️ Temas

📖 Definiciones y características

📂 Dataset / recursos

🧪 Ejercicios

  1. Eager básico: df = pl.read_csv('archivo.csv'); df.head(); df.describe(). Comparar con pandas.
  2. Expresiones: df.filter(pl.col('precio') > 100).group_by('categoria').agg(pl.col('precio').mean().alias('precio_medio')).
  3. Lazy + collect: lf = pl.scan_csv('big.csv').filter(...).group_by(...).agg(...); result = lf.collect(). Comparar tiempo vs eager.
  4. Query plan: lf.explain() muestra el plan optimizado. Identificar predicate pushdown.
  5. Pandas ↔ Polars: df.to_pandas() y pl.from_pandas(pd_df). Útil para mantener compatibilidad gradual.

📝 Homework verificable

Sobre un dataset > 500 MB (NYC Taxi recomendado):

  1. Pipeline en pandas y en Polars (lazy): filtrar viajes con tip_amount > 5, agrupar por hora del día, calcular media y desviación.
  2. Medir wall time de cada uno.
  3. Reportar speedup.

Criterio de aceptación: Polars debe ser ≥ 3× más rápido que pandas; los resultados numéricos deben coincidir (±0.001).

⚠️ Errores comunes

Síntoma / mensaje Causa y cómo arreglar
Mezclar APIs (df['col'].sum() estilo pandas) Funciona pero no usa optimizaciones. Fix: df.select(pl.col('col').sum()).
LazyFrame no devuelve datos Es perezoso. Fix: .collect() al final del pipeline.
Sin streaming=True en datasets enormes OOM. Fix: lf.collect(streaming=True).
Columnas con tipos string mezclados → schema errors Polars es estricto con tipos. Fix: pl.read_csv(..., infer_schema_length=10_000) o castear explícito.
Esperar índices como en pandas Polars NO tiene índice. La columna que quieras como índice queda como columna normal.

❓ Preguntas frecuentes

❓ ¿Polars reemplaza a pandas?

Para data engineering / pipelines: cada vez más sí. Para ad-hoc analysis en Jupyter y compatibilidad con todo el ecosistema (sklearn, statsmodels, plotting): pandas sigue siendo el default. Ambos coexisten.

❓ ¿Polars o DuckDB?

Polars: API DataFrame Python-first. DuckDB: SQL embebido, mejor para joins masivos y queries SQL. Se complementan: muchos pipelines usan DuckDB para reads grandes + Polars para transformaciones.

❓ ¿pl.col vs df['col']?

pl.col es una expresión (reusable, optimizable). df['col'] materializa una Series — útil para inspección pero no para pipelines.

❓ ¿Polars en producción?

Sí. Empresas como Goldman Sachs, Citadel, Bank of America lo usan. Estable, mantenimiento activo, sponsoreado por la compañía Polars Cloud.

❓ ¿Polars soporta lazy streaming desde S3?

Sí: pl.scan_parquet('s3://bucket/*.parquet') con credentials configuradas. Lee solo lo que necesita.

🔗 Referencias

📥 Material descargable

➡️ Siguiente clase

Clase 034 — Parquet, Arrow, PyArrow, DuckDB