Samouczek: dołączanie danych czujników przy użyciu danych prognozy pogody przy użyciu usługi Azure Notebooks (Python)

Energia wiatrowa jest jednym alternatywnym źródłem energii dla paliw kopalnych w walce ze zmianami klimatycznymi. Ponieważ wiatr nie jest spójny z natury, operatorzy energii wiatrowej muszą tworzyć modele uczenia maszynowego (ML), aby przewidzieć moc wiatrową. Ta prognoza jest niezbędna do zaspokojenia zapotrzebowania na energię elektryczną i zapewnienia stabilności sieci. W tym samouczku omówimy sposób, w jaki dane prognozy pogody na platformie Azure Mapy są łączone z danymi demonstracyjnymi dotyczącymi odczytów pogody. Dane prognozy pogody są wymagane przez wywołanie usługi Azure Mapy Weather Services.

Ten samouczek obejmuje następujące kroki:

  • Praca z plikami danych w usłudze Azure Notebooks w chmurze.
  • Załaduj dane pokazowe z pliku.
  • Wywoływanie interfejsów API REST usługi Azure Mapy w języku Python.
  • Renderuj dane lokalizacji na mapie.
  • Wzbogacanie danych demonstracyjnych za pomocą danych pogodowych usługi Azure Mapy Daily Forecast.
  • Wykreślij dane prognozy na wykresach.

Wymagania wstępne

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

Uwaga

Aby uzyskać więcej informacji na temat uwierzytelniania w usłudze Azure Mapy, zobacz Zarządzanie uwierzytelnianiem w usłudze Azure Mapy.

Aby zapoznać się z notesami platformy Azure i dowiedzieć się, jak rozpocząć pracę, postępuj zgodnie z instrukcjami Tworzenie notesu platformy Azure.

Uwaga

Plik notesu Jupyter dla tego projektu można pobrać z repozytorium Weather Mapy Jupyter Notebook.

Ładowanie wymaganych modułów i struktur

Aby załadować wszystkie wymagane moduły i struktury, uruchom następujący skrypt:

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

Importowanie danych pogodowych

W tym samouczku używane są odczyty danych pogodowych z czujników zainstalowanych w czterech różnych turbinach wiatrowych. Przykładowe dane składają się z 30 dni odczytów pogody. Odczyty te są zbierane z centrów danych pogodowych w pobliżu każdej lokalizacji turbiny. Dane pokazowe zawierają odczyty danych dla temperatury, prędkości wiatru i kierunku. Dane demonstracyjne zawarte w weather_dataset_demo.csv można pobrać z witryny GitHub. Poniższy skrypt importuje dane demonstracyjne do usługi Azure Notebook.

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

Żądanie codziennych danych prognozy

W naszym scenariuszu chcemy zażądać dziennej prognozy dla każdej lokalizacji czujnika. Poniższy skrypt wywołuje interfejs API Daily Forecast usług Azure Mapy Weather Services. Ten interfejs API zwraca prognozę pogody dla każdej turbiny wiatrowej w ciągu najbliższych 15 dni od bieżącej daty.

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

Poniższy skrypt renderuje lokalizacje turbin na mapie przez wywołanie usługi 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

Grupuj dane prognozy przy użyciu danych demonstracyjnych na podstawie identyfikatora stacji. Identyfikator stacji jest przeznaczony dla centrum danych pogodowych. To grupowanie rozszerza dane demonstracyjne przy użyciu danych prognozy.

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

W poniższej tabeli przedstawiono połączone dane historyczne i prognozowane dla jednej z lokalizacji turbiny.

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

Grouped data

Wykreślij dane prognozy

Wykreślij prognozowane wartości w stosunku do dni, dla których są one prognozowane. Ten wykres pozwala nam zobaczyć zmiany prędkości i kierunku wiatru przez następne 15 dni.

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

Poniższe wykresy wizualizują dane prognozy. Aby uzyskać informacje o zmianie prędkości wiatru, zobacz lewy wykres. Aby uzyskać informacje o zmianie kierunku wiatru, zobacz prawy wykres. Te dane są przewidywane przez następne 15 dni od dnia żądania danych.

Wind speed plotWind direction plot

W tym samouczku przedstawiono sposób wywoływania interfejsów API REST usługi Azure Mapy w celu uzyskania danych prognozy pogody. Przedstawiono również sposób wizualizowania danych na wykresach.

Aby dowiedzieć się więcej na temat wywoływania interfejsów API REST usługi Azure Mapy w usłudze Azure Notebooks, zobacz Routing EV przy użyciu usługi Azure Notebooks.

Aby zapoznać się z interfejsami API usługi Azure Mapy używanymi w tym samouczku, zobacz:

Aby uzyskać pełną listę interfejsów API REST usługi Azure Mapy, zobacz Interfejsy API REST usługi Azure Mapy.

Czyszczenie zasobów

Nie ma żadnych zasobów, które wymagają czyszczenia.

Następne kroki

Aby dowiedzieć się więcej o usłudze Azure Notebooks, zobacz