تسريع معالجة بيانات الباندا باستخدام مودين: دليل شامل
في هذا الدليل الشامل، سنستكشف إمكانيات مكتبة Modin، وهي بديل قوي لمكتبة Pandas التقليدية، تعتمد على الحوسبة المتوازية لتحقيق سرعة فائقة في معالجة البيانات. باستخدام الأمر import modin.pandas as pd، سنحول أكواد Pandas الخاصة بنا إلى محرك قوي للحوسبة الموزعة. هدفنا هنا هو فهم أداء Modin في عمليات معالجة البيانات الواقعية، مثل عمليات groupby، والانضمام (joins)، وتنظيف البيانات، وتحليل سلاسل الزمن، وكل ذلك على منصة Google Colab. سنقوم بقياس أداء كل مهمة مقابل مكتبة Pandas القياسية لمعرفة مدى سرعة وكفاءة Modin من حيث استهلاك الذاكرة.
إعداد بيئة العمل وتثبيت Modin
نبدأ بتثبيت Modin مع واجهة Ray الخلفية، والتي تُمكّن عمليات Pandas المتوازية بسلاسة في Google Colab. نقوم بإلغاء تنبيه التحذيرات غير الضرورية للحفاظ على وضوح المخرجات. ثم نقوم باستيراد جميع المكتبات اللازمة وتشغيل Ray مع 2 وحدة معالجة مركزية (CPU)، لإعداد بيئتنا لمعالجة DataFrames الموزعة.
pip install "modin[ray]" -q
import warnings
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
import time
import os
from typing import Dict, Any
import modin.pandas as mpd
import ray
ray.init(ignore_reinit_error=True, num_cpus=2)
print(f"Ray initialized with {ray.cluster_resources()}")
قياس أداء العمليات باستخدام دالة benchmark_operation
نعرف دالة benchmark_operation لمقارنة وقت تنفيذ مهمة محددة باستخدام كل من Pandas و Modin. من خلال تشغيل كل عملية وتسجيل مدتها، نحسب سرعة Modin. هذا يوفر لنا طريقة واضحة وقابلة للقياس لتقييم مكاسب الأداء لكل عملية نختبرها.
def benchmark_operation(pandas_func, modin_func, data, operation_name: str) -> Dict[str, Any]:
"""Compare pandas vs modin performance"""
start_time = time.time()
pandas_result = pandas_func(data['pandas'])
pandas_time = time.time() - start_time
start_time = time.time()
modin_result = modin_func(data['modin'])
modin_time = time.time() - start_time
speedup = pandas_time / modin_time if modin_time > 0 else float('inf')
print(f"n{operation_name}:")
print(f" Pandas: {pandas_time:.3f}s")
print(f" Modin: {modin_time:.3f}s")
print(f" Speedup: {speedup:.2f}x")
return {
'operation': operation_name,
'pandas_time': pandas_time,
'modin_time': modin_time,
'speedup': speedup
}
إنشاء مجموعة بيانات كبيرة لاختبار الأداء
نعرف دالة create_large_dataset لإنشاء مجموعة بيانات اصطناعية غنية تضم 500,000 صفًا تحاكي بيانات المعاملات الواقعية، بما في ذلك معلومات العملاء وأنماط الشراء والتواريخ والوقت. نقوم بإنشاء إصدارات Pandas و Modin لهذه المجموعة من البيانات حتى نتمكن من قياس أدائها جنبًا إلى جنب. بعد إنشاء البيانات، نعرض أبعادها وحجمها في الذاكرة، مما يمهد الطريق لعمليات Modin المتقدمة.
def create_large_dataset(rows: int = 1_000_000):
"""Generate synthetic dataset for testing"""
np.random.seed(42)
data = {
'customer_id': np.random.randint(1, 50000, rows),
'transaction_amount': np.random.exponential(50, rows),
# ... (rest of the data generation code)
}
pandas_df = pd.DataFrame(data)
modin_df = mpd.DataFrame(data)
print(f"Dataset created: {rows:,} rows × {len(data)} columns")
print(f"Memory usage: {pandas_df.memory_usage(deep=True).sum() / 1024**2:.1f} MB")
return {'pandas': pandas_df, 'modin': modin_df}
dataset = create_large_dataset(500_000)
اختبارات الأداء:
## عملية groupby المعقدة
نقوم بتعريف دالة complex_groupby لإجراء عمليات groupby متعددة المستويات على مجموعة البيانات عن طريق تجميعها حسب الفئة والمنطقة. ثم نقوم بتجميع أعمدة متعددة باستخدام دوال مثل sum, mean, std, و count. أخيرًا، نقوم بقياس أداء هذه العملية على كل من Pandas و Modin لقياس مدى سرعة تنفيذ Modin لمثل هذه التجميعات المعقدة.
def complex_groupby(df):
return df.groupby(['category', 'region']).agg({
'transaction_amount': ['sum', 'mean', 'std', 'count'],
'rating': ['mean', 'min', 'max'],
'quantity': 'sum'
}).round(2)
groupby_results = benchmark_operation(complex_groupby, complex_groupby, dataset, "Complex GroupBy Aggregation")
## عملية تنظيف البيانات المتقدمة
نعرف دالة advanced_cleaning لمحاكاة خط أنابيب معالجة البيانات الواقعية. أولاً، نقوم بإزالة القيم المتطرفة باستخدام طريقة IQR لضمان رؤى أنظف. ثم نقوم بإنشاء ميزات جديدة من خلال إنشاء مقياس جديد يسمى transaction_score ووضع علامات على المعاملات عالية القيمة. أخيرًا، نقوم بقياس أداء منطق التنظيف هذا باستخدام كل من Pandas و Modin لمعرفة كيف يتعاملون مع التحويلات المعقدة على مجموعات البيانات الكبيرة.
def advanced_cleaning(df):
# ... (data cleaning code)
cleaning_results = benchmark_operation(advanced_cleaning, advanced_cleaning, dataset, "Advanced Data Cleaning")
## تحليل سلاسل الزمن
نعرف دالة time_series_analysis لاستكشاف الاتجاهات اليومية من خلال إعادة أخذ عينات من بيانات المعاملات بمرور الوقت. نضع عمود التاريخ كفهرس، ونحسب التجميعات اليومية مثل المجموع والمتوسط والعدد، ومتوسط التصنيف، ونقوم بتجميعها في DataFrame جديد. لالتقاط الأنماط طويلة الأجل، نضيف أيضًا متوسطًا متحركًا لمدة 7 أيام. أخيرًا، نقوم بقياس أداء خط أنابيب سلسلة الزمن هذا باستخدام كل من Pandas و Modin لمقارنة كفاءتهما في البيانات الزمنية.
def time_series_analysis(df):
# ... (time series analysis code)
ts_results = benchmark_operation(time_series_analysis, time_series_analysis, dataset, "Time Series Analysis")
## عمليات الانضمام والحسابات المتقدمة
نعرف دالة advanced_joins لإثراء مجموعة البيانات الرئيسية من خلال دمجها مع جداول البحث عن الفئات والمناطق. بعد إجراء عمليات الانضمام، نقوم بحساب حقول إضافية، مثل commission_amount, tax_amount, و total_cost, لمحاكاة الحسابات المالية الواقعية. أخيرًا، نقوم بقياس أداء خط أنابيب الانضمام والحساب بأكمله باستخدام كل من Pandas و Modin لتقييم مدى جودة تعامل Modin مع العمليات المتعددة الخطوات المعقدة.
def advanced_joins(df, lookup):
# ... (join and calculation code)
join_results = benchmark_operation(lambda df: advanced_joins(df, lookup_data['pandas']), lambda df: advanced_joins(df, lookup_data['modin']), dataset, "Advanced Joins & Calculations")
مقارنة كفاءة استخدام الذاكرة
ننتقل الآن إلى التركيز على استخدام الذاكرة ونطبع عنوانًا فرعيًا لتسليط الضوء على هذه المقارنة. في دالة get_memory_usage، نحسب مساحة الذاكرة التي تشغلها كل من DataFrames الخاصة بـ Pandas و Modin باستخدام طرق memory_usage الداخلية الخاصة بها. نضمن التوافق مع Modin من خلال التحقق من السمة _to_pandas. يساعدنا هذا في تقييم مدى كفاءة Modin في التعامل مع الذاكرة مقارنةً بـ pandas، خاصةً مع مجموعات البيانات الكبيرة.
def get_memory_usage(df, name):
# ... (memory usage calculation code)
pandas_memory = get_memory_usage(dataset['pandas'], "Pandas")
modin_memory = get_memory_usage(dataset['modin'], "Modin")
ملخص الأداء وأفضل الممارسات
نختتم هذا الدليل من خلال تلخيص مقاييس الأداء عبر جميع العمليات التي تم اختبارها، وحساب متوسط سرعة Modin مقارنةً بـ Pandas. نسلط الضوء أيضًا على العملية التي حققت أفضل أداء، مما يوفر رؤية واضحة لمجالات تفوق Modin. ثم نشارك مجموعة من أفضل الممارسات لاستخدام Modin بكفاءة، بما في ذلك نصائح حول التوافق، وتحديد ملفات الأداء، والتحويل بين Pandas و Modin. أخيرًا، نقوم بإيقاف تشغيل Ray.
الخاتمة
لقد رأينا مباشرة كيف يمكن لـ Modin تعزيز سير عمل Pandas لدينا مع إجراء تغييرات طفيفة على أكوادنا. سواء كانت تجميعات معقدة أو تحليل لسلاسل زمنية أو عمليات انضمام كثيفة الاستخدام للذاكرة، فإن Modin يوفر أداءً قابلاً للتطوير للمهام اليومية، خاصةً على منصات مثل Google Colab. بفضل قوة Ray و التوافق الكامل تقريبًا مع واجهة برمجة تطبيقات Pandas، يجعل Modin من السهل العمل مع مجموعات بيانات أكبر.






اترك تعليقاً