该存储库包含两个基于天气数据的预测光伏功率预测的替代实现。它是为我的学士学位论文开发的,该论文比较了这两种方法。两个数据源用作天气和电源输出样本数据。
我建议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限制预测过程中应包含哪些功能。