基於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 周小夏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章