Partager via


Tutoriel : Joindre des données de capteur à des données de prévisions météorologiques avec Azure Notebooks (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.

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

Ouvrez Jupyter Notebook dans Visual Studio Code.

Téléchargez puis ouvrez le notebook utilisé dans ce tutoriel :

  1. Ouvrez le fichier weatherDataMaps.ipynb du référentiel AzureMapsJupyterSamples dans GitHub.

  2. Sélectionnez le bouton Télécharger le fichier brut dans le coin supérieur droit de l’écran pour enregistrer le fichier localement.

    Capture d’écran montrant comment télécharger le fichier du notebook nommé weatherDataMaps.ipynb à partir du référentiel GitHub.

  3. 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

Capture d’écran montrant comment télécharger la première cellule du notebook contenant les instructions d’importation requises avec le bouton Exécuter mis en évidence.

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&center={},{}&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))

Une capture d’écran montrant les emplacements des turbines sur une carte.

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()

Données groupées

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.

Une capture d’écran montrant les tracés de la vitesse du vent.

Une capture d’écran montrant les tracés de la direction du vent.

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.

Étapes suivantes