المتوسط المتحرك، المعروف أيضًا باسم أو المتوسط الجاري أو المتوسط الحسابي، هو جزء أساسي من مجموعة أدوات أي عالم بيانات. عند تحليل مجموعات البيانات مثل أنماط الطقس واتجاهات سوق الأوراق المالية، نميل إلى مواجهة القيم المتطرفة والضوضاء التي يمكن أن تحجب الاتجاهات الأكثر أهمية التي نبحث عنها.
في هذه المقالة، ستتعلم كيفية استخدام بايثون لحساب المتوسطات المتحركة “لإزالة” الضوضاء في كود علم البيانات الخاص بك.
ما هو المتوسط المتحرك؟
يشير المتوسط المتحرك إلى تحويل سلسلة من النقاط عن طريق حساب متوسطات فترات فرعية قصيرة ضمن السلسلة الأكبر. يميل هذا إلى منحنا مجموعة بيانات أكثر سلاسة من النقاط الخام وحدها، حيث أن حساب المتوسطات بهذه الطريقة يقلل من تأثير التغييرات الحادة والسريعة في بياناتنا.
يتم حساب المتوسطات المتحركة على نافذة محددة من نقاط البيانات. دعنا نقول أن لدينا مجموعة بيانات من 7 درجات حرارة يومية في الهواء الطلق خلال أسبوع واحد ونطبق متوسطًا متحركًا بحجم نافذة 3. ستكون مجموعة البيانات الناتجة:
- متوسط درجة الحرارة من الاثنين إلى الأربعاء (الأيام 1-3).
- متوسط درجة الحرارة من الثلاثاء إلى الخميس (الأيام 2-4).
- متوسط درجة الحرارة من الأربعاء إلى الجمعة (الأيام 3-5).
- متوسط درجات الحرارة من الخميس إلى السبت (الأيام 4-6).
- متوسط درجات الحرارة من الجمعة إلى الأحد (الأيام 5-7).
أصبحت مجموعة البيانات المحولة الآن أقل حساسية للتغيرات السريعة في درجات الحرارة اليومية وتُظهِر اتجاهًا أكثر عمومية. وهذا يعني أنه إذا كان يوم الأربعاء (على سبيل المثال) يومًا حارًا أو باردًا بشكل غير معتاد، فلن نشهد “ارتفاعًا” كبيرًا في بياناتنا.
عند تحليل مجموعات البيانات الأكبر حجمًا، يمكن أن يكون هذا مفيدًا بشكل استثنائي. لن تؤدي الظواهر مثل موجات الحر القصيرة ونوبات البرد إلى تلويث بياناتنا، مما يسمح لنا بالتركيز على اتجاهات طويلة الأجل أكثر أهمية – مثل تغير المناخ على مر السنين والعقود.
اختيار حجم النافذة
كقاعدة عامة، يتناسب حجم النافذة بشكل مباشر مع مقدار “التنعيم” الذي نريد تحقيقه. تعد أحجام النوافذ الأكبر أكثر قوة وتؤدي وظيفة أفضل في تقليل الضوضاء، ولكن جعلها كبيرة جدًا يمكن أن يؤدي إلى تبسيط مجموعة البيانات الخاصة بنا وإخفاء الاتجاهات التي نبحث عنها بالفعل. وعلى العكس من ذلك، فإن جعل حجم النافذة صغيرًا جدًا يمكن أن يؤدي إلى عمل رديء في تقليل كمية الارتفاعات في بياناتنا.
على سبيل المثال، إذا كان لدينا سلسلة من أسعار الأسهم بالساعة على مدار عدة أشهر، فسوف يكون من الجيد أن يكون لدينا نافذة زمنية تزيد عن 24 ساعة؛ وبما أن اليوم يتكون من 24 ساعة، فسوف نتخلص من الاختلافات التي لا معنى لها في الأسعار من ساعة إلى ساعة. وعلاوة على ذلك، فإن زيادة نافذة الوقت لدينا إلى 96 ساعة (أو 4 أيام) من شأنها أن تخفف من تأثير ارتفاع الأسعار وانخفاضها الذي لا يستمر سوى بضعة أيام.
يعد اختيار حجم النافذة المناسب أمرًا بالغ الأهمية للحصول على مجموعة بيانات عالية الجودة. يتطلب القيام بذلك معرفة طبيعة بياناتنا، على سبيل المثال حجم السلسلة وعدد القيم المتطرفة والفاصل العام لها. كما يتطلب أيضًا تحديد هدف واضح – أو معرفة ما تأمل في تحقيقه!
حساب المتوسط المتحرك لبايثون
دعنا نتعلم كيفية حساب المتوسط المتدحرج فعليًا باستخدام بايثون. سنعود إلى مثال درجة الحرارة الخارجية، ولكننا سنستخدم أرقامًا فعلية هذه المرة:
Day of Week | Temperature in °C |
---|---|
Monday | 23 °C |
Tuesday | 25 °C |
Wednesday | 12 °C |
Thursday | 28 °C |
Friday | 33 °C |
Saturday | 31 °C |
Sunday | 35 °C |
إذا استخدمنا حجم نافذة 3، فسنحتاج إلى حساب متوسط كل تسلسل متتالي من 3 نقاط بيانات. تذكر أن حساب متوسط السلسلة بسيط مثل جمع كل العناصر معًا، ثم قسمة المجموع على عدد العناصر في السلسلة.
مع وضع ذلك في الاعتبار، ستكون نقاط البيانات النهائية (المقربة إلى ثلاثة منازل عشرية) على النحو التالي:
- 23 + 25 + 12) / 3 = 20 °C
- (25 + 12 + 28) / 3 = 21.667 °C
- (12 + 28 + 33) / 3 = 24.333 °C
- (28 + 33 + 31) / 3 = 30.667 °C
- (33 + 31 + 35) / 3 = 33 °C
حساب المتوسط المتحرك في بايثون باستخدام حلقة
إن الحساب يدويًا أمر جيد، ولكن إذا كنت عالم بيانات حقيقيًا، فستحتاج إلى دمج هذا الحساب في بقية الحل القائم على الكود. ونظرًا لأن بايثون هي لغة البرمجة الرائدة لعلماء البيانات (اكتشف السبب في سبب استخدام بايثون في علوم البيانات)، فسوف ننطلق في استكشاف خطوة بخطوة لحساب المتوسط المتحرك في بايثون.
سنبدأ أولاً باستكشاف حساب المتوسط المتحرك في بايثون باستخدام حلقة منتظمة. ثم سنستخدم مكتبة pandas الشهيرة لعلوم البيانات لتبسيط الحساب.
في كل الأحوال، سنبدأ بتحديد مجموعة البيانات. في هذا المثال، سنلتزم بمجموعة بيانات درجة الحرارة الخارجية التي حددناها سابقًا:
dataset = [23, 25, 12, 28, 33, 31, 35]
سنقوم أيضًا بتخزين حجم النافذة في متغير منفصل لجعل الكود أكثر وضوحًا وسهولة في التحرير. سنلتزم بحجم نافذة 3:
window_size = 3
الآن بعد أن قمنا بتحديد مدخلاتنا بشكل واضح، يمكننا كتابة الحلقة الفعلية لحساب مجموعة البيانات الناتجة:
result = []
for i in range(len(dataset) - window_size + 1):
window = dataset[i : i + window_size]
window_average = sum(window) / window_size
result.append(window_average)
دعونا نحلل هذا الأمر خطوة بخطوة.
أولاً، نقوم بإنشاء مصفوفة فارغة ستحمل نقاط البيانات الناتجة. ثم نكرر المصفوفة الأصلية n - window_size + 1
مرات، حيث n هو العدد الأولي للعناصر. وذلك لأن آخر عناصر window_size - 1
تُفقد بالضرورة كجزء من الحساب – على سبيل المثال، إذا حسبنا متوسطًا متحركًا لليوم المحدد واليومين التاليين، فإن الحساب يكون مستحيلًا لليومين الأخيرين.
إذا كان هذا يربكك، فتذكر أنه في مثالنا لم تعد هناك فترات زمنية للمتوسطات المتحركة بعد يوم الجمعة. لا يمكننا بدء فترة زمنية يوم السبت، لأن نهاية الفترة الزمنية ستكون في يوم من أيام الأسبوع بعد يوم الأحد، وهو يوم غير موجود!
الآن، لكل من الفهارس الأولية التي نمر بها في الحلقة، نحتاج إلى إنشاء نافذة. نقوم بذلك باستخدام عامل الفهرس الفرعي []
في بايثون، والذي يحصل على فترة فرعية من مصفوفة أكبر. في هذه الحالة، نبدأ كل نافذة عند i
(أو الفهرس الحالي في الحلقة) وننهيها عند i + window_size
، أو عناصر window_size
بعد البداية.
بمجرد أن نحصل على نافذة، كل ما تبقى هو حساب متوسطها. لحساب متوسط التسلسل، نحتاج إلى جمع كل عناصره معًا ثم قسمة هذا الإجمالي على عدد العناصر في التسلسل. نقوم بذلك باستخدام دالة sum()
في بايثون (التي تجمع مصفوفة) مع عامل القسمة (/).
أخيرًا، نضيف متوسط النافذة المحسوب حديثًا إلى مجموعة النتائج ونستمر في الحلقة للمؤشرات التالية.
تشغيل هذا الكود يعطينا النتيجة:
[20, 21.667, 24.333, 30.667, 33]
وهذه هي نفس النتيجة التي حصلنا عليها عندما كنا نحسب يدويا في وقت سابق!
حساب المتوسط المتحرك في بايثون باستخدام pandas
من أهم مميزات لغة البرمجة بايثون هي قابليتها للتوسع. إن استخدام المكتبات الخارجية التي يمكن استيرادها بسهولة يقلل من كمية التعليمات البرمجية النمطية التي يتعين علينا كتابتها للحسابات المعروفة مثل المتوسطات المتحركة. وهذا يسمح لنا بالتركيز على الصورة الأكبر.
هناك العديد من مكتبات بايثون المفيدة التي يمكنك استخدامها لتبسيط وإثراء الكود الخاص بك، ولكن ربما تكون مكتبة تحليل البيانات الأكثر شهرة في بايثون هي pandas. فهي تحتوي على مجموعة كبيرة من هياكل البيانات والوظائف التي تساعدنا في أتمتة مهام علم البيانات الشائعة.
حسنًا، دعونا نبدأ في حساب المتوسط المتحرك في بايثون باستخدام مكتبة pandas!
سنبدأ مرة أخرى بتعريف مجموعة من نقاط البيانات ومتغير سيخزن حجم النافذة.
dataset = [23, 25, 12, 28, 33, 31, 35]
window_size = 3
نحن بحاجة أيضًا إلى استيراد مكتبة pandas على النحو التالي:
import pandas as pd
سنرغب في تحويل مجموعة البيانات إلى نموذج يمكن لمكتبة pandas فهمه. في هذه الحالة، سنستخدم بنية DataFrame
، وهي في الأساس عبارة عن جدول عادي. سنبدأ هذا الجدول بعمود واحد يسمى Data، والذي سيحتوي على النقاط الأصلية.
df = pd.DataFrame(data, columns=['Data'])
بعد ذلك، سنضيف عمودًا يسمى Moving_Average
والذي سيخزن المتوسطات المتدحرجة التي سنحسبها باستخدام الدالتين rolling()
وmean()
في مكتبة pandas. الأمر بسيط للغاية:
df['Moving Average'] = df['Data'].rolling(window=window_size).mean()
وهذا كل ما في الأمر! إذا قمنا بطباعة الجدول الناتج، فسنحصل على
Data Moving_Average
0 23 NaN
1 25 NaN
2 12 20.000000
3 28 21.666667
4 33 24.333333
5 31 30.666667
6 35 33.000000
يتطابق هذا تمامًا مع البيانات التي حصلنا عليها باستخدام الطرق الأخرى.
بالنسبة لهذه الأمثلة، لدينا جدول عادي مطبوع في وحدة التحكم، ولكن هناك العديد من الطرق الأكثر بديهية لتصور مخرجات البيانات.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.