python实现2019-nCoV疫情确诊数据拟合与预测


接上期,在​


​获取2019-nCoV疫情实时追踪数据​​后,接下来就要着手探索这些数据的规律和内在联系了。

思路
  • 第一步,画出现有数据的散点图,大致了解其分布规律
  • 第二步,利用现有数据拟合出曲线,求解拟合曲线的参数
  • 第三步,利用拟合曲线对未来预测

下面严格按照这散布走模式进行

第一步 散点图

按照时间序列将确诊病人数在坐标轴上描出散点,同时添加坐标的标签,顺便更改横坐标的刻度标签,使得其看起来像随时间变化而变化的。

fig=plt.figure(figsize=(10,4)) #建立画布
ax=fig.add_subplot(1, 1, 1)
ax.scatter(t,confirm,color="k",label="确诊人数") #真实数据散点图
#ax.set_xlabel("天数") #横坐标
ax.set_ylabel("确诊人数") #纵坐标
ax.set_title("确诊人数变化") #标题
ax.set_xticklabels(['', '1月13号', '1月18号', '1月23号', '1月28号','2月2号'], rotation=30, fontsize=10) #自定义横坐标标签

python实现2019-nCoV疫情确诊数据拟合与预测_Python教程

第二步 拟合

一般的拟合有两种方法,第一种用多项式拟合,因为多项式是最简单的函数结构,且任何一个连续函数都可以转化为多项式;第二种是用确定的函数拟合,需要先定义出函数表达式,这里采用logistic函数,因为从散点图可以看到这些散点大致分布在“S”形曲线的前半部分上,logistic函数表达式如下

python实现2019-nCoV疫情确诊数据拟合与预测_Python开发_02

其中

K为环境容量,即增长到最后,f(t)能达到的极限

P0为初始容量,就是t=0时刻的数量。

r为增长速率,r越大则增长越快,越快逼近K值,r越小增长越慢,越慢逼近K值。

首先定义出logistic函数,其中K,P0,r是待求的参数,然后调用from scipy.optimize里面的curve_fit函数进行拟合,会得到拟合参数,接着把拟合曲线也绘制出来

def logistic(t,K,P0,r): #定义logistic函数
exp_value=np.exp(r*(t))
return (K*exp_value*41)/(K+(exp_value-1)*41)

coef, pcov = curve_fit(logistic, t, confirm) #拟合
print(coef) #logistic函数参数
y_values = logistic(t,coef[0],coef[1],coef[2]) #拟合y值
plt.plot(t,y_values,color="blue",label="拟合曲线") #画出拟合曲线

python实现2019-nCoV疫情确诊数据拟合与预测_Python开发_03

第三步 预测

有了拟合曲线的参数就能够得到疫情变化函数表达式

python实现2019-nCoV疫情确诊数据拟合与预测_Python开发_04

其中 t t t是自变量,单位是天数, f f f因变量,表示是确诊人数,单位是人,该表达式表示随着天数的增加确诊人数的变化情况,大约2月11号左右出现平稳点,疫情得到有效控制。

python实现2019-nCoV疫情确诊数据拟合与预测_Python开发_05

完整代码

最后给出完整代码,可以不断注释掉去看

# -*- coding: utf-8 -*-
"""
Created on Wed Feb 5 20:09:38 2020
project name:2019-nCoV logistic模型
@author: 帅帅de三叔
"""
import numpy as np #导入数值计算模块
import pandas as pd #导入数据处理模块
import matplotlib.pyplot as plt #导入绘图模块
from scipy.optimize import curve_fit #导入拟合模块
plt.rcParams["font.sans-serif"]="SimHei" #黑体中文
plt.rcParams["axes.unicode_minus"]=False #显示负号
data=pd.read_csv("20200205病例.csv") #读取数据
date=data['date'] #日期
confirm=data['confirm'] #确诊数
t=range(len(confirm)) #构造横轴

fig=plt.figure(figsize=(10,4)) #建立画布
ax=fig.add_subplot(1, 1, 1)
ax.scatter(t,confirm, color="k", label="确诊人数") #真实数据散点图
#ax.set_xlabel("天数") #横坐标
ax.set_ylabel("确诊人数") #纵坐标
ax.set_title("确诊人数随时间变化情况") #标题
ax.set_xticklabels(['', '1月13号', '1月23号', '2月2号', '2月10号','2月20号'], rotation=30, fontsize=10) #自定义横坐标标签

def logistic(t,K,P0,r): #定义logistic函数
exp_value=np.exp(r*(t))
return (K*exp_value*41)/(K+(exp_value-1)*41)

coef, pcov = curve_fit(logistic, t, confirm) #拟合
print(coef) #logistic函数参数
y_values = logistic(t,coef[0], coef[1], coef[2]) #拟合y值
ax.plot(t,y_values,color="blue", label="拟合曲线") #画出拟合曲线

x=np.linspace(23,46,24) #构造期货日期
y_predict=logistic(x,coef[0], coef[1], coef[2]) #未来预测值
ax.scatter(x,y_predict, color="green",label="未来预测") #未来预测散点
ax.legend() #加标签


如果你不会写代码或直接只想要数据的话可以关注“三行科创”公众号,留个邮箱和所要数据名称,我发给你。

参考文献

1,​​python获取2019-nCoV疫情实时追踪数据​

2,python实现logistic增长模型拟合2019-nCov确诊人数

3,​​https://www.zhihu.com/question/36714044?sort=created​

python实现2019-nCoV疫情确诊数据拟合与预测_Python开发_06