Dieses Repository enthält zwei alternative Implementierungen zur Vorhersage der Photovoltaik -Leistungsvorhersage basierend auf Wetterdaten. Es wurde für meine Bachelor -These entwickelt, die diese beiden Ansätze vergleicht. Zwei Datenquellen dienen als Wetter- und Ausgangsprobendaten.
Ich empfehle Pipenv, das Projekt einzurichten. Mit der Installation von Pipenv installiert pipenv install über das Projektrouch und installiert alle erforderlichen Abhängigkeiten. Verwenden Sie dann pipenv shell , um die Shell einzugeben, in der alle Abhängigkeiten verfügbar sind, oder nur pipenv run <command> um einen bestimmten Befehl auszuführen.
Wenn Sie PipEnV nicht verwenden, sind Abhängigkeiten im PipFile angegeben, und die von mir verwendeten Versionen finden Sie im PipFile.lock.
Um den später beschriebenen PVWatts -Dienst zu verwenden, müssen Sie einen API -Schlüssel erhalten. Dann müssen Sie es als Umgebungsvariable festlegen (oder es direkt in den Code einfügen). Wenn Sie Pipenv verwenden, kann dies in einer .env -Datei erfolgen.
Beispiele zur Verwendung des Projekts finden Sie in den Beispieldateien im Stammverzeichnis. Sie können diese Dateien direkt ausführen , nachdem Sie die erforderlichen Schritte ausgeführt haben, um Daten zu erhalten, die im nächsten Abschnitt beschrieben wurden.
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
Für die Darstellung mit Matplotlib gibt Pandas eine zukünftige Warnung aus, sodass ich die folgende Zeile nach den Importen einsetze:
from pandas . plotting import register_matplotlib_converters ; register_matplotlib_converters ()Es gibt zwei Datenquellen, für die ein Importeur verfügbar ist, der die Daten im richtigen Format analysiert. Natürlich ist es möglich, auch andere Quellen zu verwenden. Erstens gibt es einen PVWATTS -Wrapper und zweitens einen für Daten, die von UQ Solar erhalten wurden.
Die hergestellten Daten von PVWatts ähneln ähnlich wie folgt:
| Zeit | Tamb | WSPD | Leistung |
|---|---|---|---|
| 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 |
Es kann über die öffentliche PVWATTS -API erhalten werden. Um einen API -Schlüssel zu erhalten, müssen Sie sich im NREL -Entwicklernetzwerk anmelden. Der API -Schlüssel muss dann in die Umgebungsvariable PVWATTS_API_KEY eingefügt werden. Alternativ können Sie es direkt in Pvwatts einfügen. Wenn dies erledigt ist, können Sie verwenden
from importers import pvwatts
data = pvwatts . load () Dies ruft die API auf und analysiert das Ergebnis als Pandas -Datenrahmen, das an die Prognosemodule übergeben werden kann. Sie können auch die folgenden optionalen Parameter übergeben, um sie zu load :
Informationen zu diesen Parametern finden Sie in der Beschreibung der PVWATTS V6 API. Alle Parameter haben Standardwerte, sodass das Aufrufen der Methode ohne Parameter ebenfalls möglich ist. Die Rückgabedaten werden mit einem DateTimeIndex indiziert. Da PVWatts keine Daten angeben, aber immer Daten für ein ganzes Jahr zurückgeben, wird das Jahr 2019 für jeden von diesem Modul zurückgegebenen Datenrahmen festgelegt.
Wenn Sie eine PVWATTS -JSON -Antwort in einer JSON -Datei gespeichert haben, können Sie diese Datei auch mit der folgenden Convenience -Methode direkt analysieren:
pvwatts . load_from_json ( 'filepath.json' )Die hergestellten Daten aus dem UQ Solar Live -Feed ähneln ähnlich wie folgt:
| Zeit | AirTemp | Luftfeuchtigkeit | Windgeschwindigkeit | Winddirektion | Leistung |
|---|---|---|---|---|---|
| 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 |
Es kann auf der Live -Feed -Website heruntergeladen werden. Wählen Sie eine PV Site und ein PV Array aus der Seitenleiste rechts. Klicken Sie dann auf Download Data und laden Sie dann Download Daily Logs . Von dort aus können Sie einen Datumsbereich angeben (ich empfehle ein Jahr) und dann eine Power & Energy -Datei sowie eine Weather herunterladen. Stellen Sie sicher, dass Sie beide mit angegebenen Datumsbereichen herunterladen.
Jetzt können Sie verwenden
from importers import uq
data = uq . load ( 'power_file.csv' , 'weather_file.csv' ) und ersetzen Sie beide Parameter mit den Dateipfaden für jede jeweilige Datei. Die load kombiniert beide Dateien erneut zu einem PANDAS -Datenframe, der an ein Prognosemodul übergeben wird.
Nachdem ein Datenrahmen mit Funktionen und Stromdaten vorhanden ist, können Sie Prognosen erstellen. Beide Importeure geben einen Datenrahmen zurück, der unterschiedliche Merkmale aufweist, beide haben jedoch eine power -Spalte, die die Leistungsausgabe darstellt.
Da die Daten beider Importeure einen DateTimeIndex haben, kann sie in Schulungen und Testen wie folgt aufgeteilt werden:
training_data = data [ '20190601' : '20190607' ] # first week of june 2019
testing_data = data [ '20190608' : '20190614' ] # second week of june 2019 Hier werden die Daten implizit von Saiten umgewandelt. Zum Beispiel zeigt '20190601' 2019/06/01 oder 01. Juni 2019.
Dieser Algorithmus verwendet die SCIKIT-Learn-Implementierung von SVR, die auf LIBSVM basiert. Um es zu verwenden, ist die folgende Klasse verfügbar:
from predictors . svr_model import SVRModelEine Vorhersage machen, ohne die Daten zu skalieren:
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 Das herausfilterte power aus dem Rahmen testing_data ist nicht erforderlich. Die SVRModel -Klasse tut dies automatisch. Optional ist es möglich, filter=['airtemp', 'humidity'] zu übergeben oder ähnlich zu fit , um die für die Prognose verwendeten Merkmale einzuschränken. Es ist nicht erforderlich, die Daten so manuell auf diese Weise zu filtern.
Die SVR -Variablen kernel , C , gamma und epsilon sind alle optional, alle haben Standardwerte.
Damit das Modell die Daten vor der Anwendung der Regression skalieren kann, können Sie den Skalierungsparameter auf True festlegen (dies ist der Standardwert):
model = svr_model ( base_data = data , scaling = True ) Auf diese Weise müssen Sie base_data angeben, die für ein weiteres Jahr ein Datensatz sein kann. Dies wird nicht zur Regression verwendet, ausschließlich zur Anpassung eines realisierbaren scaler . Weitere Informationen zu diesem Informationen finden Sie in der StandARTSCALER-Implementierung von Scikit-Learn.
Dieser Algorithmus nutzt das PMDarima-Paket (ehemals Pyramid-Arima). Es kann durch Importieren der erforderlichen Klasse verwendet werden:
from predictors . arima_model import ARIMAModelUm nun eine Vorhersage zu machen, ohne exogene Variablen zu verwenden, machen Sie Folgendes:
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 Die Bereitstellung von Testmerkmalen ist nicht erforderlich, da das Modell ohne exogene Variablen angepasst wurde. In diesem Fall verfügt der zurückgegebene Datenrahmen nur über eine power -Spalte. Die order gibt die (p,d,q) Parameter des Modells an. Der seasonal_order gibt die (P,D,Q,s) Parameter an. Der Skalierungsparameter kann beim Erstellen des Modells festgelegt werden. Standardmäßig ist es auf True festgelegt, kann jedoch nicht festgelegt werden mit:
model = ARIMAModel ( scaling = false )Wenn Sie exogene Variablen hinzufügen möchten, setzen Sie diesen Parameter fest:
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 ) Auf diese Weise müssen Sie bei Vorhersage testing_data angeben. Die power -Spalte wird beim tatsächlichen Vorhersage automatisch entfernt. Der Vorhersagedatenrahmen hat nun die Spalten testing_data, in denen die power -Spalte die vorhergesagten Werte enthält.
Wenn Sie den Algorithmus automatisch entsprechend geeignete p, q, P and Q -Parameter finden möchten, verwenden Sie den folgenden Aufruf:
model . fit_auto ( training_data , p = ( 0 , 5 ), q = ( 0 , 5 ), P = ( 0 , 5 ), Q = ( 0 , 5 ), d = 1 , D = 1 ) Die Tupel definieren Bereiche, in denen der Algorithmus nach optimalen Parametern sucht. Das d und D können ausgelassen werden, um diese Parameter automatisch zu bestimmen. Wie bei der fit wird use_exogenous standardmäßig auf True eingestellt, kann aber auch als False angegeben werden.
Da es mit dem SVRModel möglich ist, können Sie auch ein Filterarray fit und fit_auto übergeben, um zu beschränken, welche Funktionen in den Prognoseprozess enthalten sein sollten.