إطارات البيانات الحديثة في بايثون: برنامج تعليمي عملي مع Polars وDuckDB


إذا كنت تستخدم لغة Python للبيانات، فمن المحتمل أنك قد شعرت بالإحباط من الانتظار لدقائق حتى تنتهي عملية Pandas.

في البداية، يبدو كل شيء على ما يرام، ولكن مع نمو مجموعة البيانات الخاصة بك وزيادة تعقيد سير العمل، يبدو الكمبيوتر المحمول الخاص بك فجأة وكأنه يستعد للانطلاق.

منذ بضعة أشهر، عملت على مشروع لتحليل معاملات التجارة الإلكترونية بأكثر من 3 ملايين صف من البيانات.

لقد كانت تجربة مثيرة جدًا للاهتمام، ولكن في معظم الأوقات، شاهدت عمليات تجميع بسيطة كانت تتم عادةً في ثوانٍ وتمتد فجأة إلى دقائق.

في تلك المرحلة، أدركت أن الباندا مذهلة، لكنها ليست كافية دائمًا.

تستكشف هذه المقالة البدائل الحديثة لـ Pandas، بما في ذلك Polars وDuckDB، وتفحص كيف يمكنها تبسيط وتحسين التعامل مع مجموعات البيانات الكبيرة.

من أجل الوضوح، اسمحوا لي أن أكون صريحًا بشأن بعض الأشياء قبل أن نبدأ.

هذه المقالة ليست بحثًا عميقًا في إدارة ذاكرة Rust أو إعلانًا بأن Pandas قد عفا عليه الزمن.

وبدلاً من ذلك، فهو دليل عملي وعملي. سترى أمثلة حقيقية وتجارب شخصية ورؤى قابلة للتنفيذ حول سير العمل والتي يمكن أن توفر لك الوقت والعقل.


لماذا يمكن أن يشعر الباندا بالبطء؟

عندما كنت في مشروع التجارة الإلكترونية، أتذكر العمل مع ملفات CSV التي يزيد حجمها عن 2 غيغابايت، وغالبًا ما يستغرق كل مرشح أو تجميع في Pandas عدة دقائق حتى يكتمل.

خلال ذلك الوقت، كنت أحدق في الشاشة، متمنيًا أن أتمكن من تناول القهوة أو الاستمتاع ببعض حلقات العرض أثناء تشغيل البرنامج.

كانت نقاط الألم الرئيسية التي واجهتها هي السرعة والذاكرة وتعقيد سير العمل.

نعلم جميعًا كيف تستهلك ملفات CSV الكبيرة كميات هائلة من ذاكرة الوصول العشوائي (RAM)، وأحيانًا أكثر مما يستطيع الكمبيوتر المحمول التعامل معه بشكل مريح. علاوة على ذلك، فإن تسلسل التحويلات المتعددة أدى أيضًا إلى صعوبة صيانة التعليمات البرمجية وبطء تنفيذها.

تعالج Polars وDuckDB هذه التحديات بطرق مختلفة.

يستخدم Polars، المدمج في Rust، التنفيذ متعدد الخيوط لمعالجة مجموعات البيانات الكبيرة بكفاءة.

من ناحية أخرى، تم تصميم DuckDB للتحليلات وتنفيذ استعلامات SQL دون الحاجة إلى تحميل كل شيء في الذاكرة.

في الأساس، كل واحد منهم لديه قوة خارقة خاصة به. Polars هو الأسرع، وDuckDB يشبه إلى حد ما ساحر الذاكرة.

والجزء الأفضل؟ كلاهما يتكامل بسلاسة مع لغة Python، مما يسمح لك بتحسين سير عملك دون إعادة كتابة كاملة.

إعداد بيئتك

قبل أن نبدأ بالبرمجة، تأكد من أن بيئتك جاهزة. لتحقيق الاتساق، استخدمت Pandas 2.2.0، وPolars 0.20.0، وDuckDB 1.9.0.

يمكن أن يوفر تثبيت الإصدارات عليك الصداع عند متابعة البرامج التعليمية أو مشاركة التعليمات البرمجية.

pip install pandas==2.2.0 polars==0.20.0 duckdb==1.9.0

في بايثون، قم باستيراد المكتبات:

import pandas as pd
import polars as pl
import duckdb
import warnings
warnings.filterwarnings("ignore")

على سبيل المثال، سأستخدم مجموعة بيانات مبيعات التجارة الإلكترونية مع أعمدة مثل معرف الطلب، ومعرف المنتج، والمنطقة، والبلد، والإيرادات، والتاريخ. يمكنك تنزيل مجموعات بيانات مماثلة من Kaggle أو إنشاء بيانات تركيبية.

تحميل البيانات

يؤدي تحميل البيانات بكفاءة إلى ضبط نغمة بقية سير عملك. أتذكر مشروعًا يحتوي ملف CSV فيه على ما يقرب من 5 ملايين صف.

تعاملت Pandas مع الأمر، لكن أوقات التحميل كانت طويلة، وكانت عمليات إعادة التحميل المتكررة أثناء الاختبار مؤلمة.

لقد كانت إحدى تلك اللحظات التي تتمنى فيها أن يكون جهاز الكمبيوتر المحمول الخاص بك مزودًا بزر “التقديم السريع”.

أدى التحول إلى Polars وDuckDB إلى تحسين كل شيء تمامًا، وفجأة، تمكنت من الوصول إلى البيانات ومعالجتها على الفور تقريبًا، مما جعل عمليات الاختبار والتكرار أكثر متعة بكثير.

مع الباندا:

df_pd = pd.read_csv("sales.csv")
print(df_pd.head(3))

مع القطبية:

df_pl = pl.read_csv("sales.csv")
print(df_pl.head(3))

مع دك دي بي:

con = duckdb.connect()
df_duck = con.execute("SELECT * FROM 'sales.csv'").df()
print(df_duck.head(3))

يمكن لـ DuckDB الاستعلام عن ملفات CSV مباشرة دون تحميل مجموعات البيانات بأكملها في الذاكرة، مما يجعل العمل مع الملفات الكبيرة أسهل بكثير.

تصفية البيانات

المشكلة هنا هي أن التصفية في Pandas يمكن أن تكون بطيئة عند التعامل مع ملايين الصفوف. كنت بحاجة ذات مرة إلى تحليل المعاملات الأوروبية في مجموعة بيانات مبيعات ضخمة. استغرق الباندا دقائق، مما أبطأ تحليلي.

مع الباندا:

filtered_pd = df_pd[df_pd.region == "Europe"]

Polars أسرع ويمكنها معالجة مرشحات متعددة بكفاءة:

filtered_pl = df_pl.filter(pl.col("region") == "Europe")

يستخدم DuckDB بناء جملة SQL:

filtered_duck = con.execute("""
    SELECT *
    FROM 'sales.csv'
    WHERE region = 'Europe'
""").df()

يمكنك الآن تصفية مجموعات البيانات الكبيرة في ثوانٍ بدلاً من دقائق، مما يتيح لك المزيد من الوقت للتركيز على الرؤى المهمة حقًا.

تجميع مجموعات البيانات الكبيرة بسرعة

غالبًا ما يكون التجميع هو المكان الذي تبدأ فيه الباندا بالشعور بالبطء. تخيل حساب إجمالي الإيرادات لكل بلد لإعداد تقرير تسويقي.

في الباندا:

agg_pd = df_pd.groupby("country")["revenue"].sum().reset_index()

في القطبية:

agg_pl = df_pl.groupby("country").agg(pl.col("revenue").sum())

في دك دي بي:

agg_duck = con.execute("""
    SELECT country, SUM(revenue) AS total_revenue
    FROM 'sales.csv'
    GROUP BY country
""").df()

أتذكر تشغيل هذا التجميع على مجموعة بيانات مكونة من 10 ملايين صف. في الباندا، استغرق الأمر ما يقرب من نصف ساعة. أكمل Polars نفس العملية في أقل من دقيقة.

كان الشعور بالارتياح يشبه إنهاء سباق الماراثون وإدراك أن ساقيك ما زالتا تعملان.

الانضمام إلى مجموعات البيانات على نطاق واسع

يعد الانضمام إلى مجموعات البيانات أحد تلك الأشياء التي تبدو بسيطة حتى تكون متعمقًا في البيانات.

في المشاريع الحقيقية، عادةً ما توجد بياناتك في مصادر متعددة، لذا يتعين عليك دمجها باستخدام أعمدة مشتركة مثل معرفات العملاء.

لقد تعلمت هذا بالطريقة الصعبة أثناء العمل في مشروع يتطلب الجمع بين الملايين من طلبات العملاء مع مجموعة بيانات ديموغرافية كبيرة بنفس القدر.

كان كل ملف كبيرًا بما يكفي بمفرده، ولكن بدا دمجهما وكأنه محاولة لدمج قطعتي أحجية معًا بينما يتوسل الكمبيوتر المحمول الخاص بك للرحمة.

استغرقت الباندا وقتًا طويلاً لدرجة أنني بدأت في توقيت عمليات الانضمام بنفس الطريقة التي يحسب بها الأشخاص الوقت الذي يستغرقه الفشار في الميكروويف حتى ينتهي.

المفسد: فاز الفشار في كل مرة.

لقد أعطاني Polars وDuckDB مخرجًا.

مع الباندا:

merged_pd = df_pd.merge(pop_df_pd, on="country", how="left")

القطبية:

merged_pl = df_pl.join(pop_df_pl, on="country", how="left")

دك دي بي:

merged_duck = con.execute("""
    SELECT *
    FROM 'sales.csv' s
    LEFT JOIN 'pop.csv' p
    USING (country)
""").df()

إن عمليات الانضمام إلى مجموعات البيانات الكبيرة التي كانت تستخدم لتجميد سير العمل الخاص بك تعمل الآن بسلاسة وكفاءة.

تقييم كسول في القطبية

الشيء الوحيد الذي لم أقدره في وقت مبكر من رحلتي في علم البيانات هو مقدار الوقت الذي يتم إهداره أثناء إجراء التحويلات سطرًا تلو الآخر.

يقترب القطبيون من هذا بشكل مختلف.

يستخدم تقنية تسمى التقييم البطيء، والتي تنتظر بشكل أساسي حتى تنتهي من تحديد التحويلات قبل تنفيذ أي عمليات.

فهو يفحص خط الأنابيب بأكمله، ويحدد المسار الأكثر كفاءة، وينفذ كل شيء في وقت واحد.

يشبه الأمر أن يكون لديك صديق يستمع إلى طلبك بالكامل قبل الذهاب إلى المطبخ، بدلاً من أن يأخذ كل تعليمات على حدة ويستمر في التحرك ذهابًا وإيابًا.

تشرح مقالة TDS هذه التقييم البطيء بعمق.

إليك ما يبدو عليه التدفق:

الباندا:

df = df[df["amount"] > 100]
df = df.groupby("segment").agg({"amount": "mean"})
df = df.sort_values("amount")

وضع القطبية كسول:

import polars as pl

df_lazy = (
    pl.scan_csv("sales.csv")
      .filter(pl.col("amount") > 100)
      .groupby("segment")
      .agg(pl.col("amount").mean())
      .sort("amount")
)

result = df_lazy.collect()

في المرة الأولى التي استخدمت فيها الوضع الكسول، شعرت بالغرابة لعدم رؤية نتائج فورية. ولكن بمجرد ركضت النهائي .collect()وكان فرق السرعة واضحا.

لن يحل التقييم البطيء كل مشكلات الأداء بطريقة سحرية، ولكنه يوفر مستوى من الكفاءة لم يتم تصميم Pandas من أجله.


الاستنتاج والوجبات السريعة

لا ينبغي أن يبدو العمل مع مجموعات البيانات الكبيرة وكأنه صراع مع أدواتك.

أظهر لي استخدام Polars وDuckDB أن المشكلة لا تكمن دائمًا في البيانات. في بعض الأحيان، كانت الأداة التي كنت أستخدمها للتعامل معها.

إذا كان هناك شيء واحد يمكنك استخلاصه من هذا البرنامج التعليمي، فليكن هذا: ليس عليك التخلي عن الباندا، ولكن يمكنك الوصول إلى شيء أفضل عندما تبدأ مجموعات البيانات الخاصة بك في تجاوز حدودها.

يمنحك Polars السرعة بالإضافة إلى التنفيذ الأكثر ذكاءً، ثم يتيح لك DuckDB الاستعلام عن الملفات الضخمة كما لو كانت صغيرة. معًا، فإنهم يجعلون العمل مع البيانات الكبيرة يبدو أكثر قابلية للإدارة وأقل إرهاقًا.

إذا كنت تريد التعمق في الأفكار التي تم استكشافها في هذا البرنامج التعليمي، فإن التوثيق الرسمي لـ Polars و DuckDB يعد مكانًا جيدًا للبدء.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى