Oktatóanyag: Érzékelőadatok összekapcsolása időjárás-előrejelzési adatokkal Jupyter Notebooks (Python) használatával
A szélenergia a fosszilis tüzelőanyagok egyik alternatív energiaforrása az éghajlatváltozás elleni küzdelemhez. Mivel a szél természete nem konzisztens, a szélerőmű-üzemeltetőknek gépi tanulási (ML) modelleket kell létrehozniuk a szélenergia-kapacitás előrejelzéséhez. Ez az előrejelzés a villamosenergia-kereslet kielégítéséhez és a hálózat stabilitásának biztosításához szükséges. Ebben az oktatóanyagban bemutatjuk, hogyan kombinálja az Azure Maps időjárás-előrejelzési adatait az időjárás-olvasások demóadataival. Az időjárás-előrejelzési adatok az Azure Maps Weather Services meghívásával kérhetőek le.
Az oktatóanyag során az alábbi lépéseket fogja végrehajtani:
- Jupyter-jegyzetfüzet létrehozása és futtatása a VS Code-ban.
- Demóadatok betöltése fájlból.
- Azure Maps REST API-k meghívása Pythonban.
- Helyadatok megjelenítése a térképen.
- Bővítse a demóadatokat az Azure Maps napi előrejelzési időjárási adataival.
- Előrejelzési adatok ábrázolása grafikonokon.
Feljegyzés
A projektHez tartozó Jupyter-jegyzetfüzetfájl letölthető a Weather Maps Jupyter Notebook adattárából.
Előfeltételek
Ha még nincs Azure-előfizetése, kezdés előtt hozzon létre egy ingyenes fiókot.
- Azure Maps-fiók
- Előfizetési kulcs
- Visual Studio Code
- A Jupyter Notebooks működésének ismerete a VS Code-ban
- A környezet úgy van beállítva, hogy a Pythonnal működjön a Jupyter Notebooksban. További információ: A környezet beállítása.
Feljegyzés
Az Azure Maps hitelesítésével kapcsolatos további információkért tekintse meg a hitelesítés kezelését az Azure Mapsben.
Projektszintű csomagok telepítése
Az EV Routing and Reachable Range projekt függőségekkel rendelkezik az aiohttp és az IPython Python-kódtáraktól. Ezeket telepítheti a Visual Studio terminálba a pip használatával:
pip install aiohttp
pip install ipython
pip install pandas
Jupyter Notebook megnyitása a Visual Studio Code-ban
Töltse le, majd nyissa meg az oktatóanyagban használt jegyzetfüzetet:
Nyissa meg a weatherDataMaps.ipynb fájlt a GitHub AzureMapsJupyterSamples adattárában.
A fájl helyi mentéséhez válassza a képernyő jobb felső sarkában található Nyers fájl letöltése gombot.
Nyissa meg a letöltött jegyzetfüzetet a Visual Studio Code-ban. Ehhez kattintson a jobb gombbal a fájlra, majd válassza a Megnyitás a Visual Studio Code-tal >lehetőséget, vagy a VS Code Fájlkezelő.
A szükséges modulok és keretrendszerek betöltése
A kód hozzáadása után futtathat egy cellát a cella bal oldalán található Futtatás ikonnal, és a kimenet a kódcella alatt jelenik meg.
Futtassa a következő szkriptet az összes szükséges modul és keretrendszer betöltéséhez.
import aiohttp
import pandas as pd
import datetime
from IPython.display import Image, display
Időjárási adatok importálása
Ez az oktatóanyag négy különböző szélturbina érzékelőiből származó időjárási adatokat használ. A mintaadatok 30 napos időjárási adatokból állnak. Ezeket az adatokat az időjárási adatközpontokból gyűjtik össze az egyes turbinahelyek közelében. A demóadatok a hőmérsékletre, a szélsebességre és az irányra vonatkozó adatolvasásokat tartalmazzák. A gitHubról letöltheti a weather_dataset_demo.csv demóadatait. Az alábbi szkript demoadatokat importál az Azure Notebookba.
df = pd.read_csv("./data/weather_dataset_demo.csv")
Napi előrejelzési adatok kérése
Esetünkben minden érzékelőhelyre napi előrejelzést szeretnénk kérni. Az alábbi szkript meghívja az Azure Maps Weather Services Daily Forecast API-ját. Ez az API az egyes szélturbinák időjárás-előrejelzését adja vissza az aktuális dátumtól számított 15 napra vonatkozóan.
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()
Az alábbi szkript a térkép turbinahelyeit jeleníti meg a Térkép képének lekérése szolgáltatás meghívásával.
# 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¢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))
Csoportosítsa az előrejelzési adatokat a demóadatokkal az állomásazonosító alapján. Az állomás azonosítója az időjárási adatközponthoz tartozik. Ez a csoportosítás kibővíti a demóadatokat az előrejelzési adatokkal.
# 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'])
Az alábbi táblázat az egyik turbinahely összesített előzmény- és előrejelzési adatait jeleníti meg.
# Display data for first location
grouped_weather_data.get_group(station_ids[0]).reset_index()
Előrejelzési adatok ábrázolása
Ábrázolja az előrejelzett értékeket az előrejelzett napokhoz. Ez a ábra lehetővé teszi számunkra, hogy a következő 15 napban a szél sebesség- és irányváltozásait lássuk.
# 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")
Az alábbi grafikonok az előrejelzési adatokat jelenítik meg. A szélsebesség változásáról a bal oldali grafikonon olvashat. A szél irányának módosításához tekintse meg a megfelelő gráfot. Ezek az adatok az adatok kérésének napjától számított 15 napra lesznek előrejelezve.
Ebben az oktatóanyagban megtanulta, hogyan hívhatja meg az Azure Maps REST API-kat az időjárás-előrejelzési adatok lekéréséhez. Azt is megtanulta, hogyan jelenítheti meg az adatokat grafikonokon.
Az oktatóanyagban használt Azure Maps API-k megismeréséhez lásd:
Az Azure Maps REST API-k teljes listáját az Azure Maps REST API-kban találja.