Freigeben über


Tutorial: Verknüpfen von Sensordaten mit Wettervorhersagedaten unter Verwendung von Jupyter-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:

  • Erstellen und Ausführen eines Jupyter Notebooks in VS Code
  • 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

Hinweis

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

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.

Installieren von Paketen auf Projektebene

Das Projekt EV Routing and Reachable Range ist von den Python-Bibliotheken aiohttp und IPython abhängig. Sie können diese im Visual Studio-Terminal mit pip installieren:

pip install aiohttp
pip install ipython
pip install pandas

Öffnen von Jupyter Notebook in Visual Studio Code

Laden Sie das Notebook herunter, das in diesem Tutorial verwendet wird, und öffnen Sie es:

  1. Öffnen Sie die Datei weatherDataMaps.ipynb im AzureMapsJupyterSamples-Repository in GitHub.

  2. Wählen Sie auf dem Bildschirm oben rechts die Schaltfläche Rohdatei herunterladen aus, um die Datei lokal zu speichern.

    Bildschirmfoto zum Herunterladen der Notebook-Datei namens „weatherDataMaps.ipynb“ aus dem GitHub-Repository

  3. Öffnen Sie das heruntergeladene Notebook in Visual Studio Code, indem Sie mit der rechten Maustaste auf die Datei klicken und dann Öffnen mit > Visual Studio Code auswählen, oder verwenden Sie den VS Code-Explorer.

Laden der erforderlichen Module und Frameworks

Sobald Ihr Code hinzugefügt wurde, können Sie eine Zelle über das Symbol Ausführen links neben der Zelle ausführen. Die Ausgabe wird unterhalb der Codezelle angezeigt.

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

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

Bildschirmfoto zum Herunterladen der ersten Zelle im Notebook, die die erforderlichen Importanweisungen enthält, mit hervorgehobener Schaltfläche „Ausführen“

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

Bildschirmfoto von Turbinenstandorten auf einer Karte

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

Gruppierte Daten

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.

Bildschirmfoto von Windgeschwindigkeitsdiagrammen

Bildschirmfoto von Windrichtungsdiagrammen

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.

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.

Nächste Schritte