探索 COVID-19 新冠数据来学习 Pandas

Python中文社区

共 6651字,需浏览 14分钟

 ·

2020-08-07 07:00



欧洲疾病预防控制中心(https://www.ecdc.europa.eu/en)提供全球每日更新的COVID-19数据(https://www.ecdc.europa.eu/en/publications-data/download-todays-data-geographic-distribution-covid-19-cases-worldwide),这些数据可以用JSON,CSV或XML格式下载。在本教程中,我们将使用 pandas 数据分析工具来学习一些基本的 pandas 命令,并探索数据集中包含的内容。

配置开发环境

安装好Python3版本,本文中还须安装 pandas。可以通过以下命令将其安装到新的虚拟环境中:

python -m venv covidpandas
source covidpandas/bin/activate

pip install pandas

现在,我们准备获取COVID-19数据,并开始使用pandas进行分析。

获取COVID-19数据

在浏览器中,下载当前有关全球COVID-19病例地理分布的数据(https://www.ecdc.europa.eu/en/publications-data/download-todays-data-geographic-distribution-covid-19-cases-worldwide),屏幕截图如下。

将 CSV 数据导入 Pandas

COVID-19 数据存储在CSV中,现在我们需要将其导入pandas DataFrame中。我们需要先导入 pandas,以便我们可以读取下载的数据。

from pandas import read_csv

df = read_csv("covid-19-cases-march-28-2020.csv")

如果您遇到类似UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7...的报错信息,请不要担心,直接运行此命令以便 pandas 可以正确读取CSV。

# make sure the file name of the csv matches your file's name!
df = read_csv("covid-19-cases-march-28-2020.csv", encoding="ISO-8859-1")

现在,我们将数据加载到pandas DataFrame中,并且可以开始运行代码以生成数据集中的内容。

运行 Pandas 命令

首先让我们看一下数据样本的大致内容。当我打开某些东西以查找前五行和后五行中包含的内容时,通常会运行headtail函数。

df.head()

您应该看到 6 行输出:其中一列是列标题,另一列是CSV数据的前 5 行:

      dateRep  day  month  year  cases  deaths countriesAndTerritories geoId countryterritoryCode  popData2018
0  28/03/2020   28      3  2020     16       1             Afghanistan    AF                  AFG   37172386.0
1  27/03/2020   27      3  2020      0       0             Afghanistan    AF                  AFG   37172386.0
2  26/03/2020   26      3  2020     33       0             Afghanistan    AF                  AFG   37172386.0
3  25/03/2020   25      3  2020      2       0             Afghanistan    AF                  AFG   37172386.0
4  24/03/2020   24      3  2020      6       1             Afghanistan    AF                  AFG   37172386.0

tail函数查看DataFrame中的最后五行。

df.tail()

tail输出如下:

         dateRep  day  month  year  cases  deaths countriesAndTerritories geoId countryterritoryCode  popData2018
7315  25/03/2020   25      3  2020      0       0                Zimbabwe    ZW                  ZWE   14439018.0
7316  24/03/2020   24      3  2020      0       1                Zimbabwe    ZW                  ZWE   14439018.0
7317  23/03/2020   23      3  2020      0       0                Zimbabwe    ZW                  ZWE   14439018.0
7318  22/03/2020   22      3  2020      1       0                Zimbabwe    ZW                  ZWE   14439018.0
7319  21/03/2020   21      3  2020      1       0                Zimbabwe    ZW                  ZWE   14439018.0

注意您也可以像df.head(10)一样将整数传递到头部或尾部,以获取前n个行或后n个行。

根据尾函数,我们大约有7320行数据(因为第一行的索引为0)。我们可以使用count函数确认每一列中有多少数据。

df.count()

count的输出如下所示:

dateRep                    7320
day                        7320
month                      7320
year                       7320
cases                      7320
deaths                     7320
countriesAndTerritories    7320
geoId                      7306
countryterritoryCode       7254
popData2018                7311
dtype: int64

如果我们想查看这些列中的数据,并查找最高值怎么办?

df.cases.max()

在此数据集中,我们得到18695作为输出。如何查看所有列的标准统计值?这就是describe函数派上用场的地方。

describe提供了标准统计量度,例如数据集中所有数据的最小值,最大值,中位数和均值。在本例子中输出如下:

               day        month         year         cases       deaths   popData2018
count  7320.000000  7320.000000  7320.000000   7320.000000  7320.000000  7.311000e+03
mean     16.828142     2.249454  2019.990847     80.870355     3.687158  7.130483e+07
std       8.322981     1.256463     0.095239    608.270244    35.327689  2.140624e+08
min       1.000000     1.000000  2019.000000     -9.000000     0.000000  1.000000e+03
25%      10.000000     1.000000  2020.000000      0.000000     0.000000  4.137309e+06
50%      18.000000     2.000000  2020.000000      0.000000     0.000000  1.072767e+07
75%      24.000000     3.000000  2020.000000      5.000000     0.000000  5.139301e+07
max      31.000000    12.000000  2020.000000  18695.000000   971.000000  1.392730e+09

快速查看列的数据是否相互关联如何?corr函数是我们所需要的。

df.corr()

对于本例的数据集,corr输出如下:

                  day     month      year     cases    deaths  popData2018
day          1.000000  0.203006 -0.163665  0.063629  0.060075    -0.040677
month        0.203006  1.000000 -0.745912  0.062494  0.052707    -0.039131
year        -0.163665 -0.745912  1.000000  0.012715  0.010032    -0.006294
cases        0.063629  0.062494  0.012715  1.000000  0.716968     0.136580
deaths       0.060075  0.052707  0.010032  0.716968  1.000000     0.082229
popData2018 -0.040677 -0.039131 -0.006294  0.136580  0.082229     1.000000

毫不奇怪,我们看到列与其自身之间存在1.000000的相关性。如果我们没有看到那个结果,我们将不得不担心数据的准确性!对于其他列,查看它们的相关性可能没有意义。这是您需要考虑数据的地方。完全不相关的列之间通常存在关联,只是因为数据是以某种方式构造的。

如果您是像我这样的开发人员,并且没有严格的统计学背景,那么您可能需要先掌握自己的统计知识,然后才能说出数据中是否有问题。

让我们继续探索数据。我们可以选择列并确定其中包含多少个唯一项。例如,列出了多少个国家和地区?

df.countriesAndTerritories.nunique()

本例中的结果是196。

探索数据集

这些函数非常适合用于基本查询以了解数据集中的内容,但是我们如何通过将一些命令串在一起来提出实际问题呢?

由于我们使用了上面的count函数,我们现在知道该集合中有7320行。每行代表一个国家中一天的数据。现在问一个问题。在这些国家中,有多少天报告了10起或更多的病例?

让我们创建一个名为df2的新数据集,找出其中当天仅报告10个或更多案例的行,然后计算其中的行数。

df2 = df[df['cases']>=10]
df2.count()

本例中输出的值为1531。在列出的196个国家或地区中,每天有报告1531起10或更多COVID-19病例。但是1531这个数字很难向人们解释清楚含义。我们应该挑选一个国家,并显示一天有10或更多病例报告的次数。例如可以选取越南这个国家来看一下:

df2[df2['countriesAndTerritories']=='Vietnam']

按列输出完整的数据如下:

         dateRep  day  month  year  cases  deaths countriesAndTerritories geoId countryterritoryCode  popData2018
7217  28/03/2020   28      3  2020     16       0                 Vietnam    VN                  VNM   95540395.0
7219  26/03/2020   26      3  2020     14       0                 Vietnam    VN                  VNM   95540395.0
7220  25/03/2020   25      3  2020     11       0                 Vietnam    VN                  VNM   95540395.0
7222  23/03/2020   23      3  2020     24       0                 Vietnam    VN                  VNM   95540395.0
7226  19/03/2020   19      3  2020     15       0                 Vietnam    VN                  VNM   95540395.0

我们还可以在此处使用count函数来确认,到目前为止,越南已经有五天报告了10个或更多新病例:

df2[df2['countriesAndTerritories']=='Vietnam'].count()

我们得到列的输出为5,和前述吻合。

总结

本文导入并查看了欧洲疾病预防控制中心的COVID-19数据集。我们学习了一些基本的 Pandas 命令,建议您仔细阅读DataFrame文档列表(https://pandas.pydata.org/pandas-docs/stable/reference/frame.html),以了解该工具提供给开发人员的所有其他便捷功能。

更多 Pandas 相关的技术学习文章如下:


高性能 Pandas 方法:query 和 eval

骚操作!Pandas 还能用来写爬虫?

提升Pandas性能,让你的pandas飞起来!

Matt Makai-Learning pandas by Exploring COVID-19 Data




Python中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。


▼点击成为社区会员   喜欢就点个在看吧

浏览 43
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报