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 :

  • Utiliser des fichiers de données dans Azure Notebooks, dans le cloud.
  • 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.

Prérequis

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Notes

Pour plus d’informations sur l’authentification dans Azure Maps, voir Gérer l’authentification dans Azure Maps.

Pour vous familiariser avec les notebooks Azure et commencer à les utiliser, suivez les instructions fournies dans Créer un notebook Azure.

Notes

Vous pouvez télécharger le fichier de notebook Jupyter de ce projet à partir du dépôt Jupyter Notebook Weather Maps.

Charger les modules et les frameworks nécessaires

Pour charger tous les modules et frameworks exigés, exécutez le script suivant :

import pandas as pd
import datetime
from IPython.display import Image, display
!pip install aiohttp
import aiohttp

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

Turbine locations

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

Grouped data

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.

Wind speed plotWind direction plot

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 en savoir plus sur l’appel des API REST Azure Maps dans Azure Notebooks, consultez Router les véhicules électriques avec Azure Notebooks.

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.

Nettoyer les ressources

Aucune ressource ne nécessite un nettoyage.

Étapes suivantes

Pour en savoir plus sur Azure Notebooks, consultez