يحتوي هذا المستودع على تطبيقين بديلين للتنبؤ بالتنبؤ بالطاقة الكهروضوئية على أساس بيانات الطقس. تم تطويره لأطروحة البكالوريوس التي تقارن هذين النهجين. يعمل مصدران للبيانات كبيانات عينة من طقس وإخراج الطاقة.
أوصي Pipenv بإعداد المشروع. مع تثبيت pipenv pipenv install من جذر المشروع وسيقوم بتثبيت جميع التبعيات اللازمة. ثم استخدم pipenv shell لإدخال shell حيث ستتوفر جميع التبعيات أو مجرد pipenv run <command> لتنفيذ أمر معين.
إذا لم تستخدم pipenv ، يتم تحديد التبعيات في Pipfile ويمكن العثور على الإصدارات التي أستخدمها في pipfile.lock.
لاستخدام خدمة PVWATTS الموضحة لاحقًا ، تحتاج إلى الحصول على مفتاح API. بعد ذلك ، يجب عليك تعيينه كمتغير للبيئة (أو وضعه في الكود مباشرة). إذا كنت تستخدم pipenv ، فيمكن القيام بذلك في ملف .env .
يمكن العثور على أمثلة حول كيفية استخدام المشروع في ملفات المثال في دليل الجذر. يمكنك تشغيل هذه الملفات مباشرة بعد الانتهاء من الخطوات اللازمة للحصول على البيانات الموضحة في القسم التالي.
pipenv run python example_arima_pvwatts.py
pipenv run python example_arima_uq.py
pipenv run python example_svr_pvwatts.py
pipenv run python example_svr_uq.py
للتخطيط مع Matplotlib ، تصدر Pandas تحذيرًا في المستقبل ، لذلك وضعت السطر التالي بعد الواردات:
from pandas . plotting import register_matplotlib_converters ; register_matplotlib_converters ()هناك نوعان من البيانات التي يتوفر عليها المستورد التي تعمل على توحيد البيانات بالتنسيق الصحيح. بالطبع من الممكن استخدام مصادر أخرى أيضًا. أولاً ، هناك غلاف PVWATTS وثانياً للبيانات التي تم الحصول عليها من UQ Solar.
البيانات المعدة من PVWATTS تشبه هذا:
| وقت | الدف | WSPD | قوة |
|---|---|---|---|
| 2019-06-20 06:00:00 | 16.0 | 0.0 | 957.201 |
| 2019-06-20 07:00:00 | 18.0 | 1.5 | 1648.060 |
| 2019-06-20 08:00:00 | 21.0 | 3.1 | 2260.658 |
| 2019-06-20 09:00:00 | 23.0 | 4.1 | 2647.271 |
| 2019-06-20 10:00:00 | 24.0 | 2.6 | 2838.976 |
يمكن الحصول عليها عبر PVWATTS API. من أجل الحصول على مفتاح API ، تحتاج إلى التسجيل في شبكة مطور NREL. يجب أن يتم وضع مفتاح API في البيئة PVWATTS_API_KEY . بدلاً من ذلك ، يمكنك إدراجها في PVWATTS مباشرة. عندما يتم ذلك ، يمكنك استخدامك
from importers import pvwatts
data = pvwatts . load () هذا يدعو واجهة برمجة التطبيقات وتوصيف النتيجة كنقطة بيانات Pandas التي يمكن تمريرها إلى وحدات التنبؤ. يمكنك أيضًا تمرير المعلمات الاختيارية التالية load :
للحصول على معلومات حول هذه المعلمات ، يرجى الرجوع إلى وصف PVWATTS V6 API. جميع المعلمات لها قيم افتراضية ، لذا فإن استدعاء الطريقة بدون معلمات ممكنة أيضًا. يتم فهرسة بيانات الإرجاع باستخدام DateTimeIndex. نظرًا لأن PVWATTS لا تحدد التواريخ ولكنها تقوم دائمًا بإرجاع البيانات لمدة عام كامل ، فسيتم تحديد عام 2019 لكل بيانات البيانات التي يتم إرجاعها من هذه الوحدة.
إذا كان لديك استجابة PVWATTS JSON المحفوظة في ملف JSON ، فمن الممكن أيضًا تحليل هذا الملف مباشرة باستخدام طريقة الراحة التالية:
pvwatts . load_from_json ( 'filepath.json' )تبدو البيانات المعدة من علف UQ Solar Live مشابهًا لهذا:
| وقت | Airtemp | رطوبة | سبيد الرياح | اتجاه الريح | قوة |
|---|---|---|---|---|---|
| 2015-06-20 07:00:00 | 9.27 | 75.24 | 1.72 | 191.47 | 25302.00 |
| 2015-06-20 08:00:00 | 11.28 | 68.72 | 2.14 | 201.45 | 78240.83 |
| 2015-06-20 09:00:00 | 13.38 | 59.02 | 2.59 | 214.77 | 128523.08 |
| 2015-06-20 10:00:00 | 14.49 | 54.19 | 2.92 | 201.67 | 162968.83 |
| 2015-06-20 11:00:00 | 15.65 | 51.89 | 2.34 | 203.23 | 172535.83 |
يمكن تنزيله على موقع التغذية المباشرة. اختر PV Site ومجموعة PV Array من الشريط الجانبي على اليمين. ثم انقر فوق Download Data ثم Download Daily Logs . من هناك ، يمكنك تحديد نطاق تاريخ (أوصي لمدة عام) ، ثم تنزيل ملف Power & Energy بالإضافة إلى ملف Weather . تأكد من تنزيل كل من نطاقات التاريخ المحددة.
الآن يمكنك استخدام
from importers import uq
data = uq . load ( 'power_file.csv' , 'weather_file.csv' ) واستبدل كل من المعلمات مع مسارات الملف لكل ملف. تجمع طريقة load بين كلا الملفين مرة أخرى في نظام بيانات Pandas ، جاهزًا للتمرير إلى وحدة التنبؤ.
الآن بعد أن أصبحت بيانات البيانات ذات الميزات وبيانات الطاقة ، يمكنك إجراء تنبؤات. يعيد كلا المستوردين إطار بيانات يحتوي على ميزات مختلفة ، لكن كلاهما لديه عمود power يمثل إخراج الطاقة.
نظرًا لأن البيانات من كلا المستوردين لديها DateTimeIndex ، يمكن تقسيمها إلى بيانات التدريب واختبارها مثل هذا:
training_data = data [ '20190601' : '20190607' ] # first week of june 2019
testing_data = data [ '20190608' : '20190614' ] # second week of june 2019 هنا يتم تحويل التواريخ من سلاسل ضمنية. على سبيل المثال '20190601' يصور 2019/06/01 أو يونيو 01 ، 2019.
تستخدم هذه الخوارزمية تنفيذ SCIKIT-Learn لـ SVR الذي يعتمد على libsvm. لاستخدامه يتوفر الفصل التالي:
from predictors . svr_model import SVRModelإجراء تنبؤ دون تحجيم البيانات:
model = SVRModel ( scaling = False )
model . fit ( training_data , kernel = 'rbf' , C = 1e3 , gamma = 0.1 , epsilon = 0.1 )
model . predict ( testing_data ) # returns the prediction data frame containing the testing features and the power prediction
model . prediction . power # use this to access the power prediction تصفية عمود power من إطار testing_data ليس ضروريًا ، فإن فئة SVRModel تفعل ذلك تلقائيًا. اختياريًا ، من الممكن تمرير filter=['airtemp', 'humidity'] أو ما شابهًا fit الميزات المستخدمة للتنبؤ. ليس من الضروري تصفية البيانات يدويًا بهذه الطريقة.
تعد متغيرات SVR kernel و C و gamma و epsilon كلها اختيارية ، ولديها قيم افتراضية.
للسماح للنموذج بتوسيع نطاق البيانات قبل تطبيق الانحدار ، يمكنك تعيين معلمة التحجيم إلى True (هذه هي القيمة الافتراضية):
model = svr_model ( base_data = data , scaling = True ) وبهذه الطريقة ، يجب عليك تحديد base_data والتي يمكن أن تكون مجموعة بيانات لمدة عام آخر. لن يتم استخدام هذا للانحدار ، فقط لتركيب كائن scaler ممكن. لمزيد من المعلومات حول ذلك ، تشير إلى تنفيذ StandArtScaler لـ Scikit-Learn.
تستخدم هذه الخوارزمية على حزمة Pmdarima (الهرم الأريما سابقًا). يمكن استخدامه عن طريق استيراد الفئة اللازمة:
from predictors . arima_model import ARIMAModelالآن لإجراء تنبؤ دون استخدام المتغيرات الخارجية ، قم بما يلي:
model = ARIMAModel () # scaling is set to true automatically
model . fit ( training_data , order = ( 2 , 1 , 4 ), seasonal_order ( 3 , 1 , 2 , 24 ), use_exogenous = False )
model . predict ( hours = 48 ) # returns the prediction
model . prediction . power # use this to access the power predictionn توفير ميزات الاختبار ليس ضروريًا لأن النموذج كان مناسبًا بدون متغيرات خارجية. في هذه الحالة ، سيكون لدى DataFrame الذي تم إرجاعه عمود power فقط. يحدد order معلمات (p,d,q) للنموذج. يحدد seasonal_order معلمات (P,D,Q,s) . يمكن ضبط معلمة التحجيم عند إنشاء النموذج ، بشكل افتراضي يتم تعيينه على True ولكن يمكن إلغاء ضبطه مع:
model = ARIMAModel ( scaling = false )إذا كنت ترغب في إضافة متغيرات خارجية ، قم بتعيين هذه المعلمة:
model . fit ( training_data , order = ( 2 , 1 , 4 ), seasonal_order ( 3 , 1 , 2 , 24 ), use_exogenous = True ) # use_exogenous is True by default
model . predict ( testing_data = testing_data ) بهذه الطريقة ، عليك تحديد testing_data عند التنبؤ. سيتم إزالة عمود power تلقائيًا عند إجراء التنبؤ الفعلي. سيكون لدى DataFrame للتنبؤ الآن أعمدة testing_data حيث يحتوي عمود power على القيم المتوقعة.
إذا كنت ترغب في السماح للخوارزمية تلقائيًا بالعثور على معلمات p, q, P and Q المناسبة ، استخدم المكالمة التالية:
model . fit_auto ( training_data , p = ( 0 , 5 ), q = ( 0 , 5 ), P = ( 0 , 5 ), Q = ( 0 , 5 ), d = 1 , D = 1 ) تحدد tuples النطاقات التي ستبحث فيها الخوارزمية عن المعلمات المثلى. يمكن استبعاد d و D لتحديد تلك المعلمات تلقائيًا. كما هو الحال مع طريقة fit ، سيتم ضبط use_exogenous على True بشكل افتراضي ، ولكن يمكن أيضًا تحديدها لتكون False .
كما هو ممكن مع SVRModel ، يمكنك أيضًا تمرير صفيف مرشح fit و fit_auto لتقييد الميزات التي يجب تضمينها في عملية التنبؤ.