基于python的新型冠状肺炎患病人数预测
前言:
数据源 腾讯疫情实时追踪
操作算法单一:二次指数平滑法(会因算法不同以及算法中参数alpha不同而导致误差)
正在测试该算法中alpha的值及其对数据的拟合效果
使用不同的算法对数据预测可能会存在偏差,请勿传谣!
第一部分 效果展示与分析
(被标题遮挡部分:参数alpha = 0.99 预测2/03日新冠患病人数为20025人)
在这里解释一下完成所有预测时间为头天,2/03日从0点到24点的疫情数据是2/04日清晨发布
一大早起来看数据:患病:200471人(数据来自:腾讯疫情实时追踪,且自己使用的数据都是每日早晨8点的数据)
分析:预测值与算法中alpha = 0.99接近,由此可以推断预测成功,至于误差。对此有以下解释:
1:算法选用成功的情况:实时数据大于预测数据:极有可能是因为病毒在爆发期原因(据专家预测2月8日前几天迎来二次爆发期),佐证了这一猜想,即:疫情在这几天加剧,从数据可知:2/02日全天患病人数较昨日增长2800,而2/03日全天数据较昨日增长3235人(数据来自丁香医生),均超过了前几天的较昨日增长数。
2:算法选用所存在的误差:每种算法都会存在多多少少的误差,我所选用的亦然,但能与实际数据接近,也是“万幸”
第二部分 代码实现与效果展示
一:数据获取
我们分析一下请求头可知:name=disease_h5 是数据位置
callback=jQuery341021795676971428168_1580642523637_=1580642523638返回当前时间戳的一个函数,所以我们请求的URL为:https://view.inews.qq.com/g2/getOnsInfoname=disease_h5
二 算法代码实现:
def catch_daily():
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=wuwei_ww_cn_day_counts&callback=&_=%d' % int(
time.time() * 1000)
data = json.loads(requests.get(url=url).json()['data'])
data.sort(key=lambda x: x['date'])
return data
daily_data = pd.DataFrame(catch_daily())
daily_data.head()
返回的数据我们用pandas的DataFrame框架保存,我这里仅仅使用了确诊患者数据,另外:“疑似患者数据和治愈人数,死亡人数,和新增疑似和新增确诊和各省市的疫情数量分析”就是使用同样的方法进行获取分析,需要注意的是:数据结构比较复杂,一步一步打印出来看,先明白数据结构。
二次指数平滑法:
def compute_double(alpha, s):
'''
二次指数平滑
:param alpha: 平滑系数
:param s: 数据序列, list
:return: 返回二次指数平滑模型参数a, b, list
'''
s_single = compute_single(alpha, s)
s_double = compute_single(alpha, s_single)
a_double = [0 for i in range(len(s))]
b_double = [0 for i in range(len(s))]
c_double = [0 for i in range(len(s))]
d_double = [0 for i in range(len(s))]
for i in range(len(s)):
a_double[i] = 2 * s_single[i] - s_double[i] #计算二次指数平滑的a
b_double[i] = (alpha / (1 - alpha)) * (s_single[i] - s_double[i]) #计算二次指数平滑的b
c_double[i] = a_double[i]+b_double[i]
return a_double, b_double
在这里简介一下二次指数平滑法:
首先:指数平滑法是一种特殊的加权平均法,有一次,二次,三次指数平滑法,至于为什么选用二次指数平滑法,这里不做赘述,其中二次指数平滑法的公式为:
(1)
式中:分别为t期和t–1期的二次指数平滑值;a为平滑系数。在和已知的条件下,二次指数平滑法的预测模型为:
(2)
(3)
其中最重要的就是alpha的值,它是预测成功的关键,指数平滑法的长期预测效果差,多用于短期预测,而且对新数据转折点缺乏鉴别能力(但可以使用调查预测法或专家预测法加以弥补)
三 数据可视化
对于数据可视化,我们使用Pyecharts描绘柱状图和折线图,图形已经给出,下面我们看代码实现:
line = Line()
line.add_xaxis(date)
line.add_yaxis("参数alpha=0.99\n2/3日值为20025", data1)
line.add_yaxis("alpha=0.90\n2/3日值为19967", data2)
line.add_yaxis("alpha=0.80\n2/3日值为19870", data3)
line.add_yaxis("alpha=0.70\n2/3日值为19729", data4)
line.add_yaxis("alpha=0.60\n2/3日值为19522", data5)
line.add_yaxis("alpha=0.50\n2/3日值为19200", data6)
line.render("predict_line.html")
以及柱状图:
def bar() -> Bar: c = ( Bar({"theme": ThemeType.MACARONS}) .add_xaxis(list(daily_data["date"])) .add_yaxis("参数alpha=0.99", data1) .add_yaxis("alpha=0.90", data2) .add_yaxis("alpha=0.80", data3) .add_yaxis("alpha=0.70", data4) .add_yaxis("alpha=0.60", data5) .add_yaxis("alpha=0.50", data6) .set_global_opts( title_opts={"text": "新冠病毒患者预测\n--zxx(试行)"} ) ) return cbar().render("predict_bar.html")
这是一种很方便的数据可视化操作,再此安利给大家!
另外,大家在网上查看疫情时候的曲线图,柱状图也可以制作,如下:
这些图片制作方法也是如出一辙,如果感兴趣的,但又有疑问的可以在评论区提,我也是小白一枚。
国家有难,我们能做的最大贡献就是 在家躺着,但是躺归躺,学习不能落下,不要“收藏从未停止,行动从未开始!”做一个实业派,更重要!有朝一日也希望能像阿里巴巴达摩院一样,用AI技术分析疑似病例基因,缩短时长,为国捐力,用“算法抗疫”,医疗工作者在前线奔忙,科研工作者也同时地在奉献自己的一份力,
自此也想发自肺腑地送给深受疫情困扰地素未谋面的朋友,和正在一线为抗疫地可爱的人们一段话:
“抗疫”如一场修行 “得意”时 一日看尽长安花;艰难时,潦倒新停浊酒杯,
但抗战的跋涉不能回头! 哪怕 畏途巉岩不可攀,也要 会当临绝顶,
哪怕 无人会,登临意,也要猛志顾常在,在众人的团结中汲取 九万里风鹏正举的力量,
历练 也无风雨也无晴 的豁然 让我们全国人民一同 待到重阳日 还来就菊花 !
最后我基于昨日预测数据使用alpha参数为0.99进行未来几天预测(无有效控制方法前的预测,仅供参考)基于我的2/03日预测值为20025人患病,而实际值为200471(来自丁香医生2/04,8点时数据),预测可能会有偏差,有错我立马纠正,不喜勿喷!同样地我只做了患病(确诊人数)的预测,感兴趣的可以做疑似人员,死亡数和治愈数的预测!
---------- 上海第二工业大学 18智能A1 周小夏