用python制作動(dòng)態(tài)圖表看全球疫情變化趨勢(shì)
點(diǎn)擊上方“早起python”,關(guān)注公眾號(hào)
滿(mǎn)滿(mǎn)干貨,極速送達(dá)

一、前言
最近國(guó)內(nèi)疫情已經(jīng)有所好轉(zhuǎn),但是國(guó)外的情況不容樂(lè)觀(guān),那么怎樣用python去制作動(dòng)態(tài)圖表來(lái)看全球疫情變化趨勢(shì)呢?比如下面的國(guó)內(nèi)外疫情發(fā)展趨勢(shì)

還是全球疫情發(fā)展趨勢(shì)??

其實(shí)用python實(shí)現(xiàn)并不難,簡(jiǎn)單來(lái)說(shuō)就分為三步:
獲取數(shù)據(jù)(requests)
數(shù)據(jù)清洗(pandas)
數(shù)據(jù)可視化(pyecharts)
那么我們就來(lái)一點(diǎn)一點(diǎn)講解吧!
二、數(shù)據(jù)獲取與處理
疫情數(shù)據(jù)獲取并不是很難,在目前互聯(lián)網(wǎng)上已經(jīng)有許多提供數(shù)據(jù)的網(wǎng)站,比如丁香園、騰訊新聞、百度新聞等,為了省事直接GitHub上找找看有沒(méi)有現(xiàn)成的接口,很輕松就找到了丁香園數(shù)據(jù)的API,

接下來(lái)兩行命令就能拿下所有歷史數(shù)據(jù)
data?= requests.get('https://lab.isaaclin.cn/nCoV/api/area?latest=0')
data?= data.json()來(lái)看下數(shù)據(jù)

很明顯這樣的數(shù)據(jù)是沒(méi)有辦法去做分析的,所以接下來(lái)的重點(diǎn)就是如何清洗這一堆數(shù)據(jù),主要又分為下面兩塊:
數(shù)據(jù)整理:原始數(shù)據(jù)整理,由 json格式轉(zhuǎn)換為方便分析的dataframe格式
數(shù)據(jù)清洗:原數(shù)據(jù)由于API采集的機(jī)制。包含大量重復(fù)數(shù)據(jù)、無(wú)效數(shù)據(jù)、缺失數(shù)據(jù)所以需要對(duì)這些數(shù)據(jù)進(jìn)行處理
先來(lái)看下數(shù)據(jù)量

可以看到一共采集到了7584條數(shù)據(jù),由于臟數(shù)據(jù)比較多,所以這一部分的工作量是比較大的,因此我們不在這里使用太多篇幅去講如何一步一步提取出我們想要的數(shù)據(jù),會(huì)單獨(dú)寫(xiě)一篇數(shù)據(jù)處理過(guò)程的文章,不過(guò)還是來(lái)看看經(jīng)歷了哪些過(guò)程與代碼吧!
首先要將所有數(shù)據(jù)從字典提取出來(lái)并對(duì)時(shí)間戳進(jìn)行轉(zhuǎn)換,然后將數(shù)據(jù)保存到pandas里
data = requests.get('https://lab.isaaclin.cn/nCoV/api/area?latest=0')
data = data.json()
res?= data['results']
df = pd.DataFrame(res)
def time_c(timeNum):
????timeTemp = float(timeNum/1000)
????tupTime = time.localtime(timeTemp)
????stadardTime = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)
????return?stadardTime
for?i in range(len(df)):
????df.iloc[i,16] = time_c(df.iloc[i,16])
for?i in range(len(df)):
????df.iloc[i,16] = df.iloc[i,16][5:10]現(xiàn)在數(shù)據(jù)就成了這樣

這樣看起來(lái)就舒服多了,但是還是不可以使用,因?yàn)锳PI每天會(huì)采集很多次數(shù)據(jù),所以里面有很多重復(fù)數(shù)據(jù)和異常數(shù)據(jù),所以接下來(lái)重點(diǎn)處理這一部分。對(duì)于重復(fù)數(shù)據(jù)我們只保留最新一個(gè),對(duì)于空數(shù)據(jù)我們選擇前一天的數(shù)據(jù)填充。
#去重部分代碼
tem = df1[df1['updateTime'] == '03-02']
tem = tem.drop_duplicates(['provinceShortName'], keep='last')
for?i in?date[1:41]:
????tem1 = df1[df1['updateTime'] == i]
????tem1 = tem1.drop_duplicates(['provinceName'], keep='last')
????tem = tem.append(tem1)
tem = tem.reset_index(drop=True)
tem由于篇幅原因,就不再貼出更多的代碼,我們來(lái)看下最終處理完的數(shù)據(jù)

三、數(shù)據(jù)可視化
數(shù)據(jù)可視化,我們依舊選擇之前講解過(guò)很多次的pyecharts,主要使用的就是里面的Timeline:時(shí)間線(xiàn)輪播多圖,簡(jiǎn)單來(lái)說(shuō)就是在每一個(gè)時(shí)間點(diǎn)生成一張圖然后滾動(dòng)播放,有點(diǎn)像小時(shí)候的手繪小人書(shū)一樣,所以我們的數(shù)據(jù)就需要是時(shí)間序列數(shù)據(jù),那么具體關(guān)于怎樣使用,參數(shù)如何調(diào)整請(qǐng)關(guān)注后續(xù)單獨(dú)的可視化講解文章,直接看代碼與分析吧。首先是國(guó)內(nèi)外疫情趨勢(shì)
from?pyecharts.faker import?Faker
from?pyecharts import?options as?opts
from?pyecharts.charts import?Bar, Page, Pie, Timeline,Grid
def?timeline_bar()?-> Timeline:
????x = ['國(guó)內(nèi)','國(guó)外']
????tl = Timeline()
????tl = Timeline()
????tl.add_schema(is_auto_play = True,
????play_interval = 500,
????is_loop_play = False)
????k= 0
????for?i in?date:
????????bar = (
????????????Line()
????????????.add_xaxis(date)
????????????.add_yaxis("國(guó)內(nèi)", hs(c1,k))
????????????.add_yaxis("國(guó)外", hs(c,k))
????????????.extend_axis(
????????????yaxis=opts.AxisOpts(
????????????)
????????)
????????????.set_series_opts(
????????????areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
????????????label_opts=opts.LabelOpts(is_show=False),
????????)
????????????.set_global_opts(title_opts=opts.TitleOpts("{}國(guó)內(nèi)外疫情趨勢(shì)".format(i)))
????????)
????????tl.add(bar, "{}".format(i))
????????k = k + 1
????return?tl
timeline_bar().render_notebook()? ? ? ? ? ? ? ? ? ?
可以看出,國(guó)內(nèi)的增長(zhǎng)已經(jīng)處于平緩狀態(tài),而國(guó)外自二月底來(lái)突然爆發(fā),目前還處于上升期,這也是為什么現(xiàn)在要嚴(yán)防境外輸入病例。再來(lái)看看國(guó)外具體的病例占比吧(微信GIF只能上傳5M所以有點(diǎn)糊)

可以看出在最近幾天韓國(guó)、日本、意大利突然爆發(fā),這三個(gè)國(guó)家的病例數(shù)量就占到了約75%。最后再來(lái)看看全球疫情的變化趨勢(shì)吧!

四、結(jié)束語(yǔ)
PS:公號(hào)內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起?100 天計(jì)劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點(diǎn)一下,如果感覺(jué)文章內(nèi)容不錯(cuò)的話(huà),記得分享朋友圈讓更多的人知道!


【神秘禮包獲取方式】
