python模拟预测一下新型冠状病毒肺炎的数据

大家还好吗?

背景就不用多说了吧?本来我是初四上班的,现在延长到2月10日了。这是我工作以来时间最长的一个假期了。可惜哪也去不了。待在家里,没啥事,就用python模拟预测一下新冠病毒肺炎的数据吧。要声明的是本文纯属个人自娱自乐,不代表真实情况。

采用SIR模型,S代表易感者,I表示感染者,R表示恢复者。染病人群为传染源,通过一定几率把传染病传给易感人群,ta自己也有一定的几率被治愈并免疫,或死亡。易感人群一旦感染即成为新的传染源。

模型假设:

①不考虑人口出生、死亡、流动等情况,即人口数量保持常数。

②一个病人一旦与易感者接触就必然具有一定的传染力。假设 t 时刻单位时间内,一个病人能传染的易感者数目与此环境内易感者总数s(t)成正比,比例系数为β,从而在t时刻单位时间内被所有病人传染的人数为βs(t)i(t)。

③ t 时刻,单位时间内从染病者中移出的人数与病人数量成正比,比例系数为γ,单位时间内移出者的数量为γi(t)。
模型为

其中,β为感染系数,代表易感人群与传染源接触被感染的概率。γ为隔离(恢复)系数,我们对其倒数1/γ更感兴趣,代表了平均感染时间(average infectious period)。S(0)为初始易感人数,I(0)为初始感染人数。

按照[1]里面的代码模型的感染人数是这样的

现在的问题就是利用现有的数据找到新冠肺炎的β值,γ值等数据了。先把数据拔下来吧。从[3]上扒数据,由于数据不多,就手工完成吧。保存到csv文件里。

然后把数据作图

还有一个指标是再生数R0=β/γ,大于1时人群中大部分才被感染[4]。世卫组织1月23日的估计是R0在1.4到2.5之间[5],最新的根据前425例发病数据的估计值为2.2[6]。

文章[7]中的按一般病毒性肺炎恢复期25天计算得到的γ值为0.04。

关于β值和初始易感人群,[7]的作者采用的方法是先估计一个区间,然后用最小二乘法找到最佳参数,β≈3.57*10^-5。S[0]的范围为5000-30000人。[7]文章里有matlab代码,我用python改写一下,由于对最小二乘法法的实现比较陌生,尝试了半天,最后我决定用最笨的办法——穷举法。就是用两个嵌套循环将范围内所有β值和S0值都试一遍,计算每次尝试结果与实际数据之间差值的平方和,平方和最小的一组β值和S0值用来做预测。代码如下:

γ值设定为0.04,即一般病程25天

用最小二乘法估计β值和初始易感人数

gamma = 0.04
S0 = [i for i in range(20000, 40000, 1000)]
beta = [f for f in np.arange(1e-7, 1e-4, 1e-7)]
# 定义偏差函数
def error(res):
 err = (data["感染者"] - res)**2
 errsum = sum(err)
 return errsum

# 穷举法,找出与实际数据差的平方和最小的S0和beta值
minSum = 1e10
minS0 = 0.0
minBeta = 0.0
bestRes = None

for S in S0:
 for b in beta:
  # 模型的差分方程
  def diff_eqs_2(INP, t):
   Y = np.zeros((3))
   V = INP
   Y[0] = -b * V[0] * V[1]
   Y[1] = b * V[0] * V[1] - gamma * V[1]
   Y[2] = gamma * V[1]
   return Y

  # 数值解模型方程
  INPUT = [S, I0, 0.0]
  RES = spi.odeint(diff_eqs_2, INPUT, t_range)
  errsum = error(RES[:21, 1])
  if errsum < minSum:
   minSum = errsum
   minS0 = S
   minBeta = b
   bestRes = RES
   print("S0=%d beta=%f minErr=%f" % (S, b, errsum))
print("S0 = %d β = %f" % (minS0, minBeta))

结果 S0 = 39000, β = 8e-6

上述程序耗时较长,只在探索时执行,完了就注释掉,用最优参数进行预测。


预测最大感染人数:23769 时间是在1月10日的33天后,也就是2月12日。

本文代码:https://github.com/zwdnet/2019-nCov-SIRmodel

与[7]作者讨论,我的算法是将S0与β作为独立的两个变量用两个循环嵌套分别遍历,他的做法是用每个S0的值代入微分方程算出相应的β值。他的算法应该更好一些,我正在尝试。另外在微信公众号上看到一篇更系统的关于此次疫情的数学模型的文章:https://mp.weixin.qq.com/s/rgaJtA4jioLOCHs_oCauDg

再次声明:本文只是我个人在家无聊的游戏作品,不是正儿八经的预测。我也不是流行病学专业人士。祝疫情早日结束!武汉加油!中国加油!

总结

以上所述是小编给大家介绍的python模拟预测一下新型冠状病毒肺炎的数据,希望对大家有所帮助!

(0)

相关推荐

  • 使用Python制作新型冠状病毒实时疫情图

    最近一周每天早上起来第一件事,就是打开新闻软件看疫情相关的新闻.了解下自己和亲友所在城市的确诊人数,但纯数字还是缺乏一个直观的概念.那我们来做一个吧. 至于数据,从各大网站的实时疫情页面就可以拿到.以某网站为例,用requests拿到html后,发现并没有数据.不要慌,那证明是个javascript渲染的页面,即使是javascript也是需要从后台取数据的.打开Chrome开发者工具,点开network,刷新页面,点击各个请求,肯定有一个是取json的. 注意这里的返回数据是包含在一个js变量

  • python模拟预测一下新型冠状病毒肺炎的数据

    大家还好吗? 背景就不用多说了吧?本来我是初四上班的,现在延长到2月10日了.这是我工作以来时间最长的一个假期了.可惜哪也去不了.待在家里,没啥事,就用python模拟预测一下新冠病毒肺炎的数据吧.要声明的是本文纯属个人自娱自乐,不代表真实情况. 采用SIR模型,S代表易感者,I表示感染者,R表示恢复者.染病人群为传染源,通过一定几率把传染病传给易感人群,ta自己也有一定的几率被治愈并免疫,或死亡.易感人群一旦感染即成为新的传染源. 模型假设: ①不考虑人口出生.死亡.流动等情况,即人口数量保持

  • Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例

    运行结果(2020-2-4日数据) 数据来源 news.qq.com/zt2020/page/feiyan.htm 抓包分析 日报数据格式 "chinaDayList": [{ "date": "01.13", "confirm": "41", "suspect": "0", "dead": "1", "heal&qu

  • Python 写了个新型冠状病毒疫情传播模拟程序

    病毒扩散仿真程序,用 python 也可以. 概述 事情是这样的,B 站 UP 主 @ele 实验室,写了一个简单的疫情传播仿真程序,告诉大家在家待着的重要性,视频相信大家都看过了,并且 UP 主也放出了源码. 因为是 Java 开发的,所以开始我并没有多加关注.后来看到有人解析代码,发现我也能看懂,然后就琢磨用 Python 应该怎么实现. Java 版程序浅析 一个人就是 1 个(x, y)坐标点,并且每个人有一个状态. public class Person extends Point {

  • Python3实现监控新型冠状病毒肺炎疫情的示例代码

    代码如下所示: import requests import json from pyecharts.charts import Map, Geo from pyecharts import options as opts from pyecharts.globals import GeoType, RenderType url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5' datas = json.loads(reque

  • Python实现实时数据采集新型冠状病毒数据实例

    Python实时数据采集-新型冠状病毒 源代码 来源:https://github.com/Programming-With-Love/2019-nCoV 疫情数据时间为:2020.2.1 项目相关截图: 全国数据展示 国内数据展示 国外数据展示 查看指定区域详细数据 源代码,注意安装所需模块(例如 pip install 模块名) import requests import re from bs4 import BeautifulSoup from time import sleep imp

  • 基于python模拟TCP3次握手连接及发送数据

    源码如下 from scapy.all import * import logging logging.getLogger('scapy.runtime').setLevel(logging.ERROR) target_ip = '192.168.1.1' target_port = 80 data = 'GET / HTTP/1.0 \r\n\r\n' def start_tcp(target_ip,target_port): global sport,s_seq,d_seq #主要是用于TC

  • PHP实现新型冠状病毒疫情实时图的实例

    我们先来看一下运行图 下面我们来看源代码: <?php //抓取抖音的接口数据 global $nCov_data; $nCov_data['data']=get_nCoV_douyin_news(); $nCov_data['total']=get_nCoV_douyin_total(); function get_nCoV_douyin_news(){ $content=@file_get_contents('https://i.snssdk.com/api/feed/forum_flow/

  • Python爬取新型冠状病毒“谣言”新闻进行数据分析

    一.爬取数据 话不多说了,直接上代码( copy即可用 ) import requests import pandas as pd class SpiderRumor(object): def __init__(self): self.url = "https://vp.fact.qq.com/loadmore?artnum=0&page=%s" self.header = { "User-Agent": "Mozilla/5.0 (iPhone;

  • node爬取新型冠状病毒的疫情实时动态

    写在前面: 新型冠状病毒有多么可怕,我想大家都已经知道了.湖北爆发了新型冠状病毒,湖南前几天爆发了禽流感,四川发生地震,中国加油!昨天晚上我突发奇想地打算把疫情实时动态展示在自建站上,于是说干就干(先附上昨晚用puppeteer截的图片). 安装node_modules: 所需的node_modules:①puppeteer:②cheerio:③fs:④cron. 需要注意的是安装puppeteer的时候很容易安装失败,这里有俩个解决方法,都是用淘宝源(马云爸爸不是白叫的

随机推荐