Polars - مكتبة DataFrame سريعة (Cheatsheet)
Polars هي مكتبة DataFrame عالية الأداء مكتوبة بـ Rust مع ربط Python و R و Node. إنها متعددة الخيوط بشكل افتراضي، مبنية على ذاكرة Apache Arrow العمودية، وتوفر API بطيء مع محسِّن استعلام يعيد ترتيب وتقليص العمل قبل التنفيذ. في مجموعات البيانات الكبيرة فإنها عادة ما تكون أسرع بكثير من pandas وتستخدم ذاكرة أقل، بينما تؤلف API التعبير الخاص بها بشكل أنظف. أصبحت التوصية الافتراضية لعمل البيانات الجديد في 2026.
التثبيت
| الطريقة | الأمر |
|---|
| pip | pip install polars |
| uv | uv add polars |
| مع extras | pip install "polars[all]" (excel، database، plotting) |
| التحقق | python -c "import polars as pl; print(pl.__version__)" |
القراءة والكتابة
| العملية | الكود |
|---|
| CSV | pl.read_csv("data.csv") |
| Parquet | pl.read_parquet("data.parquet") |
| JSON | pl.read_json("data.json") |
| قاعدة بيانات | pl.read_database(query, connection) |
| CSV البطيء | pl.scan_csv("data.csv") (مؤجل) |
| Parquet البطيء | pl.scan_parquet("*.parquet") |
| الكتابة | df.write_parquet("out.parquet") |
Eager مقابل Lazy (الفكرة الأساسية)
import polars as pl
# Eager: ينفذ فوراً
df = pl.read_csv("sales.csv")
result = df.filter(pl.col("amount") > 100).group_by("region").agg(pl.col("amount").sum())
# Lazy: يبني خطة، يحسّن، ثم يشغل على .collect()
result = (
pl.scan_csv("sales.csv")
.filter(pl.col("amount") > 100)
.group_by("region")
.agg(pl.col("amount").sum())
.collect()
)
يسمح وضع Lazy للمحسِّن بدفع المرشحات إلى المسح وقراءة الأعمدة المطلوبة فقط — غالباً تسريع كبير في الملفات الكبيرة. فضّل scan_* + .collect() لأعمال حقيقية.
التعبيرات (API الأساسي)
| التعبير | يفعل |
|---|
pl.col("x") | الإشارة إلى عمود |
pl.col("x").sum() | التجميع |
pl.col("x").alias("y") | إعادة تسمية المخرجات |
pl.col("*") | جميع الأعمدة |
pl.lit(5) | قيمة حرفية |
pl.when(cond).then(a).otherwise(b) | شرطي |
الاختيار والتصفية
| المهمة | الكود |
|---|
| اختيار الأعمدة | df.select("a", "b") |
| عمود محسوب | df.with_columns((pl.col("a") * 2).alias("a2")) |
| تصفية الصفوف | df.filter(pl.col("a") > 10) |
| شروط متعددة | df.filter((pl.col("a") > 10) & (pl.col("b") == "x")) |
| Head/tail | df.head(10), df.tail(10) |
| الترتيب | df.sort("a", descending=True) |
| الفريد | df.unique(subset=["a"]) |
التجميع والتجميع
(df.group_by("region")
.agg(
pl.col("amount").sum().alias("total"),
pl.col("amount").mean().alias("avg"),
pl.col("order_id").n_unique().alias("orders"),
))
| التجميع | التعبير |
|---|
| Sum/mean/min/max | .sum(), .mean(), .min(), .max() |
| العد | .count(), .n_unique() |
| الأول/الأخير | .first(), .last() |
| Quantile | .quantile(0.95) |
| جمع القوائم | .implode() |
الجداول الموحدة
| النوع | الكود |
|---|
| Inner | a.join(b, on="id") |
| Left | a.join(b, on="id", how="left") |
| Outer | a.join(b, on="id", how="full") |
| Anti | a.join(b, on="id", how="anti") |
| Semi | a.join(b, on="id", how="semi") |
| As-of (time) | a.join_asof(b, on="ts") |
النصوص والتواريخ والقوائم
| مساحة الاسم | مثال |
|---|
.str | pl.col("s").str.to_uppercase(), .str.contains("x") |
.dt | pl.col("t").dt.year(), .dt.truncate("1h") |
.list | pl.col("l").list.len(), .list.first() |
.cast | pl.col("a").cast(pl.Int64) |
التوافقية
| الهدف | الكود |
|---|
| pandas | df.to_pandas() / pl.from_pandas(pdf) |
| Arrow | df.to_arrow() |
| NumPy | df.to_numpy() |
| DuckDB | الاستعلام عن إطارات Polars مباشرة من DuckDB |
Polars مقابل pandas
| الجانب | Polars | pandas |
|---|
| المحرك | Rust، متعدد الخيوط | Python/C، في الغالب أحادي الخيط |
| الذاكرة | Arrow عمودي | NumPy-backed |
| محسِّن Lazy | نعم | لا |
| API | قائم على التعبير، قابل للتكوين | Index-centric |
| النظام البيئي | ينمو بسرعة | واسع، ناضج |
لـ SQL-first analytics على الملفات، اقترن مع DuckDB؛ pandas يبقى مهماً لاتساع نظام بيئي.
الموارد