在昨天的文章『用python制作動態圖表看全球疫情變化趨勢』中,由於篇幅原因,在數據處理與數據可視化相關內容上我們只是簡單帶過,那么我將以python小小白的角度去還原如何處理數據與數據可視化。本文為第一篇:獲取數據並處理。
一、數據獲取
一開始就有一個問題擺在面前,疫情數據哪里獲取。雖然國內很多網站都提供了疫情的跟蹤報道,但是並沒有找到提供完整歷史數據的網站,所以想直接從網站爬數據的思路就暫時斷掉。不過沒關系,我們去GitHub上搜搜

選擇第一個並進去他的API說明頁面,找到我們要的歷史數據API

可以看到請求方式和接收的參數,於是我們就能得到獲取全球歷史數據的鏈接
https://lab.isaaclin.cn/nCoV/api/area?latest=0
然后用requests把數據拿下來就完成了第一步

二、數據處理
首先將存儲在字典里面的數據保存到dataframe中,使用pandas里面的pd.DataFrame()當傳進去一個字典形式的數據之后可以轉換為dataframe⬇️

現在緊接着又出現一個問題就是時間變量是以13位時間戳形式存儲的,所以要先將時間進行轉換

時間轉換我們選擇的是python里的time模塊,寫一個函數來轉換時間
def time_c(timeNum):
timeTemp = float(timeNum/1000)
tupTime = time.localtime(timeTemp)
stadardTime = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)
return stadardTime
接下來遍歷dataframe中所有的數據來將時間轉換

可以發現數據里有很多重復值,所以接下來要對這一部分進行處理。比如我們隨便選擇一個國家

可以看到每天可能有多條數據,而pandas里面有去重函數.drop_duplicates(),比如可以這樣用
data.drop_duplicates(subset=['A','B'],keep='first',inplace=True)
- 代碼中subset對應的值是列名,表示只考慮這兩列,將這兩列對應值相同的行進行去重。默認值為subset=None表示考慮所有列。
- keep='first'表示保留第一次出現的重復行,是默認值。keep另外兩個取值為"last"和False,分別表示保留最后一次出現的重復行和去除所有重復行。
- inplace=True表示直接在原來的DataFrame上刪除重復項,而默認值False表示生成一個副本
於是我們我們需要根據時間進行去重,也就是每天每個國家只保留一條數據,首先把所有時間取出來

然后根據時間進行去重,也就是每天只保留一條最新數據

這樣就完成了去重,我們將數據保存為Excel看看。
tem.to_excel('data.xlsx')
任意選擇一個國家,發現每天只有一條數據,搞定!

數據匯總
在上一步已經完成了數據去重,接下來進行數據匯總,比如如何得到分大洲匯總的數據。首先取出我們需要的數據和各大洲的名字

現在我們就需要各個大洲每天的疫情數據,這時就用到了pandas里面的分組計算函數.groupby()
# groupby 只進行分組,不會進行任何的計算操作
grouped = df["data1"].groupby(df["key1"])
可以按照上面的方法調用,按照某個key進行分組后可以針對結果進行一些統計⬇️
grouped.count() # 根據分組結果,計算每個分組下元素的個數
grouped.max() # 根據分組結果,計算每個分組下的最大值
grouped.mean()
grouped.size()
grouped.describe()
grouped.sum()
所以我們的分組匯總過程就應該這么寫

來看下提取的數據

雖然已經成功提取到了數據但是依舊有一個問題,並不是每天數據都是完整的,在疫情剛開始的時候,很多大洲並沒有數據,這會導致繪圖時的不便,而在之前的缺失值處理的文章中我們已經詳細的講解了如何處理缺失值。這所以我們在pandas中進行處理,將缺失值填充為0,這樣就搞定了。

四、結束語&彩蛋
回顧上面的過程,本次處理數據過程中使用的語法都是pandas中比較基礎的語法,當然過程中也有很多步驟可以優化。關於pandas中其他語法我們會在以后的技術解析文章中慢慢探討,最后彩蛋時間,有沒有更省事的獲取歷史數據的辦法?有,只需pip安裝akshare庫,然后兩行代碼就能獲取到整理好的疫情歷史數據
import akshare as ak
epidemic_hist_all_df = ak.epidemic_hist_all()
===========================
我的公眾號:早起python
