在中国武汉市爆发后,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
在继续之前,请尝试运行代码。如果没有看到错误消息,则说明所有必需的库均已安装并且可以正常工作。如果代码无法运行,请查看Plotly和Pandas的官方页面,并阅读这些库的参考和安装材料。如果您的硬件上没有运行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
url
read_csv
NaN
0
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列的信息。以下是前五个栏的名称: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。该表的前五列的名称不会更改,但是随着时间的流逝,具有新名称的列将被添加到该表中。我们的交互式地图将输出的是冠状病毒分布的可视化图像,并能够指示形成地图的日期。因此,我们需要通过每天从中选择信息并考虑到表的前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)
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
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
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)
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
steps.append(step)
sliders = [dict(
active=0,
currentvalue={"prefix": "Date: "},
pad={"t": 1},
steps=steps
)]
fig.data[0].visible=True
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技术执行哪些任务?