Udostępnij za pośrednictwem


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 łączenia danych prognozy pogody usługi Azure Maps z danymi demonstracyjnymi dotyczącymi odczytów pogody. Dane prognozy pogody są wymagane przez wywołanie usług Azure Maps 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 Maps w języku Python.
  • Renderuj dane lokalizacji na mapie.
  • Wzbogacanie danych demonstracyjnych za pomocą danych pogodowych usługi Azure Maps 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 Maps, zobacz Zarządzanie uwierzytelnianiem w usłudze Azure Maps.

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 Maps 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 Weather Services w usłudze Azure Maps. 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))

Lokalizacje turbin

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

Pogrupowane dane

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.

Wykres prędkości wiatru Wykres kierunku wiatru

W tym samouczku przedstawiono sposób wywoływania interfejsów API REST usługi Azure Maps 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 Maps w usłudze Azure Notebooks, zobacz Routing EV przy użyciu usługi Azure Notebooks.

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

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

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