Pandas: مشروع التحليل الشامل

آخر تحديث: 2026-08-26

المشاريع الحقيقية لا تنطوي أبداً على جدول واحد فقط -- تخيل 5 ملفات CSV + ملف Excel واحد + استعلام من قاعدة بيانات، يتم دمجها 4 مرات، وتجميعها عبر 3 أبعاد، وتدويرها إلى 2 جداول تقاطع، وتنسيقها في تقرير واحد مصقول. هذا الدرس هو الختام الأعظم للدورة بأكملها، حيث يجمع كل مهارة من الدروس الـ 24 السابقة في مشروع واحد: تكامل متعدد المصادر -> مراجعة الجودة -> عمليات انضمام معقدة -> تحليل متعدد الأبعاد -> إعداد التقارير الآلي.

تحذير: يجب تشغيل الكود أدناه في بيئة Python محلية.

1. What You Will Learn


2. خلفية المشروع: تحليل التجارة الإلكترونية عبر الحدود

(1) المهمة

يحتاج بوب إلى تحليل بيانات الربع الأول حتى الثالث لعمل تجارة إلكترونية عابرة للحدود: 4 ملفات CSV (الطلبات/المنتجات/العملاء/المناطق) + 1 قاعدة بيانات SQLite (المخزون) -> الدمج -> التحليل -> التقرير.

(2) سير العمل الكامل

100%
graph TB
    A["تحميل 5 مصادر بيانات"] --> B["تدقيق جودة البيانات"]
    B --> C["دمج 4 جداول"]
    C --> D["خط أنظف التنظيف"]
    D --> E["تجميع متعدد الأبعاد"]
    E --> F["تحليل متقاطع محوري"]
    F --> G["تقرير المنسق"]
    G --> H["تصدير متعدد الأوراق"]
TEXT 📖 للعرض فقط
> **المخرج:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محليًا (`pip install pandas`) واتباع التعليمات. قد تختلف القيم الفعليّة قليلاً حسب إصدار pandas الخاص بك.

3. تحميل البيانات من مصادر متعددة

▶ مثال

TEXT 📖 للعرض فقط
> **الإخراج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً. يرجى تثبيته محلياً (`pip install pandas`) والمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas الخاص بك.

: تحميل 5 مصادر بيانات (الصعوبة: 3/5 نجوم)

PYTHON
import pandas as pd
import numpy as np
import sqlite3
from io import StringIO, BytesIO

# ============================================
# الخطوة 1: تحميل البيانات من مصادر متعددة
# ============================================

np.random.seed(42)

# المصدر 1: العملاء (CSV)
customers = pd.DataFrame({
    'customer_id': range(1, 501),
    'name': [f'Customer_{i:04d}' for i in range(1, 501)],
    'segment': np.random.choice(['Consumer', 'Corporate', 'Home Office'], 500),
    'city': np.random.choice(['New York', 'Los Angeles', 'Chicago', 'Houston', 'London', 'Tokyo'], 500),
    'country': np.random.choice(['US', 'US', 'US', 'US', 'UK', 'JP'], 500)
})

# المصدر 2: المنتجات (CSV)
products = pd.DataFrame({
    'product_id': range(1, 51),
    'product_name': [f'Product_{i:02d}' for i in range(1, 51)],
    'category': np.random.choice(['Electronics', 'Clothing', 'Home', 'Sports', 'Books'], 50),
    'unit_price': np.round(np.random.uniform(10, 500, 50), 2)
})

# المصدر 3: الطلبات (CSV)
orders = pd.DataFrame({
    'order_id': [f'ORD-{i:05d}' for i in range(1, 2001)],
    'customer_id': np.random.randint(1, 501, 2000),
    'product_id': np.random.randint(1, 51, 2000),
    'order_date': pd.to_datetime(np.random.choice(
        pd.date_range('2024-01-01', '2024-09-30'), 2000)),
    'quantity': np.random.randint(1, 10, 2000),
    'discount': np.random.choice([0, 0.05, 0.1, 0.2, 0.3], 2000)
})

# المصدر 4: المناطق (Excel)
regions = pd.DataFrame({
    'country': ['US', 'UK', 'JP', 'DE', 'FR'],
    'region': ['North America', 'Europe', 'Asia Pacific', 'Europe', 'Europe'],
    'currency': ['USD', 'GBP', 'JPY', 'EUR', 'EUR']
})

# المصدر 5: المخزون (SQLite)
conn = sqlite3.connect(':memory:')
inventory = pd.DataFrame({
    'product_id': range(1, 51),
    'stock': np.random.randint(0, 500, 50),
    'reorder_level': np.random.randint(20, 100, 50)
})
inventory.to_sql('inventory', conn, index=False, if_exists='replace')

# التحميل من قاعدة البيانات
inv_df = pd.read_sql('SELECT * FROM inventory', conn)
conn.close()

print(f"✅ تم التحميل: customers({len(customers)}), products({len(products)}), "
      f"orders({len(orders)}), regions({len(regions)}), inventory({len(inv_df)})")
TEXT 📖 للعرض فقط
> **الإخراج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً. يرجى تثبيته محلياً (`pip install pandas`) والمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas الخاص بك.

4. جودة البيانات ومراجعتها

▶ مثال

TEXT 📖 للعرض فقط
> **المخرجات:** قم بالتشغيل في بيئة بايثون محلية (إصدار pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا. يرجى تثبيتها محليًا (`pip install pandas`) والمتابعة. قد تتغير القيم الفعلية قليلاً حسب إصدار pandas لديك.

: مراجعة جودة البيانات (الصعوبة: 2/5 نجوم)

PYTHON
# ============================================
# الخطوة 2: مراجعة جودة البيانات
# ============================================

def audit_quality(df, name):
    """تشغيل مراجعة جودة البيانات على إطار بيانات"""
    issues = []
    # القيم المفقودة
    missing = df.isnull().sum()
    if missing.sum() > 0:
        issues.append(f"مفقود: {dict(missing[missing > 0])}")
    # التكرارات
    dups = df.duplicated().sum()
    if dups > 0:
        issues.append(f"مكرر: {dups}")
    # الأنواع
    object_cols = df.select_dtypes(include='object').columns.tolist()
    if object_cols:
        issues.append(f"أعمدة الكائنات: {object_cols}")
    status = "⚠️ مشاكل" if issues else "✅ نظيف"
    print(f"{name}: {status}")
    for issue in issues:
        print(f"  - {issue}")
    return issues

audit_quality(customers, 'العملاء')
audit_quality(products, 'المنتجات')
audit_quality(orders, 'الطلبات')
audit_quality(regions, 'المناطق')
audit_quality(inv_df, 'المخزون')

# إدخال مشاكل للعرض التوضيحي
orders.loc[np.random.choice(2000, 100, replace=False), 'discount'] = np.nan
dups = orders.sample(30)
orders = pd.concat([orders, dups], ignore_index=True)
print(f"\nبعد إدخال المشاكل: شكل الطلبات = {orders.shape}")
TEXT 📖 للعرض فقط
> **المخرجات:** قم بالتشغيل في بيئة بايثون محلية (إصدار pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا. يرجى تثبيتها محليًا (`pip install pandas`) والمتابعة. قد تتغير القيم الفعلية قليلاً حسب إصدار pandas لديك.

5. دمج 4 جداول + التنظيف

▶ مثال

TEXT 📖 للعرض فقط
> **الإخراج:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا. يرجى تثبيتها محليًا (`pip install pandas`) والمتابعة. قد تختلف القيم الفعليّة قليلاً حسب إصدار pandas لديك.

: دمج معقد + تنظيف عبر المُعالجات (الصعوبة: 3/5 نجوم)

PYTHON
# ============================================
# الخطوة 3-4: دمج 4 جداول + التنظيف
# ============================================

def clean_orders(df):
    df = df.drop_duplicates(subset='order_id', keep='last')
    df['discount'] = df['discount'].fillna(0)
    return df

# الخطوة 1: تنظيف الطلبات
clean_orders_df = orders.pipe(clean_orders)

# الخطوة 2: دمج الطلبات + المنتجات
op = pd.merge(clean_orders_df, products, on='product_id', how='left')

# الخطوة 3: دمج + العملاء
opc = pd.merge(op, customers, on='customer_id', how='left')

# الخطوة 4: دمج + المناطق
full = pd.merge(opc, regions, on='country', how='left')

# الخطوة 5: دمج + المخزون
full = pd.merge(full, inv_df, on='product_id', how='left')

# أعمدة مشتقة
full['revenue'] = full['unit_price'] * full['quantity'] * (1 - full['discount'])
full['cost_estimate'] = full['unit_price'] * full['quantity'] * 0.6
full['profit'] = full['revenue'] - full['cost_estimate']
full['month'] = full['order_date'].dt.to_period('M')
full['is_low_stock'] = full['stock'] < full['reorder_level']

print(f"✅ مجموعة البيانات الكاملة: {full.shape}")
print(f"الأعمدة: {full.columns.tolist()}")
print(f"القيم المفقودة: {full.isnull().sum().sum()}")
TEXT 📖 للعرض فقط
> **الإخراج:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا. يرجى تثبيتها محليًا (`pip install pandas`) والمتابعة. قد تختلف القيم الفعليّة قليلاً حسب إصدار pandas لديك.

6. تحليل التجميع والإزاحة متعدد الأبعاد

▶ مثال

TEXT 📖 للعرض فقط
> **الخرج:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والعمل عليها. قد تختلف القيم الفعليية قليلاً حسب إصدار pandas لديك.

: تجميع وتحليل متقاطع متعدد الأبعاد (الصعوبة: 3/5 نجوم)

PYTHON
# ============================================
# Step 5-6: Multi-dim Analysis
# ============================================

# 1. Revenue by region × category
region_cat = full.groupby(['region', 'category']).agg(
    revenue=('revenue', 'sum'),
    orders=('order_id', 'count'),
    avg_order_value=('revenue', 'mean'),
    profit_margin=('profit', lambda x: x.sum() / full.loc[x.index, 'revenue'].sum())
).round(2)
print("=== Revenue by Region × Category ===")
print(region_cat.head(8))

# 2. Monthly trend by region
monthly_region = full.groupby(['month', 'region'])['revenue'].sum().unstack()
print(f"\n=== Monthly by Region ===\n{monthly_region.tail(3)}")

# 3. Pivot table: segment × category
seg_cat = pd.pivot_table(
    full, values='revenue', index='segment', columns='category',
    aggfunc='sum', margins=True, margins_name='Total'
).round(0)
print(f"\n=== Segment × Category Pivot ===\n{seg_cat}")

# 4. Top products
top_products = full.groupby('product_name').agg(
    revenue=('revenue', 'sum'),
    quantity=('quantity', 'sum'),
    avg_discount=('discount', 'mean')
).nlargest(5, 'revenue')
print(f"\n=== Top 5 Products ===\n{top_products}")

# 5. Low stock alert
low_stock = full[full['is_low_stock']].groupby('product_name').agg(
    stock=('stock', 'first'),
    reorder_level=('reorder_level', 'first'),
    total_orders=('order_id', 'count')
).sort_values('total_orders', ascending=False)
print(f"\n=== Low Stock Alert ===\n{low_stock.head(5)}")
TEXT 📖 للعرض فقط
> **الخرج:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والعمل عليها. قد تختلف القيم الفعليية قليلاً حسب إصدار pandas لديك.

7. تقرير التنسيق والتصدير إلى أوراق متعددة

▶ مثال

TEXT 📖 للعرض فقط
> **المخرجات:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والمتابعة. قد تتغير القيم الفعلي قليلاً حسب إصدار pandas لديك.

: تقرير التنسيق + التصدير إلى Excel (الصعوبة: 3/5 نجوم)

PYTHON
# ============================================
# Step 7: Styled Report + Export
# ============================================

# Style the segment × category pivot
styled_pivot = (seg_cat.style
    .format('${:,.0f}')
    .background_gradient(cmap='RdYlGn', axis=None)
    .set_caption('Revenue by Segment × Category')
)

# Style top products
styled_products = (top_products.style
    .format({'revenue': '${:,.0f}', 'quantity': '{:,}', 'avg_discount': '{:.1%}'})
    .bar(subset=['revenue'], color='lightblue')
    .highlight_max(subset=['revenue'], color='lightgreen')
)

# Style low stock alert
styled_stock = (low_stock.head(10).style
    .format({'stock': '{:.0f}', 'reorder_level': '{:.0f}', 'total_orders': '{:,}'})
    .background_gradient(subset=['total_orders'], cmap='YlOrRd')
    .set_caption('Low Stock Alert — High Demand Products')
)

# Export to Excel with multiple sheets
output_path = 'ecommerce_report.xlsx'
with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
    # Summary sheet
    summary = pd.DataFrame({
        'Metric': ['Total Revenue', 'Total Profit', 'Total Orders',
                    'Unique Customers', 'Unique Products', 'Avg Order Value',
                    'Profit Margin'],
        'Value': [full['revenue'].sum(), full['profit'].sum(), len(full),
                  full['customer_id'].nunique(), full['product_id'].nunique(),
                  full['revenue'].mean(), full['profit'].sum() / full['revenue'].sum()]
    })
    summary.to_excel(writer, sheet_name='Summary', index=False)

    # Region × Category
    region_cat.to_excel(writer, sheet_name='Region-Category')

    # Monthly trend
    monthly_region.to_excel(writer, sheet_name='Monthly-Trend')

    # Segment × Category (styled)
    styled_pivot.to_excel(writer, sheet_name='Segment-Category')

    # Top Products
    top_products.to_excel(writer, sheet_name='Top-Products')

print(f"✅ Report exported: {output_path}")

# Final summary
print("\n" + "=" * 50)
print("  E-COMMERCE COMPREHENSIVE ANALYSIS COMPLETE")
print("=" * 50)
print(f"  Revenue: ${full['revenue'].sum():,.0f}")
print(f"  Profit: ${full['profit'].sum():,.0f}")
print(f"  Margin: {full['profit'].sum() / full['revenue'].sum():.1%}")
print(f"  Top Region: {full.groupby('region')['revenue'].sum().idxmax()}")
print(f"  Top Category: {full.groupby('category')['revenue'].sum().idxmax()}")
print(f"  Low Stock Items: {len(low_stock)}")
TEXT 📖 للعرض فقط
> **المخرجات:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والمتابعة. قد تتغير القيم الفعلي قليلاً حسب إصدار pandas لديك.

❓ أسئلة شائعة

س كيف توحد التنسيقات عبر مصادر بيانات متعددة؟
ج قم بالتوحيد في ثلاث خطوات: (1) تطبيع أسماء الأعمدة -- استخدم نفس الاسم للمفتاح نفسه (مثلاً customer_id في كل مكان)؛ (2) توحيد الأنواع -- حوّل جميع أعمدة التاريخ باستخدام to_datetime وجميع أعمدة المعرّفات إلى int؛ (3) توحيد الترميز -- يُفضّل UTF-8، وحوّل GBK إلى UTF-8. قبل الدمج، تحقق من dtype والقيم الفريدة لأعمدة المفاتيح للتأكيد من إمكانية المطابقة.
س كيف تقيس جودة البيانات؟
ج قيّم أربعة أبعاد: (1) الاكتمال (معدل القيم المفقودة = عدد القيم المفقودة / العدد الإجمالي، الهدف < 5%)؛ (2) الاتساق (هل توجد مطابقات للأعمدة الأساسية في الجداول ذات الصلة؟)؛ (3) الدقة (نسبة القيم الشاذة، مثل مبالغ سالبة أو قيم متطرفة)؛ (4) الاستمرارية الزمنية (متى تم تحديث البيانات آخر مرة؟ -- هل هي قديمة؟). قيّم كل بُعد من 1 إلى 5 للحصول على تقييم شامل.
س ماذا لو أصبحت سلسلة الدمج طويلة جداً؟
ج أدمج خطوة بخطوة وقم بالتحقق بعد كل عملية join -- تحقق من عدد الصفوف والقيم المفقودة في كل مرة. بالنسبة لدمج 5 جداول، لا تكتب الكل دفعة واحدة. قسّمها إلى 4 خطوات: orders+products -> +customers -> +regions -> +inventory. بعد كل خطوة، اطبع (shape، missing) للتأكد من الصحة قبل المتابعة.
س كيف تؤتمت التقارير؟
ج استخدم ExcelWriter لإنشاء أوراق متعددة (ملخص + تحليل لكل بُعد + جداول محورية بتنسيق)، أو استخدم Styler.to_html() لإخراج تقرير مبني على الويب. أكثر تقدماً: استخدم Jupyter Notebook + nbconvert لإنشاء ملفات PDF تلقائياً. النهائية: قم بمعادلة الملاحظات الدفترية باستخدام papermill وشغّلها بجدول لانتاج التقارير تلقائياً.
س كيف يقارن هذا مع أدوات BI؟
ج تتفوق Pandas في التحليل المرن والمخصص -- فهي غير محدودة بميزات أداة BI المدمجة، ويمكنك تنفيذ منطق معقد بشكل تعسفي. أدوات BI (Tableau/Power BI) أكثر ملاءمة للوحات القياسية الموحدة والاستكشاف التفاعلي -- إنشاء المخططات بالسحب والإفلات سريع، لكن الحسابات المعقدة تكون مقيدة. الاستراتيجية: استخدم Pandas للتحليل العميق وإعداد البيانات، ثم استخدم أدوات BI للعرض المرئي.
س كيف تبني جداول محورية متعددة الأبعاد؟
ج مرر أعمدة متعددة إلى index: pd.pivot_table(df, index=['region','segment'], columns='category')، مما ينتج أعمدة MultiIndex. قم بتعيين margins=True لإضافة المجاميع للصفوف والأعمدة. التحليل المتبادل يعني بُعداً واحداً كصفوف، وآخر كأعمدة، وثالث كقيم -- هذه هي الطريقة الأكثر حدسية لعرض البيانات ثلاثية الأبعاد.
س كيف تنفذ تنبيهات انخفاض المخزون؟
ج قارن المخزون مع reorder_level -- df[df['stock'] < df['reorder_level']]. للتسلسل الهرمي، قم بالفرز حسب حجم الطلبات: مخزون منخفض + حجم طلبات مرتفع = الأكثر إلحاحاً. استخدم Styler's background_gradient لتحديد مستوى الإلحاح، حيث يعني اللون الأحمر "إعادة تخزين فوري".

📖 ملخص


📝 تمارين

  1. أساسي (الصعوبة: 1/5 نجوم): قم بإنشاء إطاري بيانات (بيانات العملاء + الطلبات)، قم بدمجهما، احسب إجمالي المبيعات حسب المنطقة، واستخدم معامل مؤشر التغطية للتحقق من تطابق البيانات.
  2. متوسط (الصعوبة: 2/5 نجوم): قم بمحاكاة 3 مصادر بيانات (العملاء/المنتجات/الطلبات)، قم بتنفيذ 3 عمليات دمج -> تنظيف -> تجميع متعدد الأبعاد -> جدول محوري جدول التقاطع -> تنسيق Styler.
  3. تحدي (الصعوبة: 3/5 نجوم): أكمل المشروع الكامل من هذا الدرس: تحميل 5 مصادر -> مراجعة الجودة -> دمج 4 جداول -> تنظيف عبر pipe -> تجميع متعدد الأبعاد + جدول محوري -> تقرير Styler -> تصدير متعدد الأوراق باستخدام ExcelWriter.

<- Previous Lesson: Project - Time Series | Course Complete ->

Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%