Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
- Konto usługi Azure Maps
- Klucz subskrypcji
- Visual Studio Code
- Podstawowa wiedza na temat notebooków Jupyter w środowisku VS Code
- Środowisko do pracy z językiem Python w Jupyter Notebook. Aby uzyskać więcej informacji, zobacz Konfigurowanie środowiska.
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:
Otwórz plik weatherDataMaps.ipynb w repozytorium AzureMapsJupyterSamples w usłudze GitHub.
Wybierz przycisk Pobierz nieprzetworzone pliki w prawym górnym rogu ekranu, aby zapisać plik lokalnie.
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
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¢er={},{}&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))
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()
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.
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.