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

思路


第一步,画出现有数据的散点图,大致了解其分布规律
第二步,利用现有数据拟合出曲线,求解拟合曲线的参数
第三步,利用拟合曲线对未来预测
下面严格按照这散布走模式进行

第一步 散点图


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

#散点图
fig=plt.figure(figsize=(16,8)) #建立画布
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号', '2月7号','2月13号','2月20号'], rotation=30, fontsize=12) #自定义横坐标标签
ax.set_xticklabels(['','1月13号', '1月23号', '2月2号', '2月10号','2月20号','3月1号','3月10号'], rotation=30, fontsize=10) #自定义横坐标标签

第二步 拟合


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

其中
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="拟合曲线") #画出拟合曲线

第三步 预测


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

在这里插入图片描述

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

最终图

预测数据

  category=OptimizeWarning)
[7.49955152e+04 1.00000000e+00 2.93414741e-01]

完整代码

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

# -*- coding: utf-8 -*-
"""
Created on Tue Feb 18 22:19:32 2020
project name:2019-nCoV logistic模型
@author: berlin
"""

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("./data/每日病例.csv") #读取数据
date=data['date'] #日期
confirm=data['confirm'] #确诊数
t=range(len(confirm)) #构造横轴

#散点图
fig=plt.figure(figsize=(16,8)) #建立画布
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号', '2月7号','2月13号','2月20号'], rotation=30, fontsize=12) #自定义横坐标标签
ax.set_xticklabels(['','1月13号', '1月23号', '2月2号', '2月10号','2月20号','3月1号','3月10号'], 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,66,36) #构造期货日期
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.https://blog.csdn.net/zengbowengood/article/details/104193518

发布了48 篇原创文章 · 获赞 23 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/BC_COM/article/details/104391300