مشاركة عبر


البرنامج التعليمي: ضم بيانات المستشعر مع بيانات التنبؤ بالطقس باستخدام Jupyter Notebooks (Python)

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

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

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

إشعار

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

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

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

إشعار

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

تثبيت حزم مستوى المشروع

يحتوي مشروع توجيه EV والنطاق القابل للوصول على تبعيات على مكتبات aiohttp وIPython python. يمكنك تثبيت هذه في محطة Visual Studio الطرفية باستخدام pip:

pip install aiohttp
pip install ipython
pip install pandas

افتح Jupyter Notebook في Visual Studio Code

قم بالتنزيل ثم افتح دفتر الملاحظات المستخدم في هذا البرنامج التعليمي:

  1. افتح الملف weatherDataMaps.ipynb في مستودع AzureMapsJupyterSamples في GitHub.

  2. حدد الزر Download raw file في الزاوية العلوية اليسرى من الشاشة لحفظ الملف محليا.

    لقطة شاشة توضح كيفية تنزيل ملف دفتر الملاحظات المسمى weatherDataMaps.ipynb من مستودع GitHub.

  3. افتح دفتر الملاحظات الذي تم تنزيله في Visual Studio Code بالنقر بزر الماوس الأيمن فوق الملف ثم تحديد Open with > Visual Studio Code، أو من خلال VS Code مستكشف الملفات.

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

بمجرد إضافة التعليمات البرمجية الخاصة بك، يمكنك تشغيل خلية باستخدام أيقونة Run إلى يسار الخلية ويتم عرض الإخراج أسفل خلية التعليمات البرمجية.

قم بتشغيل البرنامج النصي التالي لتحميل جميع الوحدات النمطية وأطر العمل المطلوبة.

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

لقطة شاشة توضح كيفية تنزيل الخلية الأولى في دفتر الملاحظات التي تحتوي على عبارات الاستيراد المطلوبة مع تمييز زر التشغيل.

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

يستخدم هذا البرنامج التعليمي قراءات بيانات الطقس من أدوات الاستشعار المثبتة في أربعة توربينات الرياح المختلفة. تتكون بيانات العينة من 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))

لقطة شاشة تعرض مواقع التوربينات على الخريطة.

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

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

البيانات المجمعة

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

رسم القيم المتوقعة مقابل الأيام التي يتم التنبؤ بها. هذا المخطط يسمح لنا بأن نرى سرعة واتجاه التغييرات من الرياح لمدة الـ 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 يومًا من اليوم الذي يتم فيه طلب البيانات.

لقطة شاشة تعرض مخططات سرعة الرياح.

لقطة شاشة تعرض مخططات اتجاه الرياح.

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

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

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

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