欧洲疾病预防控制中心提供每日更新的全球 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 病例全球地理分布的数据页面。它应该类似于以下屏幕截图。
应该有下载 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 以及数据集中的内容。
运行熊猫命令
让我们首先看一下数据样本的样子。我通常会在打开某些内容时运行 head
和 tail
函数以找出前五行和后五行中包含的内容。
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
请注意,您还可以将整数传递给 head
或 tail
,例如 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 上创建此页面的源代码并提交拉取请求。