使用 Python 來可視化 COVID-19 預測
使用 Python 和一些圖形庫,你可以預測 COVID-19 確診病例總數,也可以顯示一個國家(本文以印度為例)在給定日期的死亡總數。人們有時需要幫助解釋和處理數據的意義,所以本文還演示了如何為五個國家創建一個動畫橫條形圖,以顯示按日期顯示病例的變化。
印度的確診病例和死亡人數預測
這要分三步來完成。
1、下載數據
科學數據並不總是開放的,但幸運的是,許多現代科學和醫療機構都樂於相互之間及與公眾共享信息。關於 COVID-19 病例的數據可以在網上查到,並且經常更新。
要解析這些數據,首先必須先下載。 https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv。
直接將數據載入到 Pandas DataFrame
中。Pandas 提供了一個函數 read_csv()
,它可以獲取一個 URL 並返回一個 DataFrame
對象,如下所示。
import pycountry
import plotly.express as px
import pandas as pd
URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv'
df1 = pd.read_csv(URL_DATASET)
print(df1.head(3)) # 獲取數據幀中的前 3 項
print(df1.tail(3)) # 獲取數據幀中的後 3 項
數據集的頂行包含列名。
Date
Country
Confirmed
Recovered
Deaths
head
查詢的輸出包括一個唯一的標識符(不作為列列出)和每個列的條目。
0 2020-01-22 Afghanistan 0 0 0
1 2020-01-22 Albania 0 0 0
1 2020-01-22 Algeria 0 0 0
tail
查詢的輸出類似,但包含數據集的尾端。
12597 2020-03-31 West Bank and Gaza 119 18 1
12598 2020-03-31 Zambia 35 0 0
12599 2020-03-31 Zimbabwe 8 0 1
從輸出中,可以看到 DataFrame(df1
)有以下幾個列:
- 日期
- 國家
- 確診
- 康復
- 死亡
此外,你可以看到 Date
欄中的條目從 1 月 22 日開始到 3 月 31 日。這個資料庫每天都會更新,所以你會有當前的值。
2、選擇印度的數據
在這一步中,我們將只選擇 DataFrame 中包含印度的那些行。這在下面的腳本中可以看到。
#### ----- Step 2 (Select data for India)-df_india = df1[df1['Country'] == 'India']
print(df_india.head(3))
3、數據繪圖
在這裡,我們創建一個條形圖。我們將把日期放在 X 軸上,把確診的病例數和死亡人數放在 Y 軸上。這一部分的腳本有以下幾個值得注意的地方。
plt.rcParams["figure.figsize"]=20,20
這一行代碼只適用於 Jupyter。所以如果你使用其他 IDE,請刪除它。- 注意這行代碼:
ax1 = plt.gca()
。為了確保兩個圖,即確診病例和死亡病例的圖都被繪製在同一個圖上,我們需要給第二個圖的ax
對象。所以我們使用gca()
來完成這個任務。(順便說一下,gca
代表 「 獲取當前坐標軸 」)
完整的腳本如下所示。
# Author:- Anurag Gupta # email:- 999.anuraggupta@gmail.com
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
#### ----- Step 1 (Download data)-URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv'
df1 = pd.read_csv(URL_DATASET)
# print(df1.head(3)) # Uncomment to see the dataframe
#### ----- Step 2 (Select data for India)-df_india = df1[df1['Country'] == 'India']
print(df_india.head(3))
#### ----- Step 3 (Plot data)-# Increase size of plot
plt.rcParams["figure.figsize"]=20,20 # Remove if not on Jupyter
# Plot column 'Confirmed'
df_india.plot(kind = 'bar', x = 'Date', y = 'Confirmed', color = 'blue')
ax1 = plt.gca()
df_india.plot(kind = 'bar', x = 'Date', y = 'Deaths', color = 'red', ax = ax1)
plt.show()
整個腳本可在 GitHub 上找到。
為五個國家創建一個動畫水平條形圖
關於 Jupyter 的注意事項:要在 Jupyter 中以動態動畫的形式運行,而不是靜態 png 的形式,你需要在單元格的開頭添加一個神奇的命令,即: %matplotlib notebook
。這將使圖形保持動態,而不是顯示為靜態的 png 文件,因此也可以顯示動畫。如果你在其他 IDE 上,請刪除這一行。
1、下載數據
這一步和前面的腳本完全一樣,所以不需要重複。
2、創建一個所有日期的列表
如果你檢查你下載的數據,你會發現它有一列 Date
。現在,這一列對每個國家都有一個日期值。因此,同一個日期會出現多次。我們需要創建一個只具有唯一值的日期列表。這會用在我們條形圖的 X 軸上。我們有一行代碼,如 list_dates = df[『Date』].unique()
。unique()
方法將只提取每個日期的唯一值。
3、挑選五個國家並創建一個 ax
對象。
做一個五個國家的名單。(你可以選擇你喜歡的國家,也可以增加或減少國家的數量。)我也做了一個五個顏色的列表,每個國家的條形圖的顏色對應一種。(如果你喜歡的話,也可以改一下。)這裡有一行重要的代碼是:fig, ax = plt.subplots(figsize=(15, 8))
。這是創建一個 ax
對象所需要的。
4、編寫回調函數
如果你想在 Matplotlib 中做動畫,你需要創建一個名為 matplotlib.animation.FuncAnimation
的類的對象。這個類的簽名可以在網上查到。這個類的構造函數,除了其他參數外,還需要一個叫 func
的參數,你必須給這個參數一個回調函數。所以在這一步中,我們會寫個回調函數,這個回調函數會被反覆調用,以渲染動畫。
5、創建 FuncAnimation
對象
這一步在上一步中已經部分說明了。
我們創建這個類的對象的代碼是:
my_anim = animation.FuncAnimation(fig = fig, func = plot_bar,
frames = list_dates, blit = True,
interval=20)
要給出的三個重要參數是:
fig
,必須給出一個 fig 對象,也就是我們之前創建的 fig 對象。func
,必須是回調函數。frames
,必須包含要做動畫的變數。在我們這裡,它是我們之前創建的日期列表。
6、將動畫保存為 mp4 文件
你可以將創建的動畫保存為 mp4 文件。但是,你需要 ffmpeg
。你可以用 pip
下載:pip install ffmpeg-python
,或者用 conda(在 Jupyter 上):install -c conda-forge ffmpeg
。
最後,你可以使用 plt.show()
運行動畫。請注意,在許多平台上,ffmpeg
可能無法正常工作,可能需要進一步「調整」。
%matplotlib notebook
# Author:- Anurag Gupta # email:- 999.anuraggupta@gmail.com
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from time import sleep
#### ---- Step 1:- Download data
URL_DATASET = r'https://raw.githubusercontent.com/datasets/covid-19/master/data/countries-aggregated.csv'
df = pd.read_csv(URL_DATASET, usecols = ['Date', 'Country', 'Confirmed'])
# print(df.head(3)) # uncomment this to see output
#### ---- Step 2:- Create list of all dates
list_dates = df['Date'].unique()
# print(list_dates) # Uncomment to see the dates
#### --- Step 3:- Pick 5 countries. Also create ax object
fig, ax = plt.subplots(figsize=(15, 8))
# We will animate for these 5 countries only
list_countries = ['India', 'China', 'US', 'Italy', 'Spain']
# colors for the 5 horizontal bars
list_colors = ['black', 'red', 'green', 'blue', 'yellow']
### --- Step 4:- Write the call back function
# plot_bar() is the call back function used in FuncAnimation class object
def plot_bar(some_date):
df2 = df[df['Date'].eq(some_date)]
ax.clear()
# Only take Confirmed column in descending order
df3 = df2.sort_values(by = 'Confirmed', ascending = False)
# Select the top 5 Confirmed countries
df4 = df3[df3['Country'].isin(list_countries)]
# print(df4) # Uncomment to see that dat is only for 5 countries
sleep(0.2) # To slow down the animation
# ax.barh() makes a horizontal bar plot.
return ax.barh(df4['Country'], df4['Confirmed'], color= list_colors)
###----Step 5:- Create FuncAnimation object------my_anim = animation.FuncAnimation(fig = fig, func = plot_bar,
frames= list_dates, blit=True,
interval=20)
### --- Step 6:- Save the animation to an mp4
# Place where to save the mp4. Give your file path instead
path_mp4 = r'C:Python-articlespopulation_covid2.mp4'
# my_anim.save(path_mp4, fps=30, extra_args=['-vcodec', 'libx264'])
my_anim.save(filename = path_mp4, writer = 'ffmpeg',
fps=30,
extra_args= ['-vcodec', 'libx264', '-pix_fmt', 'yuv420p'])
plt.show()
完整的腳本可以在 GitHub 上找到。
via: https://opensource.com/article/20/4/python-data-covid-19
作者:AnuragGupta 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive