| name | polars-2-lazy-evaluation-and-query-optimization |
| description | Sub-skill of polars: 2. Lazy Evaluation and Query Optimization. |
| version | 1.0.0 |
| category | data-analysis |
| type | reference |
| scripts_exempt | true |
2. Lazy Evaluation and Query Optimization
2. Lazy Evaluation and Query Optimization
LazyFrame Basics:
import polars as pl
lf = pl.scan_csv("large_data.csv")
df = pl.DataFrame({"x": [1, 2, 3]})
lf = df.lazy()
result_lf = (
lf
.filter(pl.col("date") >= "2025-01-01")
.with_columns([
(pl.col("revenue") - pl.col("cost")).alias("profit"),
pl.col("category").cast(pl.Categorical)
])
.group_by("category")
.agg([
pl.col("profit").sum().alias("total_profit"),
pl.col("profit").mean().alias("avg_profit"),
pl.count().alias("count")
])
.sort("total_profit", descending=True)
)
print(result_lf.explain())
result_df = result_lf.collect()
result_df = result_lf.collect(streaming=True)
sample = result_lf.fetch(1000)
Query Optimization Benefits:
lf = (
pl.scan_parquet("data/*.parquet")
.filter(pl.col("country") == "USA")
.select(["id", "name", "revenue"])
.filter(pl.col("revenue") > 1000)
)
print("Naive plan:")
print(lf.explain(optimized=False))
print("\nOptimized plan:")
print(lf.explain(optimized=True))
Streaming Large Files:
def process_large_file(input_path: str, output_path: str):
"""Process file that doesn't fit in memory."""
result = (
pl.scan_csv(input_path)
.filter(pl.col("status") == "active")
.group_by("region")
.agg([
pl.col("sales").sum(),
pl.col("customers").n_unique()
])
.collect(streaming=True)
)
result.write_parquet(output_path)
return result
(
pl.scan_csv("huge_file.csv")
.filter(pl.col("value") > 0)
.sink_parquet("filtered_output.parquet")
)