基于python的新型冠状肺炎患病人数预测

基于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:算法选用所存在的误差:每种算法都会存在多多少少的误差,我所选用的亦然,但能与实际数据接近,也是“万幸”

第二部分 代码实现与效果展示

一:数据获取

img

我们分析一下请求头可知: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

在这里简介一下二次指数平滑法:

首先:指数平滑法是一种特殊的加权平均法,有一次,二次,三次指数平滑法,至于为什么选用二次指数平滑法,这里不做赘述,其中二次指数平滑法的公式为:

S{(2)}_{t}=aS{(1)}_t+(1-a)S_{t-1}^{(2)}  (1)

式中:S{(2)}_{t},S{(2)}_{t-1}分别为t期和t–1期的二次指数平滑值;a为平滑系数。在S^{(1)}_{t}S^{(2)}_{t}已知的条件下,二次指数平滑法的预测模型为:

\hat{Y}_{t+T}=a_t+b_t\cdot T  (2)

S_{t}{(2)}=aS{(1)}_{t}+(1-a)S^{(2)}_{t-1}

\begin{cases}a_t=2S{(1)}_{t}-S{(2)}_t\b_t=\frac{a}{1-a}\left(S{(1)}_t-S{(2)}_t\right)\end{cases}  (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 周小夏

发布了1 篇原创文章 · 获赞 3 · 访问量 243

猜你喜欢

转载自blog.csdn.net/qq_46098574/article/details/104166880