Delen via


Tutorial: Combineer sensorgegevens met weersvoorspellingsgegevens met behulp van Jupyter Notebooks (Python)

Windenergie is een alternatieve energiebron voor fossiele brandstoffen om klimaatverandering tegen te gaan. Omdat wind van nature niet consistent is, moeten windenergie-operators machine learning (ML)-modellen bouwen om de windenergiecapaciteit te voorspellen. Deze voorspelling is noodzakelijk om aan de elektriciteitsvraag te voldoen en de stabiliteit van het net te waarborgen. In deze tutorial laten we zien hoe Azure Maps-weersvoorspellingsgegevens worden gecombineerd met demogegevens voor weersmetingen. Weersvoorspellingsgegevens worden aangevraagd door Azure Maps Weather-service aan te roepen.

In deze tutorial, zul je:

  • Maak en voer een Jupyter Notebook in VS Code uit.
  • Laad demogegevens uit bestand.
  • Roep REST API's van Azure Maps aan in Python.
  • Breng locatiegegevens in kaart.
  • Verrijk de demogegevens met Azure Maps Daily Forecast-weergegevens.
  • Visualiseer voorspellingsgegevens in grafieken.

Opmerking

Het Jupyter notebook-bestand voor dit project kan worden gedownload van de Weather Maps Jupyter Notebook repository.

Vereiste voorwaarden

Als je geen Azure-abonnement hebt, maak dan een gratis account aan voordat je begint.

Opmerking

Voor meer informatie over authenticatie in Azure Maps, zie authenticatie beheren in Azure Maps.

Installeer projectniveau pakketten

Het EV Routing and Reachable Range project heeft afhankelijkheden van de aiohttp en IPython python-bibliotheken. Je kunt deze installeren in de Visual Studio-terminal met behulp van pip:

pip install aiohttp
pip install ipython
pip install pandas

Open Jupyter-notitieblok in Visual Studio Code

Downloaden en vervolgens openen van het Notebook dat in deze tutorial wordt gebruikt.

  1. Open het bestand weatherDataMaps.ipynb in de AzureMapsJupyterSamples repository op GitHub.

  2. Klik op de Download raw file knop in de rechterbovenhoek van het scherm om het bestand lokaal op te slaan.

    Een screenshot die toont hoe je het Notebook-bestand met de naam weatherDataMaps.ipynb van de GitHub repository kunt downloaden.

  3. Open het gedownloade Notebook in Visual Studio Code door met de rechtermuisknop op het bestand te klikken en vervolgens Openen met > Visual Studio Code te kiezen, of via de VS Code File Explorer.

Laad de vereiste modules en frameworks

Zodra uw code is toegevoegd, kunt u een cel uitvoeren met behulp van het Run icoon links van de cel en wordt de output onder de codecel weergegeven.

Voer het volgende script uit om alle vereiste modules en frameworks te laden.

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

Een screenshot die laat zien hoe de eerste cel in het notebook kan worden gedownload, met de vereiste importinstructies en de uitvoerknop gemarkeerd.

Weergegevens importeren

Deze handleiding gebruikt weergegevens van sensoren die zijn geïnstalleerd op vier verschillende windturbines. De voorbeeldgegevens bestaan uit 30 dagen aan weersaflezingen. Deze metingen worden verzameld uit weergegevenscentra in de buurt van elke turbinelocatie. De demo-gegevens bevatten gegevensmetingen voor temperatuur, windsnelheid en richting. U kunt de demogegevens die zijn opgenomen in weather_dataset_demo.csv downloaden van GitHub. Het script hieronder importeert demogegevens in de Azure Notebook.

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

Vraag dagelijkse weersvoorspellingen aan

In ons scenario willen we graag een dagelijkse voorspelling aanvragen voor elke sensorlocatie. Het volgende script roept de Daily Forecast-API van de Azure Maps Weather-service aan. Deze API geeft weersvoorspellingen voor elke windturbine, voor de komende 15 dagen vanaf de huidige datum.

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 service 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={}&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()

Het volgende script geeft de locaties van de turbines weer op de kaart door gebruik te maken van de Get Map Image service.

# 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?subscription-key={}&api-version=2024-04-01&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))

Een screenshot die de locaties van turbines op een kaart toont.

Groepeer de prognosegegevens met de demogegevens op basis van het station-ID. Het station-ID is voor het weergegevenscentrum. Deze groepering breidt de demo-gegevens uit met de prognosegegevens.

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

De onderstaande tabel toont de gecombineerde historische en prognosegegevens voor een van de locaties van de turbines.

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

Gegroepeerde gegevens

Voorspellingsgegevens plotten

Zet de voorspelde waarden uit tegen de dagen waarvoor ze zijn voorspeld. Deze grafiek stelt ons in staat om de snelheids- en richtingsveranderingen van de wind voor de komende 15 dagen te zien.

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

De volgende grafieken visualiseren de prognosegegevens. Voor de verandering van windsnelheid, zie de linker grafiek. Voor verandering in windrichting, zie het rechter grafiek. Deze gegevens zijn een voorspelling voor de komende 15 dagen vanaf de dag dat de gegevens worden opgevraagd.

Een screenshot die windsnelheidsgrafieken toont.

Een screenshot met windrichtinggrafieken.

In deze tutorial heb je geleerd hoe je Azure Maps REST API's aanspreekt om weerverwachtingsgegevens te verkrijgen. Je hebt ook geleerd hoe je de gegevens op grafieken kunt visualiseren.

** Om de Azure Maps API's te verkennen die in deze tutorial worden gebruikt, zie:

Voor een volledige lijst van de Azure Maps REST API's, zie Azure Maps REST API's.

Volgende stappen