通过探索 COVID-19 数据来学习熊猫

欧洲疾病预防控制中心提供每日更新的全球 COVID-19 数据,这些数据可以 JSON、CSV 或 XML 格式轻松下载。在本教程中,我们将对逗号分隔值 (CSV) 数据使用 pandas 数据分析工具来学习一些基本的 pandas 命令并探索数据集中包含的内容。

配置我们的开发环境

确保安装了 Python 3。截至目前,Python 3.8.2 是最新的。

在本教程中,我们还将使用 pandas。

现在使用以下命令将其安装到新的虚拟环境中:

python -m venv covidpandas
source covidpandas/bin/activate

pip install pandas

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

获取 COVID-19 数据

在您的网络浏览器中转到下载今天关于 COVID-19 病例全球地理分布的数据页面。它应该类似于以下屏幕截图。

下载 COVID-19 数据的 CSV 版本。

应该有下载 CSV 格式数据的链接,但该组织在过去几周内多次更改页面布局,这使得很难找到 Excel (XLSX) 以外的格式。如果您在获取 CSV 版本时遇到问题,只需从 GitHub 下载这个版本,它与 2020 年 3 月 28 日下载的副本挂钩。

将 CSV 文件导入 pandas

我们有 CSV 格式的数据,现在我们需要将其导入 pandasDataFrame。

首先运行 Python REPL:

python

>>>

REPL 已准备就绪,现在我们需要导入 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 中,可以开始运行代码来 poke 和 prod 以及数据集中的内容。

运行熊猫命令

让我们首先看一下数据样本的样子。我通常会在打开某些内容时运行 headtail 函数以找出前五行和后五行中包含的内容。

df.head()

您应该看到六行输出:一行作为列标题和 CSV 中的前五行数据:

      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

请注意,您还可以将整数传递给 headtail,例如 df.head(10) 以获取第一个或最后一个n 行数。

根据 tail 函数,我们似乎有大约 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 函数派上用场的地方。

df.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 的相关性。如果我们没有看到该结果,我们将不得不担心!对于其他列,查看它们的相关性可能没有意义。这是您需要考虑数据的地方。完全不相关的列之间通常存在关联,只是因为数据是以某种方式构建的。

如果你是像我这样的开发者,没有严格的统计背景(很久以前大学里的 Stats 200),你可能需要复习一下统计知识才能说数据中的某些内容是否重要。

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

df.countriesAndTerritories.nunique()

在这种情况下,结果应该是 196。

对数据提出问题

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

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

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

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

这应该为我们提供值 1531。在列出的 196 个国家或地区中,单日报告的 10 例或更多 COVID-19 病例有 1531 例。但 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。不幸的是,当您查看完整数据时,这些行似乎都是最新的,病毒才刚刚开始在那里更广泛地传播。让我们希望他们与其他所有国家一起能够扭转局势,拉平曲线,并在我们继续前进的过程中防止更多人生病。

这是一个结束的好地方,但我们在本教程中介绍了很多 pandas ground!

下一步是什么?

我们刚刚使用 pandas 导入并查看了欧洲疾病预防控制中心的 COVID-19 数据集中的内容。这是对一些基本 pandas 命令的快速浏览,我强烈建议您仔细阅读 DataFrame 文档列表以了解该工具为开发人员提供的所有其他便利功能。

您还可以通过阅读 Full Stack Python 目录页面了解在您的 Python 项目中接下来要编写什么代码。

有问题吗?通过 Twitter@fullstackpython 或@mattmakai 与我联系。我也在 GitHub 上,用户名是 mattmakai。

这篇文章有问题吗?在 GitHub 上创建此页面的源代码并提交拉取请求。

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏