تطوير خريطة توزيع تفاعلية للفيروس التاجي من نوع 2019-nCoV في Python

ينتشر فيروس Coronavirus من نوع 2019-nCoV ، بعد انتشاره في مدينة ووهان الصينية ، بسرعة في جميع أنحاء العالم. في وقت كتابة المقال الأصلي (30 يناير 2020) ، تم الإبلاغ عن أكثر من 9000 مصاب و 213 قتيل ، حتى اليوم (10 فبراير 2020) ، تم الإبلاغ عن 40،570 مصابًا بالفعل ، توفي 910 شخصًا. تم الكشف عن حالات الإصابة بالفيروس التاجي في فرنسا وأستراليا وروسيا واليابان وسنغافورة وماليزيا وألمانيا وإيطاليا وسري لانكا وكمبوديا ونيبال والعديد من البلدان الأخرى. لا أحد يعرف متى سيتم إيقاف الفيروس. في غضون ذلك ، يتزايد عدد الحالات المؤكدة من فيروسات التاجية فقط.

يرغب كاتب المقالة التي نترجمها اليوم في التحدث عن كيفية استخدام Python لإنشاء تطبيق بسيط لتتبع انتشار الفيروس التاجي. بعد الانتهاء من العمل على هذا التطبيق ، سيكون لدى القارئ صفحة HTML تعرض خريطة لانتشار الفيروس وشريط تمرير يسمح لك بتحديد تاريخ عرض البيانات على الخريطة.


سيتم استخدام الخريطة التفاعلية لتوزيع

تقنيات فيروسات كورونا 2019-nCoV مثل Python 3.7 و Pandas و Plotly 4.1.0 و Jupyter Notebook هنا.

استيراد مكتبات


لنبدأ بالاستيراد إلى مشروع يستند إلى دفتر ملاحظات Jupyter ومكتبات Plotly و Pandas.

import plotly.offline as go_offline
import plotly.graph_objects as go
import pandas as pd

قبل الانتقال ، جرب تشغيل الرمز. إذا لم تشاهد رسائل خطأ ، فهذا يعني أنه تم تثبيت جميع المكتبات الضرورية وتعمل بشكل صحيح. إذا فشل تشغيل الكود ، ألق نظرة على الصفحات الرسمية لـ Plotly و Pandas واقرأ المواد المرجعية والتثبيت لهذه المكتبات. إذا لم يكن لديك نظام Jupyter Notebook يعمل على جهازك ، أوصي باستخدام Google Colab ، وهو نظام أساسي قائم على السحابة يتيح لك العمل مع Jupyter Notebook.

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


البيانات التي نستخدمها هنا يمكن العثور عليها هنا . هذا جدول بيانات مشترك لمستندات Google يتم تحديثه يوميًا. جزيل الشكر لجميع أولئك الذين يبقونها محدثة! أنت تقوم بعمل ضروري للغاية.

سنقرأ البيانات باستخدام طريقة Pandas read_csv. ولكن قبل تحميل البيانات من الجدول ، باستخدام الرابط إليه ، نحتاج إلى العمل مع هذا الرابط. يبدو الآن كما يلي: نحتاج إلى استبدال الجزء المحدد من الرابط ، مما يجعل الرابط يبدو كما يلي: في الكود التالي ، نقوم بتهيئة المتغير عن طريق كتابة رابط للبيانات فيه ، وقراءة البيانات باستخدام الطريقة وكتابتها إلى الخلايا الفارغة التي تحتوي على قيم .

https://docs.google.com/spreadsheets/d/18X1VM1671d99V_yd-cnUI1j8oSG2ZgfU_q1HfOizErA/edit#gid=0



https://docs.google.com/spreadsheets/d/18X1VM1671d99V_yd-cnUI1j8oSG2ZgfU_q1HfOizErA/export?format=csv&id

urlread_csvNaN0

url='https://docs.google.com/spreadsheets/d/18X1VM1671d99V_yd-cnUI1j8oSG2ZgfU_q1HfOizErA/export?format=csv&id'
data=pd.read_csv(url)
data=data.fillna(0)

يعد فهم كيفية هيكلة هياكل البيانات التي نستخدمها أمرًا بالغ الأهمية في هذه المرحلة من العمل ، حيث يحدد هذا النهج الذي نطبقه لمعالجة البيانات. اعرض البيانات باستخدام الأمر data.head(). سيؤدي ذلك إلى إخراج الصفوف الخمسة الأولى من الجدول.


أول 5 صفوف من بيانات الفيروس التاجي

في الزاوية اليسرى السفلية يمكنك أن ترى معلومات أن هناك 47 عمودًا في جدول البيانات. فيما يلي أسماء الأعمدة الخمسة الأولى:country،location_idوlocation،latitudeوlongitude. الأعمدة الأخرى عبارة عن أزواج يتم إنشاء أسمائها على النحو التالي:confirmedcase_dd-mm-yyyyوdeaths_dd-mm-yyyy. كان إجمالي عدد الأعمدة في الجدول وقت كتابة هذه المادة 47. وهذا يعني أن لدي بيانات لمدة 21 يومًا تحت تصرفي ((47-5) / 2 = 21). إذا كان تاريخ البدء لجمع البيانات 10.01.2020 ، فإن تاريخ الانتهاء هو 30.01.2020.

لا تتغير أسماء الأعمدة الخمسة الأولى من الجدول ، ولكن بمرور الوقت ستتم إضافة أعمدة بأسماء جديدة إلى الجدول. ما ستنتجه خريطتنا التفاعلية هو تصور توزيع الفيروس التاجي مع القدرة على تحديد اليوم الذي يتم بموجبه تكوين الخريطة. لذلك ، نحتاج إلى فصل مجموعة البيانات بالكامل عن طريق تحديد المعلومات منها لكل يوم مع الأخذ في الاعتبار أن الأعمدة الخمسة الأولى من الجدول لا تتغير ، وأن كل يوم يتم وصفه بواسطة عمودين. بعد ذلك ، إذا ألقيت نظرة فاحصة على البيانات ، على سبيل المثال ، بيانات 10.01.2020 ، اتضح أن العديد من التواريخ تتوافق مع هذا التاريخ. في الواقع ، في هذا التاريخ تم تأكيد الكشف عن الفيروس التاجي في مكان واحد فقط ، والذي تم تمييزه بالرقم المقابل. تحتوي جميع الأسطر الأخرى في هذا التاريخ على أصفار فقط. هذا يعني،أننا بحاجة إلى استبعاد هذه الخطوط من عملية بناء الخريطة.

تتم عملية إعداد البيانات للتصور في دورة.

#  
fig=go.Figure()
col_name=data.columns
n_col=len(data.columns)
date_list=[]
init=4
n_range=int((n_col-5)/2)

#,          
for i in range(n_range):
    col_case=init+1
    col_dead=col_case+1
    init=col_case+1
    df_split=data[['latitude','longitude','country','location',col_name[col_case],col_name[col_dead]]]
    df=df_split[(df_split[col_name[col_case]]!=0)]
    lat=df['latitude']
    lon=df['longitude']
    case=df[df.columns[-2]].astype(int)
    deaths=df[df.columns[-1]].astype(int)
    df['text']=df['country']+'<br>'+df['location']+'<br>'+'confirmed cases: '+ case.astype(str)+'<br>'+'deaths: '+deaths.astype(str)
    date_label=deaths.name[7:17]
    date_list.append(date_label)
    
    #  Scattergeo
    fig.add_trace(go.Scattergeo(
    name='',
    lon=lon,
    lat=lat,
    visible=False,
    hovertemplate=df['text'],
    text=df['text'],
    mode='markers',
    marker=dict(size=15,opacity=0.6,color='Red', symbol='circle'),
    ))

أثناء التشغيل ، تتم إضافة إخراج كل مجموعة بيانات إلى الرسم البياني Scattergeo باستخدام fig.add_trace. في وقت كتابة هذا التقرير ، يتم تمثيل البيانات التي سيتم بناء الصور على أساسها بـ 21 كائنًا. يمكنك التحقق من ذلك باستخدام الأمر fig.data.

إنشاء المنزلق


سنقوم هنا بإنشاء شريط تمرير بمساعدة تنظيم البيانات المختارة على الخريطة. هنا هو رمز ذات الصلة:

# 
steps = []
for i in range(len(fig.data)):
    step = dict(
        method="restyle",
        args=["visible", [False] * len(fig.data)],
        label=date_list[i],
    )
    step["args"][1][i] = True  #  i-     "visible"
    steps.append(step)
    
sliders = [dict(
    active=0,
    currentvalue={"prefix": "Date: "},
    pad={"t": 1},
    steps=steps
)]

يتكون رمز المنزلق من جزأين رئيسيين. الأول هو حلقة stepsيتم فيها ملء القائمة المستخدمة عند تحريك شريط التمرير. عند تحريك شريط التمرير ، يتم تصور مجموعة البيانات المقابلة ويتم إخفاء ما يتم عرضه من قبل. الجزء الثاني من الكود هو تضمين القائمة التي تم إنشاؤها سابقًا stepsفي كائن المنزلق. عندما يتحرك شريط التمرير ، فإنه يختار العنصر المقابل منه steps.

قم بتعيين الإخراج وحفظه كملف HTML


الآن نأتي إلى الجزء الأخير من المادة. نتحدث هنا عن كيفية عرض الخريطة وكيفية حفظها بتنسيق HTML. إليك الشفرة التي تنفذ هذه العمليات:

#    
fig.data[0].visible=True

#       HTML
fig.update_layout(sliders=sliders,title='Coronavirus Spreading Map'+'<br>geodose.com',height=600)
fig.show()
go_offline.plot(fig,filename='F:/html/map_ncov.html',validate=True, auto_open=False)

عند عرض الخريطة ، يظهر تمثيل مرئي لمجموعة البيانات الأولى. ثم نقوم بعمل محتويات تحديث الخريطة وفقًا لموضع شريط التمرير. هنا نضع عنوان الخريطة ونعدل ارتفاعها. في الخطوة الأخيرة ، نعرض الخريطة باستخدام الطريقة fig.show، ثم نحفظها بتنسيق HTML باستخدام الطريقة go_offline.plot.

كود المشروع الكامل


فيما يلي رمز المشروع الكامل لإنشاء خريطة توزيع فيروسات التاجية من نوع 2019-nCoV. يرجى ملاحظة أن السطر الأخير المسؤول عن حفظ نسخة HTML من الخريطة يحتاج إلى تعديل ، واستبدال المسار المحدد هناك بالمسار المناسب لك.

import plotly.offline as go_offline
import plotly.graph_objects as go
import pandas as pd

# 
url='https://docs.google.com/spreadsheets/d/18X1VM1671d99V_yd-cnUI1j8oSG2ZgfU_q1HfOizErA/export?format=csv&id'
data=pd.read_csv(url)
data=data.fillna(0)

#  
fig=go.Figure()
col_name=data.columns
n_col=len(data.columns)
date_list=[]
init=4
n_range=int((n_col-5)/2)

#,          
for i in range(n_range):
    col_case=init+1
    col_dead=col_case+1
    init=col_case+1
    df_split=data[['latitude','longitude','country','location',col_name[col_case],col_name[col_dead]]]
    df=df_split[(df_split[col_name[col_case]]!=0)]
    lat=df['latitude']
    lon=df['longitude']
    case=df[df.columns[-2]].astype(int)
    deaths=df[df.columns[-1]].astype(int)
    df['text']=df['country']+'<br>'+df['location']+'<br>'+'confirmed cases: '+ case.astype(str)+'<br>'+'deaths: '+deaths.astype(str)
    date_label=deaths.name[7:17]
    date_list.append(date_label)
    
    #  Scattergeo
    fig.add_trace(go.Scattergeo(
    name='',
    lon=lon,
    lat=lat,
    visible=False,
    hovertemplate=df['text'],
    text=df['text'],
    mode='markers',
    marker=dict(size=15,opacity=0.6,color='Red', symbol='circle'),
    ))


# 
steps = []
for i in range(len(fig.data)):
    step = dict(
        method="restyle",
        args=["visible", [False] * len(fig.data)],
        label=date_list[i],
    )
    step["args"][1][i] = True  #  i-     "visible"
    steps.append(step)
    
sliders = [dict(
    active=0,
    currentvalue={"prefix": "Date: "},
    pad={"t": 1},
    steps=steps
)]

#    
fig.data[0].visible=True

#       HTML
fig.update_layout(sliders=sliders,title='Coronavirus Spreading Map'+'<br>geodose.com',height=600)
fig.show()
go_offline.plot(fig,filename='F:/html/map_ncov_slider.html',validate=True, auto_open=False)

ملخص


لقد أكملنا مراجعة دليل حول إنشاء خريطة تفاعلية لتصور توزيع فيروسات التاجية من نوع 2019-nCoV. بعد العمل من خلال هذه المادة ، تعلمت كيفية قراءة البيانات من جداول بيانات Google العامة ، وكيفية معالجة البيانات باستخدام Pandas ، وكيفية تصور هذه البيانات على خريطة تفاعلية باستخدام شريط التمرير و Plotly. يمكن تنزيل نتيجة المشروع كصفحة HTML من هنا.. تعتمد المعلومات المعروضة على الخريطة على جدول البيانات. في كل مرة يتم تنفيذ رمز المشروع ، يتم تحديث الخريطة ، وتصبح البيانات الجديدة من الجدول متاحة عليها. هذه خريطة بسيطة للغاية. هناك طرق عديدة لتحسينه. على سبيل المثال ، يمكن استكماله برسوم بيانية إضافية وبعض البيانات الموجزة وما إلى ذلك. إذا كنت مهتمًا ، يمكنك القيام بكل هذا وأكثر بنفسك.

القراء الأعزاء! ما المهام التي تستخدمها تقنية Jupyter Notebook؟

Source: https://habr.com/ru/post/undefined/


All Articles