一、说明
本文讨论了如何使用 Python 使用 Pandas 库分析官方 COVID-19 病例数据。您将看到如何从实际数据集中收集见解,发现乍一看可能不那么明显的信息。特别是,本文中提供的示例说明了如何获取有关疾病在不同国家/地区传播速度的信息。
二、准备您的工作环境
要继续操作,您需要在 Python 环境中安装 Pandas 库。如果您还没有它,您可以使用 pip 命令安装它:
pip install pandas
然后,您需要选择一个实际的数据集来使用。对于本文中提供的示例,我需要一个数据集,其中包含按国家/地区和日期划分的COVID-19确诊病例总数的信息。这样的数据集可以从 Novel Coronavirus (COVID-19) Cases Data - Humanitarian Data Exchange 下载为CSV文件:time_series_covid19_confirmed_global_narrow.csv
三、加载数据并准备进行分析
在将下载的 CSV 文件读取到 pandas 数据帧之前,我手动删除了不必要的第二行:
#adm1+name,#country+name,#geo+lat,#geo+lon,#date,#affected+infected+value+num
然后我把它读到熊猫数据帧中:
>>> import pandas as pd
>>> df= pd.read_csv("/home/usr/dataset/time_series_covid19_confirmed_global_narrow.csv")
Let’s now take a closer look at the file structure. The simplest way to do it is with the head method of the dataframe object:
>>> df.head()
Province/State Country/Region Lat Long Date Value
0 NaN Afghanistan 33.0 65.0 2020–04–01 237
1 NaN Afghanistan 33.0 65.0 2020–03–31 174
2 NaN Afghanistan 33.0 65.0 2020–03–30 170
3 NaN Afghanistan 33.0 65.0 2020–03–29 120
4 NaN Afghanistan 33.0 65.0 2020–03–28 110
由于我们不打算执行考虑受影响国家在地理上彼此距离有多近的复杂分析,因此我们可以安全地从数据集中删除地理纬度和地理经度列。这可以按如下方式完成:
<span style="background-color:#f2f2f2"><span style="color:#242424">>>> df.drop("Lat", axis=1, inplace=True)
>>> df.drop("Long", axis=1, inplace=True)</span></span>
我们现在的内容应该如下所示:
>>> df.head()
Province/State Country/Region Date Value
0 NaN Afghanistan 2020–04–01 237
1 NaN Afghanistan 2020–03–31 174
2 NaN Afghanistan 2020–03–30 170
3 NaN Afghanistan 2020–03–29 120
4 NaN Afghanistan 2020–03–28 110
在我们开始删除不必要的行之前,了解数据集中有多少行也会很有趣:
>>> df.count
…[18176 rows x 4 columns]>
四、压缩数据集
浏览数据集中的行,您可能会注意到某些国家/地区的信息是按地区(例如中国)详细说明的。但您需要的是整个国家的合并数据。要完成此合并步骤,您可以按如下方式将 groupby 操作应用于数据集:
>>> df = df.groupby(['Country/Region','Date']).sum().reset_index()
此操作应该减少数据集中的行数,消除省/州列:
>>> df.count
...[12780 rows x 3 columns]
五、执行分析
假设您需要在初始阶段确定疾病在不同国家的传播速度。比如说,你想知道从至少报告1500例病例的那一天起,疾病达到100例需要多少天。
首先,您需要过滤掉受影响不大且确诊病例人数尚未达到大量国家/地区。这可以按如下方式完成:
>>> df = df.groupby(['Country/Region'])
>>> df = df.filter(lambda x: x['Value'].mean() > 1000)
然后,您可以仅检索满足指定条件的那些行:
>>> df = df.loc[(df['Value'] > 100) & (df['Value'] < 1500)]
完成这些操作后,应显著减少行数。
>>> df.count
… Country/Region Date Value
685 Austria 2020–03–08 104
686 Austria 2020–03–09 131
687 Austria 2020–03–10 182
688 Austria 2020–03–11 246
689 Austria 2020–03–12 302
… … … …
12261 United Kingdom 2020–03–11 459
12262 United Kingdom 2020–03–12 459
12263 United Kingdom 2020–03–13 802
12264 United Kingdom 2020–03–14 1144
12265 United Kingdom 2020–03–15 1145[118 rows x 3 columns]
此时,您可能需要查看整个数据集。这可以通过以下代码行完成:
>>> print(df.to_string())Country/Region Date Value
685 Austria 2020–03–08 104
686 Austria 2020–03–09 131
687 Austria 2020–03–10 182
688 Austria 2020–03–11 246
689 Austria 2020–03–12 302
690 Austria 2020–03–13 504
691 Austria 2020–03–14 655
692 Austria 2020–03–15 860
693 Austria 2020–03–16 1018
694 Austria 2020–03–17 1332
1180 Belgium 2020–03–06 109
1181 Belgium 2020–03–07 169…
剩下的就是计算每个国家/地区的行数。
>>> df.groupby(['Country/Region']).size()
>>> print(df.to_string())Country/Region
Austria 10
Belgium 13
China 4
France 9
Germany 10
Iran 5
Italy 7
Korea, South 7
Netherlands 11
Spain 8
Switzerland 10
Turkey 4
US 9
United Kingdom 11
上述清单回答了某个国家从报告至少1500例病例之日起,该疾病需要多少天才能达到大约100例确诊病例的问题。
六、后记
本系列文本,从这里开头,后边我们将陆续深入进行数据分析过程叙述。
Yuli Vasiliev – Medium