Udostępnij przez


Poradnik: Dołączanie danych czujników do danych prognozy pogody przy użyciu 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ą pobierane poprzez wywołanie usługi Azure Maps Weather.

Ten samouczek obejmuje następujące kroki:

  • Utwórz i uruchom notatnik 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 Jupyter notebook 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 Python aiohttp i IPython. Można zainstalować te pakiety w terminalu programu Visual Studio przy użyciu pip.

pip install aiohttp
pip install ipython
pip install pandas

Otwórz notatnik 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, jak pobrać plik Notebooka 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 pokazujący, jak uruchomić pierwszą komórkę w notatniku zawierającą wymagane instrukcje importu, z wyróżnionym przyciskiem uruchomienia.

Importowanie danych pogodowych

W tym samouczku wykorzystywane są dane pogodowe z czujników zainstalowanych na 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 API Daily Forecast usługi pogody w 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 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()

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

Zrzut ekranu przedstawiający lokalizacje turbin na mapie.

Zgrupuj dane prognozy z danymi demonstracyjnymi na podstawie identyfikatora stacji. Identyfikator stacji jest przeznaczony dla centrum danych pogodowych. To grupowanie rozszerza dane pokazowe o dane prognoz.

# 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 odniesieniu do dni, dla których są przewidywane. 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