該存儲庫包含兩個基於天氣數據的預測光伏功率預測的替代實現。它是為我的學士學位論文開發的,該論文比較了這兩種方法。兩個數據源用作天氣和電源輸出樣本數據。
我建議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太陽能獲得的數據。
來自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 ()這調用API並將結果解析為PANDAS DataFrame,可以傳遞給預測模塊。您還可以將以下可選參數傳遞到load :
有關這些參數的信息,請參閱PVWATTS V6 API說明。所有參數都有默認值,因此也可以調用無參數的方法。返回數據使用DateTimeIndex索引。由於PVWATTS未指定日期,但始終返回一年的數據,因此將為從該模塊返回的每個數據框架設置2019年。
如果您在JSON文件中保存了PVWATTS JSON響應,也可以使用以下便利方法直接解析該文件:
pvwatts . load_from_json ( 'filepath.json' )來自UQ太陽能活飼料的準備好數據看起來與此相似:
| 時間 | 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 |
它可以在Live Feed網站上下載。從右側的側邊欄中選擇一個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中,準備將其傳遞到預測模塊。
現在,存在具有功能和電源數據的數據框,您可以進行預測。兩個進口商都返回具有不同功能的數據框架,但都具有代表功率輸出的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或2019年6月1日。
該算法使用基於LIBSVM的SVR的Scikit-Learn實現。要使用以下課程:
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從testing_data幀中濾除power列是不需要的, SVRModel類自動執行此操作。可選地,可以通過filter=['airtemp', 'humidity']或類似於fit限制預測的功能。沒有必要以這種方式手動過濾數據。
SVR變量kernel , C , gamma和epsilon都是可選的,它們都有默認值。
要讓模型在應用回歸之前縮放數據,您可以將縮放參數設置為True (這是默認值):
model = svr_model ( base_data = data , scaling = True )這樣,您確實必須指定base_data ,這可以是另一年的數據集。這不會用於回歸,僅用於擬合可行的scaler對象。有關該信息的更多信息,請參閱Scikit-Learn的StandartScaler實現。
該算法在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不需要提供測試功能,因為該模型沒有外源變量。在這種情況下,返回的數據框將只有一個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列將自動刪除。現在,預測數據框將具有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 )元組定義範圍,其中算法將搜索最佳參數。 d和D可以被遺漏以自動確定這些參數。與fit方法一樣,默認情況下將使用use_exogenous設置為True ,但也可以指定為False 。
如果可能使用SVRModel ,您也可以將過濾器數組傳遞以fit並fit_auto限制預測過程中應包含哪些功能。