ที่เก็บนี้มีการใช้งานทางเลือกสองทางสำหรับการพยากรณ์การทำนายพลังงานแสงอาทิตย์ตามข้อมูลสภาพอากาศ มันได้รับการพัฒนาสำหรับวิทยานิพนธ์ปริญญาตรีของฉันที่เปรียบเทียบวิธีการทั้งสอง แหล่งข้อมูลสองแหล่งทำหน้าที่เป็นข้อมูลตัวอย่างสภาพอากาศและกำลังไฟ
ฉันแนะนำให้ PipenV ตั้งค่าโครงการ ด้วยการติดตั้ง PIPENV RUN pipenv install จากรูทโครงการและจะติดตั้งการพึ่งพาที่จำเป็นทั้งหมด จากนั้นใช้ pipenv 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 PVWATTS API ในการรับคีย์ API คุณต้องลงทะเบียนที่เครือข่ายนักพัฒนา NREL คีย์ API จะต้องใส่ในตัวแปรสภาพแวดล้อม PVWATTS_API_KEY หรือคุณสามารถแทรกลงใน pvwatts โดยตรง เมื่อเสร็จแล้วคุณสามารถใช้งานได้
from importers import pvwatts
data = pvwatts . load () สิ่งนี้เรียก API และแยกวิเคราะห์ผลลัพธ์เป็น dataframe pandas ซึ่งสามารถส่งผ่านไปยังโมดูลการพยากรณ์ นอกจากนี้คุณยังสามารถส่งพารามิเตอร์เสริมต่อไปนี้เพื่อ load :
สำหรับข้อมูลเกี่ยวกับพารามิเตอร์เหล่านี้โปรดดูคำอธิบาย PVWATTS V6 API พารามิเตอร์ทั้งหมดมีค่าเริ่มต้นดังนั้นการเรียกวิธีการที่ไม่มีพารามิเตอร์ก็เป็นไปได้เช่นกัน ข้อมูลการส่งคืนจะถูกจัดทำดัชนีโดยใช้ DateTimeIndex เนื่องจาก PVWATTS ไม่ได้ระบุวันที่ แต่จะส่งคืนข้อมูลตลอดทั้งปีปี 2019 จะได้รับการตั้งค่าคงที่สำหรับแต่ละ DataFrame ที่ส่งคืนจากโมดูลนี้
หากคุณมีการตอบกลับ PVWATTS JSON ที่บันทึกไว้ในไฟล์ JSON ก็เป็นไปได้ที่จะแยกวิเคราะห์ไฟล์นั้นโดยตรงโดยใช้วิธีการสะดวกต่อไปนี้:
pvwatts . load_from_json ( 'filepath.json' )ข้อมูลที่เตรียมจากฟีดสดของ UQ Solar มีลักษณะคล้ายกับสิ่งนี้:
| เวลา | Airtemp | ความชื้น | windspeed | ทิศทางลม | พลัง |
|---|---|---|---|---|---|
| 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 dataframe พร้อมที่จะส่งผ่านไปยังโมดูลการพยากรณ์
ตอนนี้มีข้อมูลที่มีคุณสมบัติและข้อมูลพลังงานอยู่แล้วคุณสามารถคาดการณ์ได้ ผู้นำเข้าทั้งสองส่งคืน DataFrame ซึ่งมีคุณสมบัติที่แตกต่างกัน แต่ทั้งคู่มีคอลัมน์ 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
อัลกอริทึมนี้ใช้การใช้ SVR-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 กับการ จำกัด คุณสมบัติที่ใช้สำหรับการพยากรณ์ ไม่จำเป็นต้องกรองข้อมูลด้วยตนเองด้วยตนเอง
kernel ตัวแปร SVR, C , gamma และ epsilon ล้วนเป็นทางเลือกพวกเขาทั้งหมดมีค่าเริ่มต้น
เพื่อให้รุ่นของโมเดลข้อมูลก่อนใช้การถดถอยคุณสามารถตั้งค่าพารามิเตอร์การปรับสเกลเป็น True (นี่คือค่าเริ่มต้น):
model = svr_model ( base_data = data , scaling = True ) ด้วยวิธีนี้คุณต้องระบุ base_data ซึ่งสามารถเป็นชุดข้อมูลสำหรับอีกหนึ่งปี สิ่งนี้จะไม่ถูกใช้สำหรับการถดถอยเพียงเพื่อให้เหมาะสมกับวัตถุ scaler เป็นไปได้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับที่อ้างถึงการใช้งาน StandartScaler ของ Scikit-Learn
อัลกอริทึมนี้ใช้งานบนแพ็คเกจ PMDarima (เดิมคือ Pyramid-Arima) สามารถใช้งานได้โดยการนำเข้าคลาสที่จำเป็น:
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 เพื่อ จำกัด คุณสมบัติที่ควรรวมอยู่ในกระบวนการพยากรณ์