Udostępnij za pośrednictwem


Samouczek: dołączanie danych czujników przy użyciu danych prognozy pogody przy użyciu notesów Jupyter Notebook (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:

  • Tworzenie i uruchamianie notesu Jupyter w programie VS Code.
  • 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.

Uwaga

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

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.

Instalowanie pakietów na poziomie projektu

Projekt EV Routing i Reachable Range ma zależności od bibliotek aiohttp i IPython python. Te elementy można zainstalować w terminalu programu Visual Studio przy użyciu narzędzia:

pip install aiohttp
pip install ipython
pip install pandas

Otwieranie notesu Jupyter w programie Visual Studio Code

Pobierz, a następnie otwórz notes używany w tym samouczku:

  1. Otwórz plik weatherDataMaps.ipynb w repozytorium AzureMapsJupyterSamples w usłudze GitHub.

  2. Wybierz przycisk Pobierz nieprzetworzone pliki w prawym górnym rogu ekranu, aby zapisać plik lokalnie.

    Zrzut ekranu przedstawiający sposób pobierania pliku notesu o nazwie weatherDataMaps.ipynb z repozytorium GitHub.

  3. Otwórz pobrany notes w programie Visual Studio Code, klikając go prawym przyciskiem myszy, a następnie wybierając polecenie Otwórz w > programie Visual Studio Code lub za pośrednictwem Eksplorator plików programu VS Code.

Ładowanie wymaganych modułów i struktur

Po dodaniu kodu możesz uruchomić komórkę przy użyciu ikony Uruchom po lewej stronie komórki, a dane wyjściowe zostaną wyświetlone poniżej komórki kodu.

Uruchom następujący skrypt, aby załadować wszystkie wymagane moduły i struktury.

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

Zrzut ekranu przedstawiający sposób pobierania pierwszej komórki w notesie zawierającej wymagane instrukcje importu z wyróżnionym przyciskiem uruchamiania.

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

Zrzut ekranu przedstawiający lokalizacje turbin na mapie.

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.

Zrzut ekranu przedstawiający wykresy prędkości wiatru.

Zrzut ekranu przedstawiający wykresy 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 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.

Następne kroki