تخطَّ إلى المحتوى

Polars - مكتبة DataFrame سريعة (Cheatsheet)

Polars - مكتبة DataFrame سريعة (Cheatsheet)

Polars هي مكتبة DataFrame عالية الأداء مكتوبة بـ Rust مع ربط Python و R و Node. إنها متعددة الخيوط بشكل افتراضي، مبنية على ذاكرة Apache Arrow العمودية، وتوفر API بطيء مع محسِّن استعلام يعيد ترتيب وتقليص العمل قبل التنفيذ. في مجموعات البيانات الكبيرة فإنها عادة ما تكون أسرع بكثير من pandas وتستخدم ذاكرة أقل، بينما تؤلف API التعبير الخاص بها بشكل أنظف. أصبحت التوصية الافتراضية لعمل البيانات الجديد في 2026.

التثبيت

الطريقةالأمر
pippip install polars
uvuv add polars
مع extraspip install "polars[all]" (excel، database، plotting)
التحققpython -c "import polars as pl; print(pl.__version__)"

القراءة والكتابة

العمليةالكود
CSVpl.read_csv("data.csv")
Parquetpl.read_parquet("data.parquet")
JSONpl.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/taildf.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()

الجداول الموحدة

النوعالكود
Innera.join(b, on="id")
Lefta.join(b, on="id", how="left")
Outera.join(b, on="id", how="full")
Antia.join(b, on="id", how="anti")
Semia.join(b, on="id", how="semi")
As-of (time)a.join_asof(b, on="ts")

النصوص والتواريخ والقوائم

مساحة الاسممثال
.strpl.col("s").str.to_uppercase(), .str.contains("x")
.dtpl.col("t").dt.year(), .dt.truncate("1h")
.listpl.col("l").list.len(), .list.first()
.castpl.col("a").cast(pl.Int64)

التوافقية

الهدفالكود
pandasdf.to_pandas() / pl.from_pandas(pdf)
Arrowdf.to_arrow()
NumPydf.to_numpy()
DuckDBالاستعلام عن إطارات Polars مباشرة من DuckDB

Polars مقابل pandas

الجانبPolarspandas
المحركRust، متعدد الخيوطPython/C، في الغالب أحادي الخيط
الذاكرةArrow عموديNumPy-backed
محسِّن Lazyنعملا
APIقائم على التعبير، قابل للتكوينIndex-centric
النظام البيئيينمو بسرعةواسع، ناضج

لـ SQL-first analytics على الملفات، اقترن مع DuckDB؛ pandas يبقى مهماً لاتساع نظام بيئي.

الموارد