Ce référentiel contient deux implémentations alternatives pour prévoir la prédiction de puissance photovoltaïque basée sur les données météorologiques. Il a été développé pour ma thèse de baccalauréat qui compare ces deux approches. Deux sources de données servent de données d'échantillonnage météorologiques et de sortie.
Je recommande à PIPENV de configurer le projet. Avec PiPenv installé, exécutez pipenv install à partir de la racine du projet et il installera toutes les dépendances nécessaires. Utilisez ensuite pipenv shell pour entrer le shell où toutes les dépendances seront disponibles ou simplement pipenv run <command> pour exécuter une commande spécifique.
Si vous n'utilisez pas PIPENV, les dépendances sont spécifiées dans le PipFile et les versions que j'utilise peuvent être trouvées dans PipFile.lock.
Pour utiliser le service PVWATTS décrit plus loin, vous devez obtenir une clé API. Ensuite, vous devez le définir comme variable d'environnement (ou le mettre directement dans le code). Si vous utilisez PIPENV, cela peut être fait dans un fichier .env .
Des exemples sur la façon d'utiliser le projet peuvent être trouvés dans l'exemple de fichiers du répertoire racine. Vous pouvez exécuter directement ces fichiers après avoir terminé les étapes nécessaires pour obtenir les données décrites dans la section suivante.
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
Pour comploter avec Matplotlib, Pandas émet un avertissement futur, donc j'ai mis la ligne suivante après les importations:
from pandas . plotting import register_matplotlib_converters ; register_matplotlib_converters ()Il existe deux données de données pour lesquelles un importateur est disponible qui analyse les données au bon format. Bien sûr, il est également possible d'utiliser d'autres sources. Tout d'abord, il y a un emballage PVWATTS et deuxièmement pour les données obtenues auprès d'UQ Solar.
Les données préparées de PVWATTS ressemblent à ceci:
| temps | tambour | WSPD | pouvoir |
|---|---|---|---|
| 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 |
Il peut être obtenu via l'API public PVWATTS. Afin d'obtenir une clé API, vous devez vous inscrire au réseau de développeurs NREL. La touche API doit ensuite être placée dans la variable d'environnement PVWATTS_API_KEY . Alternativement, vous pouvez l'insérer directement dans PVWATTS. Lorsque cela est fait, vous pouvez utiliser
from importers import pvwatts
data = pvwatts . load () Cela appelle l'API et analyse le résultat en tant que Pandas DataFrame qui peut être transmis aux modules de prévision. Vous pouvez également transmettre les paramètres facultatifs suivants pour load :
Pour plus d'informations sur ces paramètres, veuillez vous référer à la description de l'API PVWATTS V6. Tous les paramètres ont des valeurs par défaut, donc appeler la méthode sans paramètres est également possible. Les données de retour sont indexées à l'aide d'un DateTimeIndex. Étant donné que PVWATTS ne spécifie pas les dates mais renvoie toujours des données pour une année entière, l'année 2019 sera définie fixe pour chaque dataframe renvoyé de ce module.
Si vous avez une réponse JSON PVWATTS enregistrée dans un fichier JSON, il est également possible d'analyser ce fichier directement en utilisant la méthode de commodité suivante:
pvwatts . load_from_json ( 'filepath.json' )Les données préparées de l'UQ Solar Live Feed ressemble à ceci:
| temps | AirTemp | humidité | vitesse | direction de vent | pouvoir |
|---|---|---|---|---|---|
| 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 |
Il peut télécharger sur le site Web Live Feed. Choisissez un PV Site et un PV Array dans la barre latérale à droite. Cliquez ensuite sur Download Data , puis Download Daily Logs . De là, vous pouvez spécifier une plage de dates (je recommande une année), puis télécharger un fichier Power & Energy ainsi qu'un fichier Weather . Assurez-vous de télécharger les deux avec les mêmes gammes de dates spécifiées.
Maintenant vous pouvez utiliser
from importers import uq
data = uq . load ( 'power_file.csv' , 'weather_file.csv' ) et remplacer les deux paramètres par les chemins de fichier pour chaque fichier respectif. La méthode load combine à nouveau les deux fichiers dans un Pandas DataFrame, prêt à être transmis à un module de prévision.
Maintenant, une dataframe avec des fonctionnalités et des données d'alimentation est présente, vous pouvez faire des prévisions. Les deux importateurs renvoient un DataFrame qui a des fonctionnalités différentes, mais les deux ont une colonne power qui représente la puissance de sortie.
Étant donné que les données des deux importateurs ont un DatetimeIndex, elles peuvent être divisées en une formation et tester des données comme celle-ci:
training_data = data [ '20190601' : '20190607' ] # first week of june 2019
testing_data = data [ '20190608' : '20190614' ] # second week of june 2019 Ici, les dates sont converties implicitement des chaînes. Par exemple, '20190601' représente 2019/06/01 ou le 1er juin 2019.
Cet algorithme utilise l'implémentation Scikit-Learn de SVR qui est basé sur libsvm. Pour l'utiliser, la classe suivante est disponible:
from predictors . svr_model import SVRModelFaire une prédiction sans mettre à l'échelle les données:
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 Le filtrage de la colonne power de la trame testing_data n'est pas nécessaire, la classe SVRModel le fait automatiquement. Facultativement, il est possible de passer filter=['airtemp', 'humidity'] ou similaire à fit pour restreindre les fonctionnalités utilisées pour la prévision. Il n'est pas nécessaire de filtrer les données manuellement de cette façon.
Le kernel des variables SVR, C , gamma et epsilon sont tous facultatifs, ils ont tous des valeurs par défaut.
Pour permettre au modèle d'étendre les données avant d'appliquer la régression, vous pouvez définir le paramètre de mise à l'échelle sur True (c'est la valeur par défaut):
model = svr_model ( base_data = data , scaling = True ) De cette façon, vous devez spécifier base_data qui peut être un ensemble de données pour une autre année. Cela ne sera pas utilisé pour la régression, uniquement pour ajuster un objet scaler réalisable. Pour plus d'informations à ce sujet, reportez-vous à la mise en œuvre de StandartScaler de Scikit-Learn.
Cet algorithme utilise le package PMDArima (anciennement Pyramid-Arima). Il peut être utilisé en important la classe nécessaire:
from predictors . arima_model import ARIMAModelMaintenant, pour faire une prédiction sans utiliser de variables exogènes, faites ce qui suit:
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 La fourniture de caractéristiques de test n'est pas nécessaire car le modèle était ajusté sans variables exogènes. Dans ce cas, le DataFrame retourné n'aura qu'une colonne power . L' order spécifie les paramètres (p,d,q) du modèle. Le seasonal_order spécifie les paramètres (P,D,Q,s) . Le paramètre de mise à l'échelle peut être défini lors de la création du modèle, par défaut, il est défini sur True , mais il peut être inférieur à:
model = ARIMAModel ( scaling = false )Si vous souhaitez ajouter des variables exogènes, définissez ce paramètre:
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 ) De cette façon, vous devez spécifier testing_data lors de la prévision. La colonne power sera automatiquement supprimée lors de la prédiction réelle. La prédiction DataFrame aura désormais les colonnes TEST_DATA où la colonne power contient les valeurs prévues.
Si vous souhaitez laisser l'algorithme trouver automatiquement les paramètres p, q, P and Q appropriés utilisez l'appel suivant:
model . fit_auto ( training_data , p = ( 0 , 5 ), q = ( 0 , 5 ), P = ( 0 , 5 ), Q = ( 0 , 5 ), d = 1 , D = 1 ) Les tuples définissent les plages dans lesquelles l'algorithme recherchera des paramètres optimaux. Les d et D peuvent être omis pour déterminer automatiquement ces paramètres. Comme pour la méthode fit , use_exogenous sera défini sur True par défaut, mais peut également être spécifié pour être False .
Comme il est possible avec le SVRModel , vous pouvez également transmettre un réseau de filtre pour fit et fit_auto pour restreindre les fonctionnalités qui doivent être incluses dans le processus de prévision.