目录
python项目2--【数据可视化】之下载数据
本章将从网上下载数据,并对其进行可视化。网上的数据多得令人难以置信,大多未经仔细检查。如果能够对这些数据进行分析,就能发现别人没有发现的规律。
本章将访问并可视化的数据以两种常见格式存储:CSV
和JSON
。我们将使用Python模块csv
来处理以CSV
格式存储的天气数据,找出两个地区在一段时间内的最高温度和最低温度。然后,使用Matplotlib
根据下载的数据创建一个图标,展示两个不同地区的温度变化:阿拉斯加州锡特卡和加利福利亚死亡谷。然后,使用模块json
访问以JSON
格式存储的地震数据,并使用Plotly
绘制一幅散点图,展示这些地震的位置和震级。
阅读本章后,将能够处理各种类型和格式的数据集,并对如何创建复杂的图表有深入的认识。要处理各种真实的数据集,必须能够访问并可视化各种类型和格式的在线数据。
一、CSV文件格式
要在文本文件中存储数据,一个简单方式是将数据作为一系列以逗号分隔的值(comma-separated values)写入文件。这样的文件称为CSV
文件。例如,下面是一行CSV
格式的天气数据。
"USWOOO25333", "sitka airport, AK US", "2018-01-01", "0.45", "48", "38"
这是阿拉斯加州锡特卡2018年1月1日的天气数据,其中包含当天的最高温度和最低温度,还有众多其他的数据。CSV
文件对人来说阅读起来比较麻烦。但程序可轻松提取并处理其中的值。有助于加快数据分析过程。
我们将首先处理少量CSV
格式的锡特卡天气数据,这些数据可在(ituring.cn/book/2784)中找到。请将文件sitka_weather_07-2018_simple.csv
复制到存储本章程序的文件夹中。
文件内容如下:
"STATION","NAME","DATE","PRCP","TAVG","TMAX","TMIN"
"USW00025333","SITKA AIRPORT, AK US","2018-07-01","0.25",,"62","50"
"USW00025333","SITKA AIRPORT, AK US","2018-07-02","0.01",,"58","53"
"USW00025333","SITKA AIRPORT, AK US","2018-07-03","0.00",,"70","54"
"USW00025333","SITKA AIRPORT, AK US","2018-07-04","0.00",,"70","55"
"USW00025333","SITKA AIRPORT, AK US","2018-07-05","0.00",,"67","55"
"USW00025333","SITKA AIRPORT, AK US","2018-07-06","0.00",,"59","55"
"USW00025333","SITKA AIRPORT, AK US","2018-07-07","0.00",,"58","55"
"USW00025333","SITKA AIRPORT, AK US","2018-07-08","0.00",,"62","54"
"USW00025333","SITKA AIRPORT, AK US","2018-07-09","0.00",,"66","55"
"USW00025333","SITKA AIRPORT, AK US","2018-07-10","0.44",,"59","53"
"USW00025333","SITKA AIRPORT, AK US","2018-07-11","0.29",,"56","50"
"USW00025333","SITKA AIRPORT, AK US","2018-07-12","0.02",,"63","49"
"USW00025333","SITKA AIRPORT, AK US","2018-07-13","0.00",,"65","48"
"USW00025333","SITKA AIRPORT, AK US","2018-07-14","0.32",,"58","52"
"USW00025333","SITKA AIRPORT, AK US","2018-07-15","0.75",,"56","52"
"USW00025333","SITKA AIRPORT, AK US","2018-07-16","0.61",,"59","52"
"USW00025333","SITKA AIRPORT, AK US","2018-07-17","0.00",,"64","52"
"USW00025333","SITKA AIRPORT, AK US","2018-07-18","0.16",,"60","53"
"USW00025333","SITKA AIRPORT, AK US","2018-07-19","0.14",,"60","53"
"USW00025333","SITKA AIRPORT, AK US","2018-07-20","0.00",,"61","56"
"USW00025333","SITKA AIRPORT, AK US","2018-07-21","0.00",,"65","55"
"USW00025333","SITKA AIRPORT, AK US","2018-07-22","0.00",,"65","54"
"USW00025333","SITKA AIRPORT, AK US","2018-07-23","0.00",,"63","54"
"USW00025333","SITKA AIRPORT, AK US","2018-07-24","0.00",,"59","52"
"USW00025333","SITKA AIRPORT, AK US","2018-07-25","0.00",,"64","52"
"USW00025333","SITKA AIRPORT, AK US","2018-07-26","0.00",,"65","58"
"USW00025333","SITKA AIRPORT, AK US","2018-07-27","0.00",,"68","58"
"USW00025333","SITKA AIRPORT, AK US","2018-07-28","0.00",,"66","56"
"USW00025333","SITKA AIRPORT, AK US","2018-07-29","0.00",,"64","56"
"USW00025333","SITKA AIRPORT, AK US","2018-07-30","0.00",,"67","58"
"USW00025333","SITKA AIRPORT, AK US","2018-07-31","0.00",,"65","56"
1. 分析CSV文件头
csv
模块包含在Python标准库中,可用于分析CSV
文件中的数据行,让我们能够快速提取感兴趣的值。先来查看这个文件的第一行,其中的一系列文件头指出了后续各行包含的是什么样的信息:
导入模块csv
后,将要使用的文件的名称赋给filename
。接下来,打开这个文件,并将返回的文件对象赋给f
。然后,调用csv.reader()
并将前面存储的文件对象作为实参传递给它,从而创建一个与该文件相关联的阅读器对象。这个阅读器对象被赋给了reader
。
模块csv
包含函数next()
,调用它并传入阅读器对象时,它将返回文件中的下一行。在上述代码中,只调用了next()
一次,因此得到的是文件的第一行,其中包含文件头。将返回的数据存储到header_row
中,如你所见,header_row
包含与天气相关的文件头,指出了每行都包含哪些数据。
reader
处理文件中以逗号分隔的第一行数据,并将没想数据都作为一个元素存储在列表中。文件头STATION
表示记录数据的气象站的编码。这个文件头的位置表明,每行的第一个值都是气象站编码。文件头NAME
指出每行的第二个值都是记录数据的气象站名称。其他文件头则指出记录了哪些信息。当前,我们最关心的是日期(DATE)
、最高温度(TMAX)
和最低温度(TMIN)
。这是一个简单的数据集,只包含降水量以及与温度相关的数据。你自己下载天气数据时,可选择涵盖众多测量值,如风速、风向以及详细的降水量数据。
2. 打印文件头及其位置
为了让文件头数据更容易理解,将列表中的每个文件头及其位置打印出来:
在循环中,对俩表调用了enumerate()
来获取每个元素的索引及其值。(请注意,我们删除了代码行print(header_row)
,转而显示这个更详细的版本)。
输出如下,指出了每个文件头的索引:
从中可知,日期和最高温度分别存储在第三列和第六列。为研究这些数据,我们将处理sitka_weather_07-2018_simple.csv
中的每行数据,并提取其中索引为2和5的值。
3. 提取并读取数据
知道需要哪些列中的数据后,我们来读取一些数据。首先,读取每天的最高温度:
创建一个名为highs
的空列表,再遍历文件中余下的各行。阅读器对象从其停留的地方继续往下读取CSV
文件,每次都自动返回当前所处位置的下一行。由于已经读取了文件头行,这个循环将从第二行开始——从这行开始包含的是实际数据。每次执行循环时,都将索引5
处(TMAX列)
的数据附加到highs
末尾。在文件中,这项数据是以字符串格式存储的,因此在附加到highs末尾前,使用函数int()
将其转换为数值格式,以便使用。
highs
现在存储的数据如下:
提取每天的最高温度并将其存储到列表中之后,就可以可视化这些数据了。
4. 绘制温度图表
为可视化这些温度数据,首先使用Matplotlib
创建一个显示每日最高温度的简单图形,如下所示:
将最高温度列表传给plot()
,并传递c='red'
以便将数据点绘制为红色。(这里使用红色显示最高温度,用蓝色显示最低温度。)接下来,设置了一些其他的格式,如名称和字号,这些都在之前的博客中介绍过。鉴于还没有添加日期,因此没有给x
轴添加标签,但ax.set_xlabel()
确实修改了字号,让默认标签更容易看清。下图显示了绘制的图表:一个简单的折线图,显示了阿拉斯加州锡特卡2018年7月的每日最高温度。