Tutoriel : Joindre les données des capteurs aux données des prévisions météorologiques en utilisant les carnets Jupyter (Python)
L’énergie éolienne est une alternative aux énergies fossiles qui permet de lutter contre le changement climatique. Étant donné que le vent n’est, par nature, pas constant, les opérateurs éoliens doivent créer des modèles Machine Learning (ML) pour prédire la capacité d’énergie éolienne. Cette prédiction est nécessaire pour répondre à la demande en électricité et garantir la stabilité du réseau électrique. Dans ce tutoriel, nous allons voir comment les données de prévisions météorologiques Azure Maps sont combinées avec des données de démonstration concernant des relevés météorologiques. Les données de prévisions météorologiques peuvent être demandées en appelant les services Azure Maps Weather.
Ce didacticiel présente les procédures suivantes :
- Créer et exécuter un notebook Jupyter dans VSCode.
- Charger les données de démonstration à partir d’un fichier.
- Appeler les API REST Azure Maps en Python.
- Afficher les données d’emplacement sur la carte.
- Enrichissez les données de démonstration avec les données météorologiques issues de l’API Daily Forecast d’Azure Maps.
- Créez des graphiques à partir des données de prévisions.
Remarque
Vous pouvez télécharger le fichier de notebook Jupyter de ce projet à partir du dépôt Jupyter Notebook Weather Maps.
Prérequis
Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.
- Compte Azure Maps
- Clé d’abonnement
- Visual Studio Code
- Une connaissance pratique des Jupyter Notebook dans VS Code
- Environnement configuré pour fonctionner avec Python dans des Jupyter Notebooks. Pour plus d’informations, consultez Configuration de votre environnement.
Remarque
Pour plus d’informations sur l’authentification dans Azure Maps, voir Gérer l’authentification dans Azure Maps.
Installer des packages au niveau du projet
Le projet EV Routing and Reachable Range (Routage et distance atteignable pour des véhicules électriques) a des dépendances vis-à-vis des bibliothèques Python aiohttp et IPython. Vous pouvez les installer dans le terminal Visual Studio en utilisant pip :
pip install aiohttp
pip install ipython
pip install pandas
Ouvrir Jupyter Notebook dans Visual Studio Code
Téléchargez puis ouvrez le notebook utilisé dans ce tutoriel :
Ouvrez le fichier weatherDataMaps.ipynb du référentiel AzureMapsJupyterSamples dans GitHub.
Sélectionnez le bouton Télécharger le fichier brut dans le coin supérieur droit de l’écran pour enregistrer le fichier localement.
Ouvrez le notebook téléchargé dans Visual Studio Code en cliquant avec le bouton droit sur le fichier, puis en sélectionnant Ouvrir avec > Visual Studio Code, ou via l’Explorateur de fichiers de VS Code.
Charger les modules et les frameworks nécessaires
Une fois votre code ajouté, vous pouvez exécuter une cellule en utilisant l’icône Exécuter à gauche de la cellule ; la sortie est affichée sous la cellule de code.
Exécutez le script suivant pour charger tous les modules et frameworks requis.
import aiohttp
import pandas as pd
import datetime
from IPython.display import Image, display
Importer des données météorologiques
Ce tutoriel utilise les relevés de données météorologiques obtenus à partir de capteurs installés sur quatre éoliennes différentes. Les exemples de données sont constitués de relevés météorologiques effectués sur une période de 30 jours. Ces relevés sont collectés par des centres de données météorologiques situés à proximité de chaque éolienne. Les données de démonstration contiennent des données de relevés relatives à la température, à la vitesse du vent et à la direction du vent. Vous pouvez télécharger les données de démonstration contenues dans weather_dataset_demo.csv depuis GitHub. Le script ci-dessous importe les données de démonstration dans le notebook Azure.
df = pd.read_csv("./data/weather_dataset_demo.csv")
Demander des données de prévisions quotidiennes
Dans notre scénario, nous souhaitons demander des prévisions quotidiennes pour chaque emplacement de capteur. Le script suivant appelle l’API Daily Forecast (prévisions quotidiennes) des services Azure Maps Weather. Cette API retourne les prévisions météorologiques pour chaque éolienne, pour les 15 prochains jours à compter de la date actuelle.
subscription_key = "Your Azure Maps key"
# Get a lists of unique station IDs and their coordinates
station_ids = pd.unique(df[['StationID']].values.ravel())
coords = pd.unique(df[['latitude','longitude']].values.ravel())
years,months,days = [],[],[]
dates_check=set()
wind_speeds, wind_direction = [], []
# Call azure maps Weather services to get daily forecast data for 15 days from current date
session = aiohttp.ClientSession()
j=-1
for i in range(0, len(coords), 2):
wind_speeds.append([])
wind_direction.append([])
query = str(coords[i])+', '+str(coords[i+1])
forecast_response = await(await session.get("https://atlas.microsoft.com/weather/forecast/daily/json?query={}&api-version=1.0&subscription-key={Your-Azure-Maps-Subscription-key}&duration=15".format(query, subscription_key))).json()
j+=1
for day in range(len(forecast_response['forecasts'])):
date = forecast_response['forecasts'][day]['date'][:10]
wind_speeds[j].append(forecast_response['forecasts'][day]['day']['wind']['speed']['value'])
wind_direction[j].append(forecast_response['forecasts'][day]['day']['windGust']['direction']['degrees'])
if date not in dates_check:
year,month,day= date.split('-')
years.append(year)
months.append(month)
days.append(day)
dates_check.add(date)
await session.close()
Le script suivant affiche l’emplacement des éoliennes sur la carte en appelant le service Get Map Image.
# Render the turbine locations on the map by calling the Azure Maps Get Map Image service
session = aiohttp.ClientSession()
pins="default|la-25+60|ls12|lc003C62|co9B2F15||'Location A'{} {}|'Location B'{} {}|'Location C'{} {}|'Location D'{} {}".format(coords[1],coords[0],coords[3],coords[2],coords[5],coords[4], coords[7],coords[6])
image_response = "https://atlas.microsoft.com/map/static/png?subscription-key={Your-Azure-Maps-Subscription-key}&api-version=1.0&layer=basic&style=main&zoom=6¢er={},{}&pins={}".format(subscription_key,coords[7],coords[6],pins)
static_map_response = await session.get(image_response)
poi_range_map = await static_map_response.content.read()
await session.close()
display(Image(poi_range_map))
Regroupez les données de prévisions avec les données de démonstration en nous basant sur l’ID de station. L’ID de station correspond au centre de données météo. Ce regroupement complète les données de démonstration avec les données de prévisions.
# Group forecasted data for all locations
df = df.reset_index(drop=True)
forecast_data = pd.DataFrame(columns=['StationID','latitude','longitude','Year','Month','Day','DryBulbCelsius','WetBulbFarenheit','WetBulbCelsius','DewPointFarenheit','DewPointCelsius','RelativeHumidity','WindSpeed','WindDirection'])
for i in range(len(station_ids)):
loc_forecast = pd.DataFrame({'StationID':station_ids[i], 'latitude':coords[0], 'longitude':coords[1], 'Year':years, 'Month':months, 'Day':days, 'WindSpeed':wind_speeds[i], 'WindDirection':wind_direction[i]})
forecast_data = pd.concat([forecast_data,loc_forecast], axis=0, sort=False)
combined_weather_data = pd.concat([df,forecast_data])
grouped_weather_data = combined_weather_data.groupby(['StationID'])
Le tableau suivant contient la combinaison des données d’historique et des données de prévisions d’un emplacement d’éolienne.
# Display data for first location
grouped_weather_data.get_group(station_ids[0]).reset_index()
Créer un graphique à partir des données de prévisions
Créez un graphique comprenant les valeurs de prévisions et les jours pour lesquels elles sont prévues. Ce tracé nous permet de voir les changements de vitesse et de direction du vent pour les 15 prochains jours.
# Plot wind speed
curr_date = datetime.datetime.now().date()
windsPlot_df = pd.DataFrame({ 'Location A': wind_speeds[0], 'Location B': wind_speeds[1], 'Location C': wind_speeds[2], 'Location D': wind_speeds[3]}, index=pd.date_range(curr_date,periods=15))
windsPlot = windsPlot_df.plot.line()
windsPlot.set_xlabel("Date")
windsPlot.set_ylabel("Wind speed")
#Plot wind direction
windsPlot_df = pd.DataFrame({ 'Location A': wind_direction[0], 'Location B': wind_direction[1], 'Location C': wind_direction[2], 'Location D': wind_direction[3]}, index=pd.date_range(curr_date,periods=15))
windsPlot = windsPlot_df.plot.line()
windsPlot.set_xlabel("Date")
windsPlot.set_ylabel("Wind direction")
Les graphiques suivants permettent de visualiser les données de prévisions. Pour connaître les variations prévues concernant la vitesse du vent, consultez le graphique de gauche. Pour connaître les variations prévues concernant la direction du vent, consultez le graphique de droite. Ces données constituent une prédiction pour les 15 prochains jours à compter de la date à laquelle les données sont demandées.
Dans ce tutoriel, vous avez appris comment appeler les API REST Azure Maps pour obtenir des données de prévisions météorologiques. Vous avez également appris à visualiser ces données dans des graphiques.
Pour explorer les API Azure Maps qui sont utilisées dans ce tutoriel, consultez :
Pour obtenir la liste complète des API REST Azure Maps, consultez API REST Azure Maps.