欧洲疾病预防控制中心(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 命令
首先让我们看一下数据样本的大致内容。当我打开某些东西以查找前五行和后五行中包含的内容时,通常会运行head
和tail
函数。
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万开发者关注。
▼点击成为社区会员 喜欢就点个在看吧