用 Python可視化神器 Plotly
動態演示全球疫情變化趨勢
各位同學早上好,我是 Lemonbit 。
近期對疫情數據進行可視化的內容比較多,今天我來用 Python 可視化申請 Plotly 對國外的疫情發展情況進行可視化,以項目實戰的形式,在分析和了解國外疫情變化趨勢的同時,加深大家對 Plotly 的學習應用。
在開始之前,我們先來看看最終制作的部分效果圖,如果你覺得有興趣,不妨繼續往下看。
數據來源
國內的疫情,目前已逐步受到控制,各項指標已開始明顯好轉,但國外的情況,看起來不是太樂觀,已有的作業也沒有抄好,所以,本次我們主要來可視化分析國外疫情的發展情況。
疫情的數據來源於開源項目 Akshare,由於使用該項目獲取數據時,有時不太穩定,可能會遇到連接失敗的情況,所以,這裡我提供了保存好的數據供大家使用。
準備工作
照例,還是先介紹下我運行的環境
- Mac 系統
- Anaconda(Python 3.7)
- Jupyter Notebook
本次使用到的 Python 庫包括 akshare, pandas, plotly 等,導入如下:
<code>import akshare as ak
import pandas as pd
import plotly
from plotly.offline import iplot, init_notebook_mode
import plotly.express as px
from datetime import datetime
init_notebook_mode()
/<code>
接著,我們讀取已獲得的數據,已保存的數據是截至3月7日的。
<code># 從 akshare 獲取數據
# df_all_history = ak.epidemic_history()
# 從csv文件獲取數據
df_all_history = pd.read_csv('epidemic_all_20200307.csv',index_col=0)
df_all_history
/<code>
從上面獲取的數據,有些數據格式需要加以調整,對於日期,我們這裡會組織兩列數據,一列是時間格式的日期( ['date']),一列是字符串格式的日期 ( ['dates'])。這樣設置的原因,是因為我們後續分別需要用到這兩種格式的日期。
<code>df_all = df_all_history
# 將字符串格式的日期 另保存為一列
df_all['dates'] = df_all_history['date']
# 將字符串格式的日期轉換為 日期格式
df_all['date'] = pd.to_datetime(df_all['date'])
/<code>
獲取國外的疫情數據
上面的數據,是全球的數據,我們可以把其中屬於中國的剔除,就可以得到國外的數據了。
<code># 國外,按國家統計
df_oversea = df_all.query("country!='中國'")
df_oversea.fillna(value="", inplace=True)
df_oversea
/<code>
先來用 plotly express 看下國外疫情分國家的整體走勢。
<code># 國外,按國家統計
df_oversea = df_all.query("country!='中國'")
df_oversea.fillna(value="", inplace=True)
df_oversea
/<code>
從上圖可以看出,國外的疫情發展情況,大部分國家從2月10日期,發展趨勢較為明顯,因此,後面我們重點分析這段時間之後的情況。
<code># 現有數據演示從 2020年2月10日開始
df_overseadf_oversea_recent = df_oversea.set_index('date')
df_oversea_recentdf_oversea_recent = df_oversea_recent['2020-02-10':]
df_oversea_recent
/<code>
由於部分國家的數據不是從2020年2月10日開始記錄的,所以要補充數據。我們可以手動新建一個 excel數據表,將補充日期的數值填充為 0 。
我這裡主要補充的是伊朗的數據,因為伊朗實在是發展太快了,必須納入分析的範圍內。其他國家,如果有需要補充的,後續可以繼續完善。
<code># 由於部分國家,數據不是從2020年2月10日開始的,所以要補充數據,數值為 0
# 數據在 excel 表格中進行補充,這裡進行讀取
df_oversea_buchong = pd.read_excel('epidemic_buchong.xlsx')
df_oversea_buchong['dates'] = df_oversea_buchong['date'].apply(lambda x:x.strftime('%Y-%m-%d'))
df_oversea_buchong.set_index('date', inplace=True)
df_oversea_buchong.fillna(value="", inplace=True)
print(df_oversea_buchong.info())
df_oversea_buchong
/<code>
將需要補充的數據弄好後,我們可以合併上面這兩部分數據,一起進行分析。
<code># 合併補充數據
df_oversea_recentdf_oversea_recent_new = df_oversea_recent.append(df_oversea_buchong)
df_oversea_recent_new.sort_index(inplace=True)
df_oversea_recent_new
/<code>
得到合併的數據後,首先,我們用氣泡圖來對變化情況進行可視化,這裡用的是 plotly express 的散點圖。
plotly express 現在已經合併到 plotly 中,個人覺得跟 plotly 原生內容的協同性相對 cufflinks 要好用點。
<code># 合併補充數據
df_oversea_recentdf_oversea_recent_new = df_oversea_recent.append(df_oversea_buchong)
df_oversea_recent_new.sort_index(inplace=True)
df_oversea_recent_new
/<code>
從上面這個動態圖可以清晰的看出,當前,在海外的國家中,韓國、伊朗、意大利三個國家最為嚴重。這三個國家中,就增長趨勢而言,伊朗和意大利又比韓國要更明顯,目前韓國的增長有所放緩,而伊朗和意大利還處於快速增長的過程中,後續情況不容樂觀。
此外,在這個圖中,另外還有幾個國家值得關注,日本,除去鑽石號之外,從數據來看,本土的增長目前還算是在稍微較好的範圍內。反倒是,德國、法國、西班牙,個人覺得已成逐步壯大之勢,不得不防。
而且,由於整個歐盟國家之間,人員是自由流通的,現在看來,整個歐盟很可能會成為疫情的重災區,其影響巨大。
上圖左下角的這些國家的走勢,我們可以拉近來看,走勢如下,這樣,對於 德國、法國、西班牙就會看的更明顯了。
這裡,還有一個國家,就是美國,雖然從數據以及增長情況來看,好像美國還好,但恐怕實際情況,要糟糕很多。
上面是以氣泡圖的方式來演示變化過程,我們也可以以柱狀圖的形式來演示,效果如下:
關於上面的效果圖,各位可以自行研究下,歡迎交流。
需要說明的是,本文代碼是在 Jupyter Notebook 中運行的, 如果是在 PyCharm 等 IDE 中運行,需要稍微修改下代碼。
最後,再次感謝開源項目 Akshare 提供了數據接口。其次就是中國才是最安全 最溫暖人心的港灣~
源碼需要的可私信我01即可~
閱讀更多 地表嘴強程序員 的文章