Pandas: الخرج المنسّق
آخر تحديث: 2026-08-26
الخطوة الأخيرة في تحليل البيانات هي العرض — ترك الأرقام تتحدث عن نفسها. يقوم Pandas Styler بتحويل DataFrame إلى تقرير ملون: المبيعات العالية باللون الأخضر، المنخفضة باللون الأحمر، أشرطة التقدم مدمجة في السياق، والقيم القصوى مميزة. لا حاجة لاختيار الألوان يدويًا في Excel — يمكن لـ Pandas القيام بكل ذلك تلقائيًا.
1. What You Will Learn
- ❶ The Styler كائن
- ❷ format formatting
- ❸ background_gradient heatmap highlighting
- ❹ bar inline bar charts
- ❺ highlight conditional marking
2. تحسين تقرير مبيعات كارول
(1) نقطة الضعف: تقرير رقمي بسيط غير واضح بما يكفي
تقرير مبيعات كارول الشهري لا يتكون سوى من أرقام، ومديره لا يستطيع تمييز ما هو مرتفع وما هو منخفض:
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]
})
> **الخرج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتة مسبقًا، لذا يرجى تثبيتها على جهازك (`pip install pandas`) والتطبيق العملي. قد تختلف القيم الفعلية قليلاً حسب إصدار pandas.
(2) الحل: تحسين بسطر واحد باستخدام Styler
▶ مثال
> **الخرج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتة مسبقًا، لذا يرجى تثبيتها على جهازك (`pip install pandas`) والتطبيق العملي. قد تختلف القيم الفعلية قليلاً حسب إصدار pandas.
: أساسيات Styler (الصعوبة ⭐)
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!")
> **الخرج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبتة مسبقًا، لذا يرجى تثبيتها على جهازك (`pip install pandas`) والتطبيق العملي. قد تختلف القيم الفعلية قليلاً حسب إصدار pandas.
3. كائن Styler
(1) df.style يُعيد كائن Styler
▶ مثال
> **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 (الصعوبة ⭐)
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
> **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
▶ مثال
> **الخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على مكتبة pandas مثبتة مسبقاً، لذا يرجى تثبيتها على جهازك (`pip install pandas`) واتبع الخطوات يدوياً. قد تختلف القيم الفعلي قليلاً اعتماداً على إصدار pandas.
: التهيئة الرقمية format numeric formatting (الصعوبة ⭐)
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!")
> **الخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على مكتبة pandas مثبتة مسبقاً، لذا يرجى تثبيتها على جهازك (`pip install pandas`) واتبع الخطوات يدوياً. قد تختلف القيم الفعلي قليلاً اعتماداً على إصدار pandas.
5. تمييز خريطة الحرارة باستخدام background_gradient
▶ مثال
> **المخرجات:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا، لذا يرجى تثبيتها على جهازك (`pip install pandas`) واتباع الخطوات بشكل عملي. القيم الفعلية قد تختلف قليًّا حسب إصدار pandas.
: خريطة حرارية بخلفية متدرجة (الصعوبة ⭐⭐)
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!")
> **المخرجات:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا، لذا يرجى تثبيتها على جهازك (`pip install pandas`) واتباع الخطوات بشكل عملي. القيم الفعلية قد تختلف قليًّا حسب إصدار pandas.
(1) خرائط الألوان (cmaps) الشائعة الاستخدام
| cmap | التأثير | حالة الاستخدام |
|---|---|---|
| RdYlGn | أحمر → أصفر → أخضر | الأعلى أفضل |
| RdYlBu | أحمر → أصفر → أزرق | تباين |
| Blues | أزرق فاتح → غامق | زيادة تسلسلية |
| YlOrRd | أصفر → برتقالي → أحمر | الأعلى أسوأ |
| coolwarm | أزرق → أحمر | انحراف |
6. مخططات الأشرطة المضمنة (bar Inline Bar Charts)
▶ مثال
> **الخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على pandas مثبتًا مسبقًا، لذا يرجى تثبيته على جهازك (`pip install pandas`) واتبع التعليمات يدويًا. قد تتغير القيم الفعلية قليلاً حسب إصدار pandas.
: أشرطة مضمنة (bar inline bars) (الصعوبة ⭐⭐)
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("تم إنشاء أنماط المخططات العمودية!")
> **الخرج:** قم بتشغيل هذا في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على pandas مثبتًا مسبقًا، لذا يرجى تثبيته على جهازك (`pip install pandas`) واتبع التعليمات يدويًا. قد تتغير القيم الفعلية قليلاً حسب إصدار pandas.
7. التمييز الشرطي
▶ مثال
> **الخرج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا، لذا يرجى تثبيتها على جهازك (`pip install pandas`) واتباع الخطوات بشكل عملي. قد تختلف القيم الفعلية قليلاً حسب إصدار pandas.
: highlight_max/min/فارغ (الصعوبة ⭐⭐)
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!")
> **الخرج:** قم بتشغيل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقًا، لذا يرجى تثبيتها على جهازك (`pip install pandas`) واتباع الخطوات بشكل عملي. قد تختلف القيم الفعلية قليلاً حسب إصدار pandas.
8. مثال شامل: تصفيف تقرير المبيعات
(5) ▶ سير عمل سلسلة التصفيف
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]
> **الإخراج:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston ليس لديه pandas مثبّتًا مسبقًا، لذا يرجى تثبيته على جهازك (`pip install pandas`) واتبع الشرح العملي. قد تختلف القيم الفعليّة قليلاً حسب إصدار pandas.
▶ مثال
> **الإخراج:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston ليس لديه pandas مثبّتًا مسبقًا، لذا يرجى تثبيته على جهازك (`pip install pandas`) واتبع الشرح العملي. قد تختلف القيم الفعليّة قليلاً حسب إصدار pandas.
: تصفيف تقرير شامل (الصعوبة ⭐⭐⭐)
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!")
> **الإخراج:** شغّل هذا في بيئة بايثون محلية (pandas 2.x). خادم Piston ليس لديه pandas مثبّتًا مسبقًا، لذا يرجى تثبيته على جهازك (`pip install pandas`) واتبع الشرح العملي. قد تختلف القيم الفعليّة قليلاً حسب إصدار pandas.
❓ أسئلة شائعة
subset=['sales', 'profit']؛ ② شريحة subset=pd.IndexSlice[:, 'Q1':'Q4']؛ ③ فلتر شرطي subset=pd.IndexSlice[df['sales'] > 3000, :]. قائمة أسماء الأعمدة هي الأكثر شيوعاً.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">.styled.to_excel('report.xlsx', engine='openpyxl'). يتم الحفاظ على الألوان والتنسيقات في Excel. ومع ذلك، قد لا تتطابق بعض الأنماط تماماً (على سبيل المثال، تصبح مخططات الأعمدة المضمنة تنسيقاً شرطياً في Excel). ستحتاج إلى pip install openpyxl.df.style.format({...}).background_gradient(...).bar(...).highlight_max(...). يتم تطبيقها من أعلى إلى أسفل، ويُلغي النمط اللاحق أي نمط سابق متضارب. الترتيب الموصى به: format → gradient → bar → highlight → set_caption.📖 ملخص
df.styleيُرجّع كائن Styler، والذي يؤثر فقط على العرض ولا يُعدّل البيانات- format يقوم بتنسيق الأرقام: عملة (
${:,.0f}) / نسبة مئوية ({:.0%}) / دقة (precision) - background_gradient إبراز خريطة حرارية: cmap يختار الألوان، subset يختار النطاق، axis يتحكم بالاتجاه
- bar رسوم شريطية مضمّنة: color هو لون واحد أو لونان، vmin/vmax يتحكمان في النطاق
- highlight_max/min/فارغ إبراز شرطي، map/apply للشروط المخصصة
- chaining (التسلسل): format → gradient → bar → highlight → caption
- to_html/to_excel تصدير التقارير مع الأنماط
📝 تمارين
- أساسي (صعوبة ⭐): إنشاء DataFrame يحتوي على أعمدة الراتب/المكافأة، واستخدام format لتنسيقها كعملة ونسبة مئوية، واستخدام highlight_max لتحديد أعلى راتب.
- متوسط (صعوبة ⭐⭐): إنشاء DataFrame لمبيعات ربع سنوية (صفوف = مناطق، أعمدة = Q1-Q4)، ودمج خريطة حرارية background_gradient(cmap='RdYlGn') + أشرطة مدمجة bar + تنسيق آلاف الفواصل format.
- تحدي (صعوبة ⭐⭐⭐): محاكاة تقرير مبيعات لـ 5 مناطق (الإيرادات/التكلفة/الربح/الهامش/النمو)، وإكمال سلسلة تنسيق من 5 خطوات: تنسيق متعدد format → تدرج(margin) → شريط(customers) → تحديد_الأقصى(profit) → تصدير to_html.
← Previous Lesson: Performance Optimization · Next Lesson: Project - Data Analysis →