このリポジトリには、気象データに基づいて太陽光発電電力予測を予測するための2つの代替実装が含まれています。これらの2つのアプローチを比較する独身論文のために開発されました。 2つのデータソースは、天候と出力サンプルデータとして機能します。
プロジェクトをセットアップするには、Pipenvをお勧めします。 Pipenvがインストールされた状態で、プロジェクトルートから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 ()適切な形式でデータを解析するインポーターが利用可能な2つのデータソースがあります。もちろん、他のソースも使用することも可能です。第一に、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データフレームとして解析し、予測モジュールに渡すことができます。また、次のオプションパラメーターを渡してloadこともできます。
これらのパラメーターの詳細については、PVWATTS V6 API説明を参照してください。すべてのパラメーターにはデフォルト値があるため、パラメーターなしでメソッドを呼び出すことも可能です。返品データは、DateTimeIndexを使用してインデックス化されています。 PVWattsは日付を指定していませんが、常に1年間データを返すため、このモジュールから返されるデータフレームごとに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 |
ライブフィードWebサイトにダウンロードできます。右側のサイドバーからPV SiteとPV Arrayを選択します。次に、 Download Dataをクリックして、 Download Daily Logs 。そこから、日付範囲(1年をお勧めします)を指定してから、 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または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クラス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コラムは自動的に削除されます。予測データフレームには、 power列に予測値が含まれるtesting_data列があります。
アルゴリズムが適切な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を渡して、予測プロセスに含める必要がある機能を制限することもできます。