Tutorial: Bergabung dalam data sensor dengan data prakiraan cuaca dengan menggunakan Azure Notebooks (Python)
Tenaga angin adalah salah satu sumber energi alternatif untuk bahan bakar fosil guna memerangi perubahan iklim. Karena angin sifatnya tidak konsisten, operator tenaga angin perlu membuat model pembelajaran mesin (ML) untuk memprediksi kapasitas tenaga angin. Prediksi ini diperlukan untuk memenuhi permintaan listrik dan memastikan stabilitas jaringan. Dalam tutorial ini, kita membahas bagaimana data prakiraan cuaca Azure Maps digabungkan dengan data demo untuk pembacaan cuaca. Data prakiraan cuaca diminta dengan memanggil layanan Cuaca Azure Maps.
Dalam tutorial ini, Anda akan:
- Bekerja dengan file data di Azure Notebook di cloud.
- Memuat data demo dari file.
- Panggil REST API Azure Maps dengan Python.
- Merender data lokasi di peta.
- Memperkaya data demo dengan data cuaca Prakiraan Harian Azure Maps.
- Merencanakan data prakiraan dalam grafik.
Prasyarat
Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.
- Akun Azure Peta
- Kunci langganan
Catatan
Untuk informasi selengkapnya tentang autentikasi di Azure Maps, lihat mengelola autentikasi di Azure Maps.
Untuk memahami buku catatan Azure dan mengetahui cara memula, ikuti petunjuk Membuat Buku Catatan Azure.
Catatan
File buku catatan Jupyter untuk proyek ini dapat diunduh dari Repositori Weather Maps Jupyter Notebook.
Memuat modul dan kerangka kerja yang diperlukan
Untuk memuat semua modul dan kerangka kerja yang diperlukan, jalankan skrip berikut:
import pandas as pd
import datetime
from IPython.display import Image, display
!pip install aiohttp
import aiohttp
Mengimpor data cuaca
Tutorial ini menggunakan pembacaan data cuaca dari sensor yang dipasang pada empat turbin angin yang berbeda. Sampel data terdiri dari 30 hari pembacaan cuaca. Pembacaan ini dikumpulkan dari pusat data cuaca di dekat setiap lokasi turbin. Data demo berisi pembacaan data untuk suhu, kecepatan angin, dan arah. Anda dapat mengunduh data demo yang terkandung dalam weather_dataset_demo.csv dari GitHub. Skrip di bawah mengimpor data demo ke Azure Notebook.
df = pd.read_csv("./data/weather_dataset_demo.csv")
Meminta data perkiraan harian
Dalam skenario kami, kami ingin meminta perkiraan harian untuk setiap lokasi sensor. Skrip berikut memanggil API Prakiraan Harian layanan Azure Maps Weather. API ini menampilkan prakiraan cuaca untuk setiap turbin angin, selama 15 hari ke depan dari tanggal saat ini.
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()
Skrip berikut merender lokasi turbin di peta dengan memanggil layanan Dapatkan Gambar Peta.
# 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))
Kelompokkan data prakiraan dengan data demo berdasarkan ID stasiun. ID stasiun adalah untuk pusat data cuaca. Pengelompokan ini menambah data demo dengan data perkiraan.
# 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'])
Tabel berikut menampilkan gabungan data historis dan prakiraan untuk salah satu lokasi turbin.
# Display data for first location
grouped_weather_data.get_group(station_ids[0]).reset_index()
Merencanakan data perkiraan
Plot nilai yang diperkirakan terhadap hari yang diperkirakan. Plot ini memungkinkan kami melihat perubahan kecepatan dan arah angin selama 15 hari ke depan.
# 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")
Grafik berikut memvisualisasikan data prakiraan. Untuk perubahan kecepatan angin, lihat grafik kiri. Untuk perubahan arah angin, lihat grafik kanan. Data ini adalah prediksi untuk 15 hari ke depan dari hari data diminta.
Dalam tutorial ini, Anda mempelajari cara memanggil AZURE Peta REST API untuk mendapatkan data prakiraan cuaca. Anda juga mempelajari cara memvisualisasikan data di grafik.
Untuk mempelajari lebih lanjut tentang cara memanggil REST API Azure Maps di dalam Azure Notebook, lihat Perutean EV menggunakan Azure Notebooks.
Untuk menjelajahi API Azure Maps yang digunakan dalam tutorial ini, lihat:
Untuk mengetahui daftar lengkap REST API Azure Maps, lihat REST API Azure Maps.
Membersihkan sumber daya
Tidak ada sumber daya yang memerlukan pembersihan.
Langkah berikutnya
Untuk mempelajari selengkapnya tentang Notebooks, lihat