Tutorial: Verknüpfen von Sensordaten mit Wettervorhersagedaten unter Verwendung von Azure Notebooks (Python)

Windenergie ist eine alternative Energiequelle zu fossilen Brennstoffen im Kampf gegen den Klimawandel. Da der Wind von Natur aus nicht immer gleich stark ist, müssen Betreiber von Windenergieanlagen Machine Learning-Modelle (ML) erstellen, um die Windenergiekapazität vorherzusagen. Diese Vorhersage ist erforderlich, um die Nachfrage nach Strom erfüllen und die Netzstabilität sicherstellen zu können. In diesem Tutorial wird Schritt für Schritt beschrieben, wie die Daten der Azure Maps-Wettervorhersage mit Demodaten für Wettermesswerte kombiniert werden. Wettervorhersagedaten werden durch Aufrufen des Azure Maps-Wetterdiensts angefordert.

In diesem Lernprogramm lernen Sie Folgendes:

  • Verwenden von Datendateien in Azure Notebooks in der Cloud
  • Laden von Demodaten aus einer Datei
  • Aufrufen von Azure Maps-REST-APIs in Python
  • Rendern von Standortdaten auf der Karte
  • Anreichern der Demodaten mit Azure Maps-Wetterdaten vom Typ Tägliche Vorhersage
  • Zeichnen von Vorhersagedaten in Diagrammen

Voraussetzungen

Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

Hinweis

Weitere Informationen zur Authentifizierung in Azure Maps finden Sie unter Verwalten der Authentifizierung in Azure Maps.

Unter Erstellen eines Azure-Notebooks können Sie sich mit Azure-Notebooks und mit den ersten Schritten vertraut machen.

Hinweis

Die Jupyter Notebook-Datei für dieses Projekt kann aus dem Jupyter Notebook-Repository für Wetterkarten heruntergeladen werden.

Laden der erforderlichen Module und Frameworks

Führen Sie das folgende Skript aus, um alle erforderlichen Module und Frameworks zu laden:

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

Importieren von Wetterdaten

In diesem Tutorial werden Messwerte für Wetterdaten verwendet, die von an vier verschiedenen Windkraftanlagen montierten Sensoren stammen. Die Beispieldaten enthalten die Wettermesswerte für 30 Tage. Diese Messwerte werden über Wetterdatenzentren erfasst, die sich in der Nähe der einzelnen Windkraftstandorte befinden. In den Demodaten sind Messwerte für Temperatur, Windgeschwindigkeit und Windrichtung enthalten. Sie können die Demodaten in weather_dataset_demo.csv von GitHub herunterladen. Das folgende Skript importiert Demodaten in das Azure-Notebook:

df = pd.read_csv("./data/weather_dataset_demo.csv")

Anfordern täglicher Vorhersagedaten

In unserem Szenario möchten wir eine tägliche Vorhersage für jeden Sensorstandort anfordern. Mit dem folgenden Skript wird die API für tägliche Vorhersagen des Azure Maps-Wetterdiensts aufgerufen. Diese API gibt für jede Windkraftanlage Wettervorhersagen für die nächsten 15 Tage ab dem aktuellen Datum zurück.

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

Das folgende Skript ruft den Dienst zum Abrufen von Kartenbildern auf, um die Anlagenstandorte auf der Karte zu rendern.

# 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

Gruppieren Sie die Vorhersagedaten basierend auf der Stationskennung mit den Demodaten. Die Stationskennung gilt für das Wetterrechenzentrum. Mit dieser Gruppierung werden die Demodaten um die Vorhersagedaten erweitert.

# 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'])

Die folgende Tabelle enthält die kombinierten historischen und vorhergesagten Daten für einen der Anlagenstandorte:

# Display data for first location
grouped_weather_data.get_group(station_ids[0]).reset_index()

Grouped data

Zeichnen von Vorhersagedaten

Stellen Sie die vorhergesagten Werte anhand der Vorhersagetage dar. Hieran können wir erkennen, wie sich die Geschwindigkeit und die Richtung des Winds in den nächsten 15 Tagen ändern wird.

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

In der folgenden Grafik werden die Vorhersagedaten visualisiert. Informationen zur Änderung der Windgeschwindigkeit finden Sie im linken Diagramm. Informationen zur Änderung der Windrichtung finden Sie im rechten Diagramm. Diese Daten enthalten die Vorhersage für die nächsten 15 Tage ab dem Anforderungstag der Daten.

Wind speed plotWind direction plot

In diesem Tutorial haben Sie gelernt, wie Sie Azure Maps-REST-APIs aufrufen, um Wettervorhersagedaten zu erhalten. Außerdem wurde gezeigt, wie Sie die Daten in Diagrammen visualisieren.

Weitere Informationen zum Aufrufen von Azure Maps-REST-APIs in Azure Notebooks finden Sie unter Tutorial: Routenplanung für Elektrofahrzeuge mit Azure Notebooks (Python).

Informationen zu den in diesem Tutorial verwendeten Azure Maps-APIs finden Sie unter:

Eine vollständige Liste mit den Azure Maps-REST-APIs finden Sie unter Azure Maps-Dokumentation.

Bereinigen von Ressourcen

Es sind keine zu bereinigenden Ressourcen vorhanden.

Nächste Schritte

Weitere Informationen zu Azure Notebooks finden Sie hier