Pandas أم SQL: اختيار الأداة المناسبة
قارن بين groupby/merge في Pandas وGROUP BY/JOIN في SQL، وحدد أي طبقة ينبغي أن تتولى كل عملية تحويل
Pandas أم SQL: اختيار الأداة المناسبة درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
أداتان بنقاط قوة متكاملة
يُعد كل من Pandas وSQL أداة لمعالجة البيانات، ويستخدمهما محللو البيانات المحترفون. وتتمثل الفكرة الأساسية في أنهما متكاملان وليسا متنافسين: يتفوق SQL في العمليات التصريحية المعتمدة على المجموعات على الجداول الكبيرة المخزنة في قواعد البيانات العلائقية، بينما يتفوق Pandas في التحويلات الإجرائية، وتحويلات الصفوف المعقدة والخوارزمية على البيانات المحمّلة مسبقًا إلى الذاكرة. تستخدم أفضل مسارات المعالجة كل أداة فيما تجيده.
نقاط قوة SQL: ما الذي ينجزه SQL بصورة أفضل
يكون SQL متفوقًا عمومًا عندما: تكون البيانات كبيرة (من غيغابايت إلى تيرابايت) ويجب تصفيتها قبل تحميلها؛ أو تشمل عمليات الربط عدة جداول كبيرة حيث توفر فهارس قاعدة البيانات تسريعًا بمرتبة عشرية؛ أو تكون عمليات التجميع بسيطة (SUM وCOUNT وGROUP BY)؛ أو تكون مجموعات النتائج صغيرة مقارنةً بالمدخلات؛ أو تكون هناك حاجة إلى قراءات وكتابات متزامنة (إذ تتولى قاعدة البيانات المعاملات وتأمين البيانات). كما تتيح الصياغة التصريحية لـ SQL لمحسّنات الاستعلام اختيار أفضل خطة فعلية تلقائيًا.
-- SQL excels at:
-- 1. Filtering billions of rows using an index
SELECT * FROM orders WHERE customer_id = 12345;
-- 2. Joining large tables efficiently
SELECT o.order_id, c.name, SUM(o.amount)
FROM orders o
JOIN customers c ON o.customer_id = c.id
GROUP BY o.order_id, c.name;
-- 3. Window functions on ordered data
SELECT order_id, amount,
SUM(amount) OVER (PARTITION BY customer_id ORDER BY order_date)
FROM orders;نقاط قوة Pandas: ما الذي ينجزه Pandas بصورة أفضل
يكون Pandas متفوقًا عمومًا عندما: تحتاج إلى منطق Python مخصص لا يستطيع SQL التعبير عنه (مثل المعالجة المسبقة للتعلم الآلي، وتحليل السلاسل النصية المخصص، والخوارزميات المعقدة)؛ أو تكون سلاسل تحويل البيانات طويلة وتتكون من خطوات عديدة؛ أو تحتاج إلى تصور البيانات مباشرة بعد التحليل؛ أو تكون البيانات موجودة أصلًا في الذاكرة وستضيف جولات الذهاب والإياب الإضافية إلى SQL زمن استجابة؛ أو تجري تحليلًا استكشافيًا تريد خلاله التكرار بصورة تفاعلية. كما يتعامل Pandas مع عمليات غير جدولية، مثل حساب المصفوفات وتنعيم السلاسل الزمنية.
import pandas as pd
# Pandas excels at:
# 1. Custom Python logic that SQL cannot express
df['clean_name'] = df['name'].str.strip().str.title().str.replace(r'[^a-zA-Z ]', '', regex=True)
# 2. Vectorised string parsing
df[['first', 'last']] = df['full_name'].str.split(' ', n=1, expand=True)
# 3. Rolling statistics and time series
df['7day_avg'] = df['daily_sales'].rolling(7).mean()
# 4. Direct visualisation
# df.groupby('category')['sales'].sum().plot(kind='bar')مطابقة عمليات SQL مع Pandas
لدى معظم عمليات SQL نظائر مباشرة في Pandas. إن معرفة الصياغتين تجعلك أكثر مرونة وتساعدك على الترجمة بينهما عند الانتقال بين الأداتين. تصبح WHERE فهرسة منطقية أو .query()؛ ويصبح GROUP BY + SUM هو .groupby().sum()؛ ويصبح JOIN هو pd.merge()؛ ويصبح ORDER BY هو .sort_values()؛ ويصبح DISTINCT هو .drop_duplicates(). المعنى الدلالي متطابق، والاختلاف في الصياغة فقط.
import pandas as pd
df = pd.DataFrame({'region': ['N','S','N','E'], 'amount': [100,200,150,300]})
# SQL: SELECT region, SUM(amount) FROM df WHERE amount>100 GROUP BY region ORDER BY region
# Pandas:
result = (
df[df['amount'] > 100]
.groupby('region')['amount']
.sum()
.reset_index()
.sort_values('region')
)
print(result)عندما يحدد حجم البيانات الاختيار
إطار عملي لاتخاذ القرار استنادًا إلى حجم البيانات: أقل من 100 MB — استخدم Pandas بالكامل، إذ لا تستحق تكلفة SQL ذلك؛ من 100 MB إلى 10 GB — صفِّ البيانات واجمعها في SQL، ثم حمّل DataFrame ملخصًا إلى Pandas؛ من 10 GB إلى 1 TB — استخدم SQL أو Dask للمعالجة، وPandas للملخص النهائي فقط؛ أكثر من 1 TB — استخدم SQL موزعًا (BigQuery أو Spark SQL أو Redshift). لا تحاول مطلقًا تحميل جدول حجمه 100 GB إلى Pandas على حاسوب محمول ذاكرته 16 GB — فسيتعطل البرنامج أو سيُفرط في استخدام القرص.
import pandas as pd
import sqlalchemy as sa
engine = sa.create_engine('sqlite:///large.db')
# Right approach: SQL handles the heavy lifting
summary_df = pd.read_sql_query(
'''
SELECT region, product_category,
SUM(revenue) AS total_revenue,
COUNT(DISTINCT customer_id) AS unique_customers
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY region, product_category
''',
con=engine
)
# summary_df is small — now do Pandas things on it
print(summary_df.sort_values('total_revenue', ascending=False))دوال النوافذ في SQL مقابل العمليات المتحركة في Pandas
تُعد دوال النوافذ في SQL (OVER (PARTITION BY ... ORDER BY ...)) قوية، لكنها تفرض بعض القيود؛ فهي تحسب الرتب التراكمية، والقيم السابقة/التالية، والتجميعات المتحركة البسيطة بكفاءة، إلا أن الإحصاءات المتحركة المعقدة (مثل ارتباط Pearson المتحرك) لا يمكن التعبير عنها في SQL. توفّر الدالتان rolling() وexpanding() في Pandas نطاقًا أوسع بكثير من حسابات النوافذ، بما في ذلك الدوال المخصصة باستخدام .apply(). بالنسبة إلى دوال النوافذ القياسية على البيانات الكبيرة، يُفضّل استخدام SQL؛ أما لمنطق النوافذ المعقد، فيُفضّل استخدام Pandas.
import pandas as pd
df = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=30),
'sales': [100 + i*10 + (i%7)*20 for i in range(30)]
})
# Pandas rolling — easy with arbitrary window functions
df['7d_mean'] = df['sales'].rolling(7).mean()
df['7d_std'] = df['sales'].rolling(7).std()
df['7d_corr'] = df['sales'].rolling(7).corr(df['sales'].shift(1))
print(df.tail())الربط المعقد: مرونة Pandas
تعتمد عمليات الربط في SQL على مساواة المفاتيح (مع وجود بعض الاستثناءات). تدعم pd.merge_asof() في Pandas عمليات الربط التقريبية المستندة إلى الوقت، إذ تطابق أقرب مفتاح بدلًا من اشتراط المساواة التامة، وهو أمر بالغ الأهمية لمحاذاة السلاسل الزمنية؛ مثل ربط أسعار الأسهم بأحداث التداول عند أقرب سعر سابق. تدعم Pandas أيضًا عمليات الربط الشرطية باستخدام merge متبوعًا بالتصفية، بينما يتطلب التعبير عن ذلك في SQL استعلامًا فرعيًا أو عملية ربط LATERAL. تُعد أنماط الربط المتقدمة هذه أحد المجالات التي تتفوق فيها Pandas بوضوح.
import pandas as pd
trades = pd.DataFrame({
'time': pd.to_datetime(['2024-01-01 10:00', '2024-01-01 10:05', '2024-01-01 10:12']),
'symbol': ['AAPL', 'AAPL', 'AAPL'],
'shares': [100, 200, 50]
})
prices = pd.DataFrame({
'time': pd.to_datetime(['2024-01-01 10:00', '2024-01-01 10:10']),
'price': [185.0, 186.5]
})
# Fuzzy join: match each trade to the nearest preceding price
result = pd.merge_asof(trades.sort_values('time'),
prices.sort_values('time'),
on='time', direction='backward')
print(result)استخدام Pandas لاستكشاف البيانات، وSQL للإنتاج
من أنماط سير العمل الشائعة استخدام Pandas لتحليل البيانات الاستكشافي وتوصيف البيانات على عينة ممثلة (مثل أول مليون صف)، ثم تطوير منطق التحويل بصورة تكرارية، وبعد ذلك ترجمة الخطوات الأساسية إلى SQL لتناسب نطاق الإنتاج. تتيح Pandas التكرار السريع مع ملاحظات مرئية فورية، بينما يعمل SQL باست可靠ية على نطاق واسع مع حد أدنى من البنية التحتية. احرصوا على مزامنة الاثنين: فعند إضافة ميزة جديدة في Pandas، اكتبوا الإجراء المخزن أو العرض المكافئ في SQL لاستخدامه في الإنتاج.
import pandas as pd
import sqlalchemy as sa
engine = sa.create_engine('sqlite:///data.db')
# Development: sample in Pandas for fast iteration
df_sample = pd.read_sql_query(
'SELECT * FROM orders ORDER BY RANDOM() LIMIT 10000',
con=engine
)
# Explore and prototype:
df_sample['revenue_tier'] = pd.cut(
df_sample['amount'],
bins=[0, 100, 500, float('inf')],
labels=['low', 'mid', 'high']
)
print(df_sample['revenue_tier'].value_counts())
# Production: translate cut logic to SQL CASE WHENpandasql: كتابة SQL على DataFrames
تتيح مكتبة pandasql كتابة استعلامات SQL مباشرةً على Pandas DataFrames باستخدام SQLite في الخلفية. ينفّذ sqldf('SELECT * FROM df WHERE amount > 100', locals()) الاستعلام على DataFrame المسمى df. يفيد ذلك إذا كنتم تفكرون بمنطق SQL بينما بياناتكم موجودة أصلًا في Pandas، أو عند تعليم مفاهيم SQL باستخدام بيانات موجودة في الذاكرة. لكنه أبطأ من Pandas الأصلية في معظم العمليات؛ فاستخدموه للألفة، لا لتحقيق الأداء.
# pip install pandasql
import pandas as pd
# from pandasql import sqldf
df = pd.DataFrame({
'product': ['A', 'B', 'A', 'C', 'B'],
'sales': [100, 200, 150, 80, 220]
})
# With pandasql (commented out as it requires install):
# result = sqldf('SELECT product, SUM(sales) AS total FROM df GROUP BY product', locals())
# Equivalent native Pandas:
result = df.groupby('product')['sales'].sum().reset_index()
print(result)إطار اتخاذ القرار: مرجع سريع
استخدموا دليل اتخاذ القرار التالي عند الاختيار بين SQL وPandas:
- هل البيانات موجودة في قاعدة بيانات وكبيرة الحجم؟ أجروا التصفية والتجميع في SQL أولًا.
- هل تحتاجون إلى منطق مخصص في Python؟ استخدموا Pandas بعد تطبيق تصفية مسبقة في SQL.
- هل تجرون تحليلًا استكشافيًا على عينة؟ توفّر Pandas تكرارًا أسرع.
- هل تتعاملون مع سلسلة زمنية تتضمن إحصاءات متحركة معقدة؟ استخدموا rolling/ewm في Pandas.
- هل تحتاجون إلى GROUP BY بسيط على ملايين الصفوف؟ استخدموا SQL مع الفهارس.
- هل لديكم عدة DataFrames صغيرة موجودة أصلًا في الذاكرة؟ لا بأس باستخدام pd.merge().
- هل تحتاجون إلى معاملات ACID؟ استخدموا قاعدة بيانات SQL، وليس Pandas.
دمج الأداتين: خط أنابيب هجين
النهج العملي الأفضل هو خط أنابيب هجين يستفيد من نقاط قوة كل أداة. يتولى SQL استيعاب البيانات، والتصفية الأولية، والتجميعات القياسية على الجداول الخام الكبيرة. ثم تُسلَّم النتيجة — وهي DataFrame يمكن التعامل معه — إلى Pandas لإجراء هندسة الميزات، وحساب المقاييس المخصصة، والإحصاءات المتحركة، والتصور المرئي. ويمكن اختياريًا كتابة النتائج مرة أخرى إلى قاعدة البيانات لتقديمها. يتميز خط الأنابيب هذا بسهولة القراءة وقابلية التوسع وسهولة الصيانة لأي محلل يعرف كلًا من SQL وPython.
import pandas as pd
import sqlalchemy as sa
engine = sa.create_engine('sqlite:///pipeline.db')
# Step 1: SQL coarse aggregation
df = pd.read_sql_query('''
SELECT DATE(order_date) AS date, region, SUM(amount) AS daily_revenue
FROM orders WHERE status = 'completed'
GROUP BY DATE(order_date), region
ORDER BY date
''', con=engine, parse_dates=['date'])
# Step 2: Pandas rolling and pivoting (hard in SQL)
df['7d_avg'] = df.groupby('region')['daily_revenue'].transform(
lambda x: x.rolling(7, min_periods=1).mean()
)
pivot = df.pivot(index='date', columns='region', values='7d_avg')
print(pivot.tail())تحقق سريع
اختبروا مدى فهمكم لمفاهيم تحليل البيانات الواردة في هذا الدرس.
مراجعة الدرس
تعلّمتم في هذا الدرس أن SQL يتفوق في التصفية والربط والتجميعات البسيطة على نطاق واسع للبيانات المفهرسة، وأن Pandas تتفوق في منطق Python المخصص، والإحصاءات المتحركة المعقدة، والتحليل الاستكشافي، وأن الاستراتيجية الأفضل هي خط أنابيب هجين يستخدم SQL لتقليص البيانات مبدئيًا، ثم يستخدم Pandas لإجراء التحويلات المعقدة على النتيجة القابلة للإدارة. في القسم التالي سنبدأ الإحصاء الاستدلالي باستخدام SciPy، مع اختبار التوزيع الطبيعي والإحصاءات الوصفية.
تعلم Python مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «Pandas أم SQL: اختيار الأداة المناسبة» مجاني؟
نعم — نص درس «Pandas أم SQL: اختيار الأداة المناسبة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Pandas & NumPy Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
ماذا ستتعلم في «Pandas أم SQL: اختيار الأداة المناسبة»؟
قارن بين groupby/merge في Pandas وGROUP BY/JOIN في SQL، وحدد أي طبقة ينبغي أن تتولى كل عملية تحويل تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Pandas & NumPy Academy؟
لا تُشترط خبرة سابقة. Pandas & NumPy Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «Pandas أم SQL: اختيار الأداة المناسبة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Pandas & NumPy Academy هذا؟
نعم. كل درس في Pandas & NumPy Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الاتصال بقاعدة بيانات باستخدام SQLAlchemy
- تشغيل استعلامات SQL من Pandas
- كتابة DataFrame في جداول قاعدة البيانات
- Pandas أم SQL: اختيار الأداة المناسبة