用Python开发类型为2019-nCoV的交互式冠状病毒分布图

在中国武汉市爆发后,2019-nCoV型冠状病毒正在全球范围内迅速传播。在撰写原始文章时(2020年1月30日),已经报告了9,000多例感染者和213人死亡,截至今天(2020年2月10日),已经报告了40,570例感染者,有910人死亡。在法国,澳大利亚,俄罗斯,日本,新加坡,马来西亚,德国,意大利,斯里兰卡,柬埔寨,尼泊尔和许多其他国家中已检测到冠状病毒感染病例。没有人知道何时停止病毒。同时,确诊的冠状病毒病例数仅在增加。

今天我们要翻译的文章的作者想谈一谈如何使用Python创建一个简单的应用程序来跟踪冠状病毒的传播。在完成此应用程序的工作后,阅读器将具有一个HTML页面和一个滑块,该HTML页面显示该病毒的传播图,该滑块允许您选择在该地图上显示数据的日期。




这里将使用 2019-nCoV型冠状病毒技术的交互式分布图,例如Python 3.7,Pandas,Plotly 4.1.0和Jupyter Notebook。

导入库


让我们从导入基于Jupyter Notebook,Plotly和Pandas库的项目开始。

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

在继续之前,请尝试运行代码。如果没有看到错误消息,则说明所有必需的库均已安装并且可以正常工作。如果代码无法运行,请查看PlotlyPandas的官方页面,并阅读这些库的参考和安装材料。如果您的硬件上没有运行Jupyter Notebook系统,建议您使用Google Colab,这是一个基于云的平台,可让您使用Jupyter Notebook。

数据处理


我们在这里使用的数据可以在这里找到。这是Google文档的共享电子表格,每天都会更新。非常感谢所有保持最新状态的人!您正在做非常必要的工作。

我们将使用Pandas方法读取数据read_csv。但是在使用表链接从表中加载数据之前,我们需要使用此链接。现在看起来像这样: 我们需要替换链接的选定片段,使链接变为这种形式: 在以下代码中,我们通过向数据写入链接来初始化变量,使用方法读取数据并写入包含value的空单元格

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行的输出。


冠状病毒数据的前5行在

左下角,您可以看到数据表中有47列的信息。以下是前五个栏的名称:countrylocation_idlocationlatitudelongitude。其他列是其名称构造如下的对:confirmedcase_dd-mm-yyyydeaths_dd-mm-yyyy。撰写本文时,表中的总列数为47。这意味着我有21天的数据可供使用((47-5)/ 2 = 21)。如果数据收集的开始日期是10.01.2020,那么结束日期是30.01.2020。

该表的前五列的名称不会更改,但是随着时间的流逝,具有新名称的列将被添加到该表中。我们的交互式地图将输出的是冠状病毒分布的可视化图像,并能够指示形成地图的日期。因此,我们需要通过每天从中选择信息并考虑到表的前5列不变,并且每天由两列描述来分离整个数据集。然后,如果您仔细查看数据(例如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