العمليات المتجهة على Series
أجرِ عمليات حسابية بين سلسلتين، وتعامل تلقائيًا مع محاذاة الفهارس، واملأ القيم المفقودة بعد المحاذاة بـ NaN.
العمليات المتجهة على Series درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
لماذا نستخدم العمليات المتجهة؟
مثل NumPy، تدعم Pandas Series العمليات المتجهة التي تطبق العمليات الحسابية والمقارنات والدوال على كل عنصر دون استخدام حلقات Python. ويوفر ذلك الإيجاز والسرعة معًا. في الخلفية، تفوّض كل عملية إلى إجراءات NumPy المنفذة على مستوى C، لكن Pandas تضيف ميزة مهمة: المحاذاة التلقائية للفهرس قبل تنفيذ العملية.
import pandas as pd
revenue = pd.Series([1000, 2000, 1500], index=['Jan', 'Feb', 'Mar'])
tax_rate = 0.2
net = revenue * (1 - tax_rate) # vectorized -- no loop
print(net)العمليات الحسابية بين Series
عند جمع Series أو طرحها أو ضربها أو قسمتها، يقوم Pandas أولًا بمحاذاتها حسب تسمية الفهرس. ولا تنتج قيمة إلا للمواضع التي تحمل فيها كلتا Series التسمية نفسها؛ أما التسميات غير المتطابقة فتنتج NaN. ويمنع هذا السلوك الأخطاء الخفية الناتجة عن عدم محاذاة البيانات، مثل جمع أرقام شهر يناير من مصدرين للبيانات مخزنة بترتيبين مختلفين.
import pandas as pd
a = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
b = pd.Series([1, 2, 3], index=['y', 'z', 'w'])
print(a + b)
# w NaN
# x NaN
# y 21.0
# z 32.0ملء NaN في العمليات ذات المحاذاة
لتجنب انتشار NaN في العمليات التي لا تتطابق فيها الفهارس، استخدم الدوال الحسابية مثل .add() و.sub() و.mul() و.div() مع المعامل fill_value=. إذ يستبدل هذا المعامل قيمةً محددة بأي تسمية مفقودة في إحدى Series قبل تنفيذ العملية، وتكون القيمة الشائعة 0 للجمع و1 للضرب.
import pandas as pd
a = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
b = pd.Series([1, 2, 3], index=['y', 'z', 'w'])
result = a.add(b, fill_value=0)
print(result)
# w 3.0
# x 10.0
# y 21.0
# z 32.0الحساب القياسي على Series
يطبق إجراء حسابي باستخدام قيمة قياسية على كل عنصر، وينتج Series جديدة بالفهرس نفسه. وهذه أبسط صور العمليات المتجهة: s + 5 وs * 100 وs ** 2. ولا ينتج عن الحساب القياسي قيم NaN، ويُستخدم لتحويل الوحدات والتطبيع وإضافة إزاحة إلى السلاسل الزمنية.
import pandas as pd
prices_eur = pd.Series([1.0, 2.5, 4.0], index=['a', 'b', 'c'])
exchange = 1.08
prices_usd = prices_eur * exchange
print(prices_usd.round(2))
# a 1.08
# b 2.70
# c 4.32تطبيق ufuncs الخاصة بـ NumPy على Series
تعمل ufuncs الخاصة بـ NumPy بسلاسة على Pandas Series وتعيد Series بالفهرس نفسه. وهذا يعني أنه يمكنك استدعاء np.sqrt(s) أو np.log1p(s) أو np.exp(s) مباشرةً على Series دون تحويلها أولًا إلى مصفوفة. وتكون النتيجة Series جديدة تحافظ على التسميات الأصلية.
import pandas as pd
import numpy as np
s = pd.Series([0, 1, 4, 9, 16], index=list('abcde'))
print(np.sqrt(s))
# a 0.0
# b 1.0
# c 2.0
# d 3.0
# e 4.0عمليات المقارنة على Series
تعيد معاملات المقارنة (== و!= و> و< و>= و<=) Series منطقية عنصرًا بعنصر. وتُعد هذه المعاملات أساس التصفية؛ إذ تمرّر Series المنطقية إلى .loc لاختيار الصفوف المطابقة. كما يحاذي Pandas الفهرس عند مقارنة Series اثنتين.
import pandas as pd
s = pd.Series([3, 7, 2, 9, 1], index=list('abcde'))
print(s > 4)
# a False
# b True
# c False
# d True
# e False
print(s[s > 4]) # b:7 d:9تسلسل العمليات المتجهة
بما أن كل عملية تعيد Series جديدة، يمكنك تسلسل عدة تحويلات في تعبير واحد. ويجعل ذلك الشيفرة سهلة القراءة، كما يتجنب إنشاء متغيرات وسيطة غير ضرورية. وفي مسارات المعالجة المعقدة، قسّم التسلسل على عدة أسطر باستخدام الأقواس. ويُعد التسلسل في Pandas مكافئًا للبرمجة الوظيفية باستخدام بيانات غير قابلة للتغيير.
import pandas as pd
import numpy as np
raw_scores = pd.Series([55, 80, 45, 90, 72])
normalised = (raw_scores - raw_scores.min()) / (raw_scores.max() - raw_scores.min())
print(normalised.round(2))
# 0 0.22
# 1 0.78
# 2 0.00
# 3 1.00
# 4 0.60معالجة NaN في العمليات المتجهة
تنتشر NaN؛ فأي عملية حسابية تتضمن NaN تنتج NaN. استخدم s.fillna(value) للاستبدال قبل إجراء العملية، أو استخدم المعامل skipna=True في دوال التجميع. تعيد الدالة pd.isna(s) Series منطقية تحدد مواضع NaN؛ استخدمها لمراجعة البيانات قبل حساب الإحصاءات.
import pandas as pd
import numpy as np
s = pd.Series([1.0, np.nan, 3.0, np.nan, 5.0])
print(s + 10)
# 0 11.0 2 13.0 4 15.0 -- NaN stays NaN
print(s.fillna(0) + 10)
# 0 11.0 1 10.0 2 13.0 3 10.0 4 15.0abs() وclip() وround() على Series
توفّر Pandas Series العديد من الدوال المشابهة لدوال NumPy مباشرةً: إذ تعيد s.abs() وs.clip(lower, upper) وs.round(decimals) Series جديدة بعد تطبيق التحويل على كل عنصر. وهذه الدوال مكافئة لاستدعاءات ufunc في NumPy، لكنها تستخدم صيغة الدوال وتحافظ على فهرس Series واسمها.
import pandas as pd
s = pd.Series([-2.5, 1.3, -0.7, 4.9, -3.1])
print(s.abs()) # [2.5 1.3 0.7 4.9 3.1]
print(s.clip(-2, 2)) # [-2. 1.3 -0.7 2. -2. ]
print(s.round(0)) # [-2. 1. -1. 5. -3.]pct_change() لمعدلات النمو
تحسب s.pct_change() التغير النسبي بين العناصر المتتالية: (الحالي - السابق) / السابق. ويكون العنصر الأول NaN لعدم وجود قيمة سابقة. وهذه هي العملية القياسية لحساب معدلات النمو من شهر إلى شهر، والعوائد اليومية في مجال التمويل، وميزات معدل التغير لنماذج السلاسل الزمنية.
import pandas as pd
monthly_revenue = pd.Series([100, 120, 110, 140],
index=['Q1', 'Q2', 'Q3', 'Q4'])
growth = monthly_revenue.pct_change()
print(growth.round(3))
# Q1 NaN
# Q2 0.200
# Q3 -0.083
# Q4 0.273cumsum() وcumprod() على Series
تعيد s.cumsum() Series من المجاميع التراكمية، بينما تعيد s.cumprod() النواتج التراكمية. وتُستخدمان لحساب الإيرادات التراكمية، وعوائد الاستثمارات المركبة، أو أعداد الكلمات المتراكمة. وتحافظان على تسميات الفهرس الأصلية، مما يسهّل رسم Series التراكمية عبر الزمن أو حسب الفئة.
import pandas as pd
daily_sales = pd.Series([100, 150, 80, 200],
index=['Mon', 'Tue', 'Wed', 'Thu'])
print(daily_sales.cumsum())
# Mon 100
# Tue 250
# Wed 330
# Thu 530تحقق سريع
اختبر مدى فهمك للعمليات المتجهة على Series من هذا الدرس.
مراجعة الدرس
تعلمت في هذا الدرس أن: المعاملات الحسابية تُطبَّق عنصرًا بعنصر على Series دون حلقات، وأن Pandas يحاذي Series اثنتين تلقائيًا حسب تسمية الفهرس قبل إجراء العملية، ويضع NaN في المواضع غير المتطابقة، وأن دوال مثل fill_value وpct_change وcumsum توسّع إمكانات العمليات المتجهة للمهام التحليلية. سنستكشف بعد ذلك دوال Series المفيدة مثل describe وvalue_counts وmap لإجراء التلخيص بسرعة.
تعلم Python مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «العمليات المتجهة على Series» مجاني؟
نعم — نص درس «العمليات المتجهة على Series» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Pandas & NumPy Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
ماذا ستتعلم في «العمليات المتجهة على Series»؟
أجرِ عمليات حسابية بين سلسلتين، وتعامل تلقائيًا مع محاذاة الفهارس، واملأ القيم المفقودة بعد المحاذاة بـ NaN. تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Pandas & NumPy Academy؟
لا تُشترط خبرة سابقة. Pandas & NumPy Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «العمليات المتجهة على Series»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Pandas & NumPy Academy هذا؟
نعم. كل درس في Pandas & NumPy Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إنشاء Series
- الوصول المستند إلى التسميات والمستند إلى المواضع
- العمليات المتجهة على Series
- دوال Series المفيدة