Pandas: الخرج المنسّق

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

الخطوة الأخيرة في تحليل البيانات هي العرض — ترك الأرقام تتحدث عن نفسها. يقوم Pandas Styler بتحويل DataFrame إلى تقرير ملون: المبيعات العالية باللون الأخضر، المنخفضة باللون الأحمر، أشرطة التقدم مدمجة في السياق، والقيم القصوى مميزة. لا حاجة لاختيار الألوان يدويًا في Excel — يمكن لـ Pandas القيام بكل ذلك تلقائيًا.

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

1. What You Will Learn


2. تحسين تقرير مبيعات كارول

(1) نقطة الضعف: تقرير رقمي بسيط غير واضح بما يكفي

تقرير مبيعات كارول الشهري لا يتكون سوى من أرقام، ومديره لا يستطيع تمييز ما هو مرتفع وما هو منخفض:

PYTHON
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'region': ['North', 'South', 'East', 'West'],
    'sales': [5200, 3100, 4800, 2900],
    'profit': [1560, 620, 1440, 435],
    'margin': [0.30, 0.20, 0.30, 0.15]
})
TEXT 📖 للعرض فقط
> **الخرج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتة مسبقًا، لذا يرجى تثبيتها على جهازك (`pip install pandas`) والتطبيق العملي. قد تختلف القيم الفعلية قليلاً حسب إصدار pandas.

(2) الحل: تحسين بسطر واحد باستخدام Styler

▶ مثال

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

: أساسيات Styler (الصعوبة ⭐)

PYTHON
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'region': ['North', 'South', 'East', 'West'],
    'sales': [5200, 3100, 4800, 2900],
    'profit': [1560, 620, 1440, 435],
    'margin': [0.30, 0.20, 0.30, 0.15]
})

# Chain styling methods
styled = (df.style
    .format({'sales': '${:,.0f}', 'profit': '${:,.0f}', 'margin': '{:.1%}'})
    .background_gradient(subset=['sales'], cmap='RdYlGn')
    .highlight_max(subset=['profit'], color='lightgreen')
)
# styled in Jupyter shows the styled table
# styled.to_html('report.html') for export
print("Styled table created!")
TEXT 📖 للعرض فقط
> **الخرج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتة مسبقًا، لذا يرجى تثبيتها على جهازك (`pip install pandas`) والتطبيق العملي. قد تختلف القيم الفعلية قليلاً حسب إصدار pandas.

3. كائن Styler

(1) df.style يُعيد كائن Styler

▶ مثال

TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas preinstalled, so please install it on your machine (`pip install pandas`) and follow along hands-on. Actual values may vary slightly depending on the pandas version.

: العمليات الأساسية لـ Styler (الصعوبة ⭐)

PYTHON
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D', 'E'],
    'price': [29.99, 99.99, 149.99, 499.99, 9.99],
    'stock': [50, 120, 80, 35, 200],
    'rating': [4.5, 4.2, 3.8, 4.8, 4.0]
})

# df.style returns Styler (not DataFrame!)
styler = df.style
print(type(styler))  # pandas.io.formats.style.Styler

# Chain multiple styles
result = (df.style
    .format({'price': '${:.2f}', 'rating': '{:.1f}/5.0'})
    .set_caption('Product Catalog')
    .set_properties(**{'text-align': 'center'}, subset=['price', 'rating'])
)
# result renders in Jupyter

# Styler does NOT modify original DataFrame
print(df['price'].dtype)  # still float64, unchanged
TEXT 📖 للعرض فقط
> **Output:** Run this in a local Python environment (pandas 2.x). The Piston server does not have pandas preinstalled, so please install it on your machine (`pip install pandas`) and follow along hands-on. Actual values may vary slightly depending on the pandas version.

4. التهيئة format Formatting

▶ مثال

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

: التهيئة الرقمية format numeric formatting (الصعوبة ⭐)

PYTHON
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'salary': [75000.50, 92000.75, 68000.25],
    'bonus': [0.15, 0.20, 0.10],
    'performance': [4.567, 3.891, 4.123]
})

styled = df.style.format({
    'salary': '${:,.2f}',         # $75,000.50
    'bonus': '{:.0%}',             # 15%
    'performance': '{:.1f}/5.0'    # 4.6/5.0
})

# Format all numeric columns
styled2 = df.style.format(precision=2)  # 2 decimal places for all

# Thousands separator
styled3 = df.style.format({'salary': '{:,.0f}'})  # 75,001

# Custom formatter function
styled4 = df.style.format({
    'salary': lambda x: f'${x:,.0f}'
})
print("Formatted tables created!")
TEXT 📖 للعرض فقط
> **الخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على مكتبة pandas مثبتة مسبقاً، لذا يرجى تثبيتها على جهازك (`pip install pandas`) واتبع الخطوات يدوياً. قد تختلف القيم الفعلي قليلاً اعتماداً على إصدار pandas.

5. تمييز خريطة الحرارة باستخدام background_gradient

▶ مثال

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

: خريطة حرارية بخلفية متدرجة (الصعوبة ⭐⭐)

PYTHON
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'region': ['North', 'South', 'East', 'West'],
    'Q1': [5200, 3100, 4800, 2900],
    'Q2': [5800, 3400, 5100, 3100],
    'Q3': [6100, 3800, 5600, 3500],
    'Q4': [6500, 4100, 5900, 3800]
}).set_index('region')

# Heatmap: RdYlGn (red-yellow-green)
styled = df.style.background_gradient(cmap='RdYlGn')

# Subset: only specific columns
styled2 = df.style.background_gradient(
    subset=['Q1', 'Q4'],
    cmap='Blues',
    vmin=2000, vmax=7000
)

# Per-column gradient (each column scaled independently)
styled3 = df.style.background_gradient(cmap='YlOrRd', axis=0)

# Per-row gradient (each row scaled independently)
styled4 = df.style.background_gradient(cmap='YlOrRd', axis=1)
print("Heatmap styles created!")
TEXT 📖 للعرض فقط
> **المخرجات:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا، لذا يرجى تثبيتها على جهازك (`pip install pandas`) واتباع الخطوات بشكل عملي. القيم الفعلية قد تختلف قليًّا حسب إصدار pandas.

(1) خرائط الألوان (cmaps) الشائعة الاستخدام

cmap التأثير حالة الاستخدام
RdYlGn أحمر → أصفر → أخضر الأعلى أفضل
RdYlBu أحمر → أصفر → أزرق تباين
Blues أزرق فاتح → غامق زيادة تسلسلية
YlOrRd أصفر → برتقالي → أحمر الأعلى أسوأ
coolwarm أزرق → أحمر انحراف

6. مخططات الأشرطة المضمنة (bar Inline Bar Charts)

▶ مثال

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

: أشرطة مضمنة (bar inline bars) (الصعوبة ⭐⭐)

PYTHON
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D', 'E'],
    'sales': [5200, 3100, 4800, 2900, 6500],
    'target': [5000, 4000, 5000, 3000, 6000]
})

# شريط داخل الخلايا (Bar inside cells)
styled = df.style.bar(
    subset=['sales'],
    color='lightblue',
    vmin=0, vmax=7000
)

# الإنجاز: الشريط يوضح نسبة التحقيق من الهدف (Achievement: bar shows % of target)
df['achievement'] = (df['sales'] / df['target'] * 100).round(1)
styled2 = df.style.bar(
    subset=['achievement'],
    color=['#ff6b6b', '#51cf66'],  # أحمر < 100%، أخضر >= 100%
    vmin=0, vmax=150
)
print("تم إنشاء أنماط المخططات العمودية!")
TEXT 📖 للعرض فقط
> **الخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على pandas مثبتًا مسبقًا، لذا يرجى تثبيته على جهازك (`pip install pandas`) واتبع التعليمات يدويًا. قد تتغير القيم الفعلية قليلاً حسب إصدار pandas.

7. التمييز الشرطي

▶ مثال

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

: highlight_max/min/فارغ (الصعوبة ⭐⭐)

PYTHON
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D', 'E'],
    'price': [29.99, 99.99, 149.99, 499.99, 9.99],
    'stock': [50, 120, 80, 35, np.nan],
    'rating': [4.5, 4.2, 3.8, 4.8, 4.0]
})

# تمييز القيمة القصوى لكل عمود
styled = df.style.highlight_max(
    subset=['price', 'stock', 'rating'],
    color='lightgreen'
)

# تمييز القيمة الدنيا
styled2 = df.style.highlight_min(
    subset=['price', 'rating'],
    color='lightcoral'
)

# تمييز قيم NaN
styled3 = df.style.highlight_null(color='yellow')

# مخصص: تمييز المخزون المنخفض (< 40)
def highlight_low_stock(val):
    color = 'red' if val < 40 else ''
    return f'background-color: {color}'

styled4 = df.style.applymap(highlight_low_stock, subset=['stock'])
# ملاحظة: تمت إعادة تسمية applymap إلى map في Pandas 2.x
# styled4 = df.style.map(highlight_low_stock, subset=['stock'])
print("Highlight styles created!")
TEXT 📖 للعرض فقط
> **الخرج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا، لذا يرجى تثبيتها على جهازك (`pip install pandas`) واتباع الخطوات بشكل عملي. قد تختلف القيم الفعلية قليلاً حسب إصدار pandas.

8. مثال شامل: تصفيف تقرير المبيعات

(5) ▶ سير عمل سلسلة التصفيف

100%
graph LR
    A[df.style] --> B[format formatting]
    B --> C[background_gradient heatmap]
    C --> D[bar inline bar chart]
    D --> E[highlight conditional marking]
    E --> F[set_caption title]
    F --> G[to_html / to_excel export]
TEXT 📖 للعرض فقط
> **الإخراج:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston ليس لديه pandas مثبّتًا مسبقًا، لذا يرجى تثبيته على جهازك (`pip install pandas`) واتبع الشرح العملي. قد تختلف القيم الفعليّة قليلاً حسب إصدار pandas.

▶ مثال

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

: تصفيف تقرير شامل (الصعوبة ⭐⭐⭐)

PYTHON
import pandas as pd
import numpy as np

# ============================================
# Comprehensive example: Sales report styling
# format → gradient → bar → highlight → export
# ============================================

np.random.seed(42)
df = pd.DataFrame({
    'region': ['North', 'South', 'East', 'West', 'Central'],
    'revenue': [520000, 310000, 480000, 290000, 410000],
    'cost': [364000, 248000, 336000, 246500, 307500],
    'profit': [156000, 62000, 144000, 43500, 102500],
    'margin': [0.30, 0.20, 0.30, 0.15, 0.25],
    'growth': [0.12, -0.05, 0.08, -0.10, 0.15],
    'customers': [1200, 850, 1100, 680, 950]
}).set_index('region')

# Multi-style chain
styled = (df.style
    .format({
        'revenue': '${:,.0f}',
        'cost': '${:,.0f}',
        'profit': '${:,.0f}',
        'margin': '{:.1%}',
        'growth': '{:+.1%}',
        'customers': '{:,}'
    })
    .background_gradient(subset=['margin'], cmap='RdYlGn', vmin=0, vmax=0.4)
    .bar(subset=['customers'], color='lightblue', vmin=0)
    .highlight_max(subset=['profit'], color='lightgreen')
    .highlight_min(subset=['profit'], color='lightcoral')
    .set_caption('2024 Regional Sales Report')
    .set_properties(**{'text-align': 'right'}, subset=['revenue', 'cost', 'profit'])
)

# Export
# styled.to_html('report.html')
# styled.to_excel('report.xlsx', engine='openpyxl')
print("Full styled report created!")
TEXT 📖 للعرض فقط
> **الإخراج:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston ليس لديه pandas مثبّتًا مسبقًا، لذا يرجى تثبيته على جهازك (`pip install pandas`) واتبع الشرح العملي. قد تختلف القيم الفعليّة قليلاً حسب إصدار pandas.

❓ أسئلة شائعة

س هل يقوم Styler بتعديل البيانات؟
ج لا — يؤثر Styler فقط على العرض؛ البيانات في DataFrame الأصلية تبقى دون تغيير. df.style هو "زخرفة طبقة العرض" التي لا تلمس أبداً "طبقة البيانات". بعد التنسيق، df['salary'] يظل من نوع float64، وليس نصاً. يمكنك بأمان إنشاء عدة Stylers بتنسيقات مختلفة من نفس DataFrame.
س كيف أختار cmap لـ background_gradient؟
ج إذا كان الأعلى أفضل، استخدم RdYlGn (أحمر → أخضر)؛ إذا كان الأعلى أسوأ، استخدم YlOrRd (أصفر → أحمر)؛ للانحراف المتباعد، استخدم coolwarm (أزرق → أحمر)؛ للزيادة التسلسلية، استخدم Blues. مبدأ اختيار cmap: يجب أن تتوافق حدس الألوان مع المعنى التجاري. جرب التأثير في Jupyter قبل اتخاذ القرار.
س كيف أحدد نطاقاً باستخدام subset؟
ج ثلاث طرق: ① قائمة بأسماء الأعمدة subset=['sales', 'profit']؛ ② شريحة subset=pd.IndexSlice[:, 'Q1':'Q4']؛ ③ فلتر شرطي subset=pd.IndexSlice[df['sales'] > 3000, :]. قائمة أسماء الأعمدة هي الأكثر شيوعاً.
س أحرف صينية مشوهة في to_html؟
ج حدد الترميز: styled.to_html(encoding='utf-8'). إذا كنت تكتب إلى ملف، استخدم with open('report.html', 'w', encoding='utf-8') as f: f.write(styled.to_html()). تأكد أن ملف HTML يعلن <meta charset="utf-8">.
س هل يمكن تصدير الأنماط إلى Excel؟
ج نعم — styled.to_excel('report.xlsx', engine='openpyxl'). يتم الحفاظ على الألوان والتنسيقات في Excel. ومع ذلك، قد لا تتطابق بعض الأنماط تماماً (على سبيل المثال، تصبح مخططات الأعمدة المضمنة تنسيقاً شرطياً في Excel). ستحتاج إلى pip install openpyxl.
س ما الفرق بين applymap و map؟
ج في Pandas 2.x، أُعيدت تسمية Styler.applymap إلى Styler.map. الوظيفة هي نفسها — تطبيق دالة نمط على كل خلية. يعمل apply حسب الصف/العمود (معامل axis)، بينما يعمل map حسب الخلية. في الإصدارات الأحدث، استخدم map فقط.
س كيف أسلسل عدة أنماط معاً؟
ج تُعيد أساليب Styler كائن Styler، لذلك يتم دعم التسلسل بشكل طبيعي: df.style.format({...}).background_gradient(...).bar(...).highlight_max(...). يتم تطبيقها من أعلى إلى أسفل، ويُلغي النمط اللاحق أي نمط سابق متضارب. الترتيب الموصى به: format → gradient → bar → highlight → set_caption.

📖 ملخص


📝 تمارين

  1. أساسي (صعوبة ⭐): إنشاء DataFrame يحتوي على أعمدة الراتب/المكافأة، واستخدام format لتنسيقها كعملة ونسبة مئوية، واستخدام highlight_max لتحديد أعلى راتب.
  2. متوسط (صعوبة ⭐⭐): إنشاء DataFrame لمبيعات ربع سنوية (صفوف = مناطق، أعمدة = Q1-Q4)، ودمج خريطة حرارية background_gradient(cmap='RdYlGn') + أشرطة مدمجة bar + تنسيق آلاف الفواصل format.
  3. تحدي (صعوبة ⭐⭐⭐): محاكاة تقرير مبيعات لـ 5 مناطق (الإيرادات/التكلفة/الربح/الهامش/النمو)، وإكمال سلسلة تنسيق من 5 خطوات: تنسيق متعدد format → تدرج(margin) → شريط(customers) → تحديد_الأقصى(profit) → تصدير to_html.

← Previous Lesson: Performance Optimization · Next Lesson: Project - Data Analysis →

Web-Tutorial.com

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

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

100%