Pandas là công cụ kinh điển, nhưng khi file CSV lên vài GB nó bắt đầu chậm và ngốn RAM. Polars viết bằng Rust, chạy đa luồng mặc định và thường nhanh hơn nhiều lần trên cùng một máy.
Bắt đầu
pip install polars
import polars as pl
df = pl.read_csv("banhang.csv")
print(df.head())
print(df.schema) # kiểu dữ liệu từng cột
Cú pháp biểu thức
Khác biệt lớn nhất so với Pandas: Polars dùng biểu thức pl.col() thay cho chỉ mục lồng nhau.
# Pandas
# df[df["doanh_thu"] > 1000][["ngay", "doanh_thu"]]
# Polars
df.filter(pl.col("doanh_thu") > 1000).select("ngay", "doanh_thu")
# Thêm cột tính toán
df = df.with_columns(
(pl.col("so_luong") * pl.col("don_gia")).alias("thanh_tien"),
pl.col("ngay").str.to_date("%Y-%m-%d"),
)
Gom nhóm và tổng hợp
ket_qua = (
df.group_by("khu_vuc")
.agg(
pl.col("thanh_tien").sum().alias("tong"),
pl.col("thanh_tien").mean().alias("trung_binh"),
pl.len().alias("so_don"),
)
.sort("tong", descending=True)
)
print(ket_qua)
Lazy: vũ khí thật sự
ket_qua = (
pl.scan_csv("du_lieu_10gb.csv") # chưa đọc gì cả
.filter(pl.col("nam") == 2026)
.group_by("khu_vuc")
.agg(pl.col("doanh_thu").sum())
.collect() # tới đây mới thực thi
)
scan_csv tạo một kế hoạch truy vấn. Polars tối ưu kế hoạch đó — chỉ đọc những cột cần, đẩy bộ lọc xuống sát tầng đọc file — rồi mới chạy. Nhờ vậy bạn xử lý được file lớn hơn cả RAM.
Đi chung với Pandas
df_pandas = df.to_pandas() # khi cần thư viện chỉ hỗ trợ Pandas
df_polars = pl.from_pandas(df_pandas)
Có nên chuyển sang Polars?
- Nên nếu dữ liệu từ vài trăm MB trở lên, hoặc pipeline đang chạy quá chậm.
- Chưa cần nếu dữ liệu nhỏ và bạn phụ thuộc nhiều vào hệ sinh thái quanh Pandas (scikit-learn, seaborn, statsmodels).
Cách thực tế nhất: giữ Pandas cho phân tích khám phá, dùng Polars cho các bước ETL nặng. Hai thư viện chuyển đổi qua lại dễ dàng nên bạn không phải chọn một lần cho tất cả.
