本文主要介绍通过以Python为工具,首先编写爬虫爬取网络数据,获取疫情数据,然后使用Pandas和matplotlib等工具对数据进行分析,获得目前主要国家及全世界疫情变化图,最后根据目前的感染人数变化,使用Logistic算法构建拟合模型,并对未来的疫情数据进行预测的过程。
因此,本文主要分为三部分:
(1)数据爬取
(2)变化趋势展示
(3)世界疫情预测
下文从这三方面按顺序展示。
01
数据爬取
本文通过采集丁香医生网站的全世界疫情数据,通过整理,按国家排列,方便下文的分析使用,爬虫核心代码如下:
response= requests.get(url='https://ncov.dxy.cn/ncovh5/view/pneumonia')
if request.status_code == 200:
current_data = request.json()
break
else:
time.sleep(1)
continue
对上述爬取结果进行整理,通过网页分析工具,得出各个国家的疫情数据,由于国家数目过多,因此只展示后文使用到的几个国家数据,时间周期从3月16日到4月27日,数据展示前五条和后五条。如下图所示:
02
变化趋势展示
文章以包括中国在内的10个世界大国作为研究对象,选择标准包括国家经济实力和感染人数等指标,分别是:中国、美国、日本、英国、法国、德国、印度、意大利、巴西和加拿大,使用Pandas和matplotlib绘制疫情变化趋势图,代码和趋势图如下
data1 = data.loc[data['updateTime']>'2020-03-16']
data2 = data1[data.provinceName.isin(['美国','中国','日本','英国','法国','德国','印度','意大利','巴西','加拿大'])]
data4 = data3.groupby(['provinceName','data']).max()
data4.reset_index(drop=False)
line = Line()
line.add_xaxis([str(i)[6:10] for i in data5['data']])
line.add_yaxis('中国',data5['中国'],is_selected=True,is_symbol_show=False,is_smooth=False) #绘图以中国为例,其余国家代码省略
line.set_global_opts(title_opts=opts.TitleOpts(title="各国确诊情况"))
line.render_notebook()
根据上图可以清楚的看到,目前在世界范围内,美国的疫情增长最为严重,而代表中国的红色曲线则始终为一条水平的直线,这是因为美国的数据太大,妨碍了其他国家的数据展示,可以通过使用百分比更直观的表示。
在上图中可以发现,从3月16号开始,我国的疫情确诊患者占比从近70%,一路降低到目前不到10%,但是从确诊患者数量来看,我国确诊人数一直在81000+到84000+之间浮动,占比降低的原因是国外确诊患者的持续增多。对于这场与疫情的战斗尚未到胜利的时候,广大同胞仍需努力。
上图将中国、美国、英国三个国家从3月16号到目前的确诊人数增长率表示出来,当天增长率=(当天确诊人数-前一天确诊人数)/前一天确诊人数*100%。
注:为了在同一图中进行对比,上文中中国的增长率为放大10倍的结果。上图显示,40多天以来,随着国家打击疫情的力量不断增强,中美英三国的确诊增长率不断下降,疫情得到了有效控制。
03
世界疫情预测
针对目前世界各国愈演愈烈的疫情发展,本文计划使用Logistic算法,基于目前的世界疫情数据,构建预测模型。
Logistic函数或Logistic曲线是一种常见的S形函数,它是皮埃尔·弗朗索瓦·韦吕勒在1844或1845年在研究它与人口增长的关系时命名的。广义Logistic曲线可以模仿一些情况人口增长(P)的S形曲线。起初阶段大致是指数增长;然后随着开始变得饱和,增加变慢;最后,达到成熟时增加停止。
Logistic回归主要在流行病学中应用较多,比较常用的情形是探索某疾病的危险因素,根据危险因素预测某疾病发生的概率,等等。
例如,在胃癌发生的预测中,可以选择样本的年龄、性别、饮食习惯、幽门螺杆菌感染等作为自变量预测患者是否可能患有癌症。该函数的自变量既可以是连续的,也可以是分类的。在学术界,Logistic函数通常用作医学中的疾病预测、金融学中的信用信贷预测或更多具有分类需求的情境中。
在疫情传播中,由于刚开始社会各界并不重视,疫情传播的环境阻力较小,因此增长率较大;当疫情进行到一定阶段,随着如戴口罩、感染源隔离、倡导减少活动等各项措施的实施,疫情传播的环境阻力增大,增长率减低,则传播曲线呈现出S形。本文选择该模型则是利用Logistic曲线的特性,通过调参模拟疫情的历史变化趋势,并预测未来的疫情数据。
Logistic函数如下,其中为P0初始值,K为终值,r衡量曲线变化快慢,t为时间。
接下来本文用Python工具,使用从3月16日到27号的世界疫情数据构建预测模型,代码如下
# 构建Logistic函数
def logistic_increase_function(t, K, P0, r):
r=0.102
t0 = 1
exp_value = np.exp(r * (t - t0))
return (K * exp_value * P0) / (K + (exp_value - 1) * P0)
# 最小二乘拟合
popt, pocv = curve_fit(logistic_increase_function, t, P)
#拟合后对未来情况进行预测
P_predict=logistic_increase_function(t,popt[0],popt[1],popt[2])
future=[46,48,50,60,70,80,90,100]
future=np.array(future)
future_predict=logistic_increase_function(future,popt[0],popt[1],popt[2])
#近期情况
tomorrow=[45,46,47,48,49,50,51,52]
tomorrow=np.array(tomorrow)
tomorrow_predict=logistic_increase_function(tomorrow,popt[0],popt[1],popt[2])
#拟合函数图像绘制
plot1=plt.plot(t,P,'s',label="疫情确诊感染人数")
plot2=plt.plot(t,P_predict,'r',label='感染人数拟合曲线')
plot3=plt.plot(tomorrow,tomorrow_predict,'s',label='近期感染人数预测')
plt.xlabel('日期')
plt.ylabel('确诊人数')
plt.legend(loc=0)
plt.show()
# 峰值预测图像绘制
plot4=plt.plot(future,future_predict,'s',label='未来感染人数预测')
plt.xlabel('时间')
plt.ylabel('预计最终确诊人数')
plt.show()
# matplotlib不能直接处理中文,需要进行处理
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 输出预测结果
print("以下为从27号之后的10天内全世界确诊人数预测")
for i in range(10):
people_sick=int(logistic_increase_function(np.array(i+45),popt[0],popt[1],popt[2]))
if i+28<=30:
print("4月%d日确诊人数预计:%d人"%(i+28,people_sick))
else:
print("5月%d日确诊人数预计:%d人"%(i-2,people_sick))
根据上述模型得出以下结果,
根据上述结果,在未来的40-50天左右,本次疫情的增长将达到峰值,预测世界感染人数为400万左右。有鉴于此,衷心期望各国政府能加强疫情防治力度,积极限制人民的流动,增大环境阻力,尽最快速度消灭疫情,保障人民的安全。
网友评论