الوحدة 10 — مشروع: التنبّؤ بسلسلة قياسات
تسع وحدات نظرية، وأداة عملانية أخيرة. تجمع هذه الوحدة كلّ ما سبق في مشروع من أوّله إلى آخره على الفيل الأحمر: التنبّؤ بالأربع والعشرين ساعة القادمة من استهلاك مبنى المكاتب، انطلاقًا من أسبوع من البيانات. كلّ قرار في الكود يُحيل إلى الوحدة التي تُبرِّره.
الإطار
بيانات سنتين، خطوة ساعة. المتغيّر المستهدف kwh (الاستهلاك)، متغيّر مساعد temp (الحرارة الخارجية)، ومتغيّرات مُشتقّة يوم الأسبوع وساعة اليوم بترميز جيبي/جيب تمامي.
import numpy as np
import pandas as pd
df = pd.read_csv("conso.csv", parse_dates=["ts"]).set_index("ts").sort_index()
# متغيرات دورية (الوحدة 6 من دورة هندسة المتغيرات).
heure = df.index.hour
jour = df.index.dayofweek
df["h_sin"] = np.sin(2 * np.pi * heure / 24)
df["h_cos"] = np.cos(2 * np.pi * heure / 24)
df["j_sin"] = np.sin(2 * np.pi * jour / 7)
df["j_cos"] = np.cos(2 * np.pi * jour / 7)
variables = ["kwh", "temp", "h_sin", "h_cos", "j_sin", "j_cos"]
المرجعية الساذجة، أوّ ل ما يُنشَر
قبل أي نموذج تكراري، مرجعية ساذجة. الفعلية على السلاسل الزمنية هي persistence بأمس: نتنبّأ باستهلاك اليوم القادم بأنّه سيكون مطابقًا لاستهلاك اليوم الماضي في نفس الساعات.
def persistance_hier(serie_kwh):
"""يعيد تنبؤ 24 ساعة قادمة كنسخة من آخر 24 ساعة."""
return serie_kwh[-24:]
# على مجموعة الاختبار: كل نافذة نتنبأ بها بآخر 24 ساعة قبل الأفق.
predictions_naives = []
for i in range(0, len(te) - 168 - 24 + 1, 24):
entree = te["kwh"].iloc[i:i + 168].values
prediction = persistance_hier(entree)
predictions_naives.append(prediction)
mae_naif = np.mean(np.abs(np.array(predictions_naives) -
y_te_reel))
print(f"MAE مرجعية persistance: {mae_naif:.2f} kWh")
# MAE مرجعية persistance: 6.83 kWh
هذا الرقم هو الرقم الذي يجب أن نتغلّب عليه. أيّ نموذج تكراري لا يتقدّم على 6.83 kWh هو جهد مبذول عبثًا. ينبغي أن يستهلّ به كلّ مشروع سلسلة زمنية، دائمًا.