البرنامج التعليمي: انضم إلى بيانات المستشعر مع بيانات التنبؤ بالطقس باستخدام دفاتر Azure (Python)

طاقة الرياح هي أحد مصادر الطاقة البديلة للوقود الأحفوري لمكافحة تغير المناخ. نظرًا لأن الرياح ليست متسقة بطبيعتها، يحتاج مشغلو طاقة الرياح إلى بناء نماذج التعلم الآلي (ML) للتنبؤ بقدرة طاقة الرياح. هذا التنبؤ ضروري لتلبية الطلب على الكهرباء وضمان استقرار الشبكة. في هذا البرنامج التعليمي، ونحن نسير من خلال كيفية جمع بين بيانات توقعات الطقس من Azure Maps والبيانات التجريبية لقراءات الطقس. يتم طلب بيانات التنبؤ بالطقس عن طريق الاتصال بخدمات Azure Maps Weather.

في هذا البرنامج التعليمي، سوف نتعلم:

  • العمل مع ملفات البيانات في Azure Notebooks في السحابة.
  • قم بتحميل بيانات العرض التوضيحي من الملف.
  • اتصل بخرائط Azure واجهات REST APIs في Python.
  • قم بعرض بيانات الموقع على الخريطة.
  • قم بإثراء البيانات التجريبية مع بيانات طقس التوقعات اليومية من Azure Maps.
  • قم بتخطيطي بيانات التنبؤ في الرسوم البيانية.

المتطلبات الأساسية

في حال لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانيّاً قبل البدء.

إشعار

ولمزيد من المعلومات حول مصادقة Azure Maps، راجع إدارة المصادقة في Azure Maps.

للتعرف على دفاتر ملاحظات Azure ومعرفة كيفية البدء، اتبع الإرشادات إنشاء دفتر ملاحظات Azure.

إشعار

يمكن تحميل ملف دفتر ملاحظات Jupyter لهذا المشروع من Weather Maps Jupyter Notebook repository.

تحميل الوحدات النمطية، والأطر المطلوبة

لتحميل كافة الوحدات النمطية المطلوبة وأطر العمل، شغِّل البرنامج النصي التالي:

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

استيراد بيانات الطقس

يستخدم هذا البرنامج التعليمي قراءات بيانات الطقس من أدوات الاستشعار المثبتة في أربعة توربينات الرياح المختلفة. تتكون بيانات العينة من 30 يومًا من قراءات الطقس. يتم جمع هذه القراءات من مراكز بيانات الطقس بالقرب من كل موقع توربين. تحتوي البيانات التجريبية على قراءات بيانات لدرجة الحرارة وسرعة الرياح والاتجاه. يمكنك تنزيل البيانات التجريبية الواردة في weather_dataset_demo.csv من GitHub. البرنامج النصي أدناه استيراد بيانات العرض التوضيحي إلى Azure Notebook.

df = pd.read_csv("./data/weather_dataset_demo.csv")

طلب بيانات التنبؤ اليومي

في السيناريو لدينا، نود أن نطلب توقعات يومية لكل موقع استشعار. البرنامج النصي التالي يستدعي API التنبؤ اليومي لخدمات Azure Maps Weather. تقوم واجهة برمجة التطبيقات هذه بإرجاع توقعات الطقس لكل توربين رياح، للأيام الـ 15 القادمة من التاريخ الحالي.

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

يعرض البرنامج النصي التالي مواقع التوربينات على الخريطة عن طريق استدعاء خدمة 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))

Turbine locations

تجميع بيانات التنبؤ مع البيانات التجريبية استنادا إلى معرف المحطة. معرف المحطة هو لمركز بيانات الطقس. يزيد هذا التجميع من البيانات التجريبية ببيانات التنبؤ.

# 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'])

يعرض الجدول التالي البيانات التاريخية والبيانات المتوقعة المجمعة لأحد مواقع التوربينات.

# Display data for first location
grouped_weather_data.get_group(station_ids[0]).reset_index()

Grouped data

بيانات التنبؤ بالرسم

رسم القيم المتوقعة مقابل الأيام التي يتم التنبؤ بها. هذا المخطط يسمح لنا بأن نرى سرعة واتجاه التغييرات من الرياح لمدة الـ 15 يومًا المقبلة.

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

تصور الرسوم البيانية التالية بيانات التنبؤ. لتغيير سرعة الرياح، راجع الرسم البياني الأيسر. للتغير في اتجاه الرياح، راجع الرسم البياني الصحيح. هذه البيانات هي التنبؤ لمدة 15 يومًا من اليوم الذي يتم فيه طلب البيانات.

Wind speed plotWind direction plot

في هذا البرنامج التعليمي، تعلمت كيفية استدعاء واجهات برمجة تطبيقات REST خرائط Azure للحصول على بيانات التنبؤ بالطقس. تعلمت أيضًا كيفية تصور البيانات على الرسوم البيانية.

لمعرفة المزيد حول كيفية الاتصال بواجهات برمجة تطبيقات Azure Maps REST داخل دفاتر Azure، راجع توجيه EV باستخدام دفاتر Azure.

لاستكشاف واجهات برمجة تطبيقات Azure Maps المستخدمة في هذا البرنامج التعليمي، راجع:

للحصول على قائمة كاملة بـAzure Maps REST APIs، قم بالاطلاع على Azure Maps REST APIs.

تنظيف الموارد

لا توجد موارد تتطلب التنظيف.

الخطوات التالية

لمعرفة المزيد حول Azure Notebooks، يرجى مراجعة: