Python学习for数据可视化项目(二)
图片后续添加
1 CSV文件格式
在文本文件中存储数据最简单的方式时将数据作为一系列**以逗号分隔的值(CSV)**写入。这样的文件被成为CSV文件。本部分将使用《Python编程:从入门到实践》的配套资源,来对阿拉斯加西特卡地区的天气数据进行分析,文件名为sitka_weather_07-2014.csv。
1.1 分析CSV文件头
csv模块包含在Python标准库中,可用于分析CSV文件中的数据行。
import csv
filename='sitka_weather_07-2014.csv'
#打开文件,将结果文件对象存储在f
with open(filename) as f:
#调用csv.reader()将文件对象传入,创建一个阅读器对象
reader=csv.reader(f)
#csv中的next()函数返回阅读器对象中的下一行
header_row=next(reader)
print(header_row)
所打开文件的第一行是与天气相关的文件头:
['AKDT', 'Max TemperatureF', 'Mean TemperatureF', 'Min TemperatureF', 'Max Dew PointF', 'MeanDew PointF', 'Min DewpointF', 'Max Humidity', ' Mean Humidity', ' Min Humidity', ' Max Sea Level PressureIn', ' Mean Sea Level PressureIn', ' Min Sea Level PressureIn', ' Max VisibilityMiles', ' Mean VisibilityMiles', ' Min VisibilityMiles', ' Max Wind SpeedMPH', ' Mean Wind SpeedMPH', ' Max Gust SpeedMPH', 'PrecipitationIn', ' CloudCover', ' Events', ' WindDirDegrees']
文件头AKDT 表示阿拉斯加时间(Alaska Daylight Time) , 其位置表明每行的第一个值都是日期或时间。 文件头Max TemperatureF 指出每行的第二个值都是当天的最高华氏温度。
注:文件头的格式并非总是一致,空格和单位可能出现在奇怪的地方,这在原始文件中很常见,不会带来问题。
1.2 打印文件头及其位置
使用**enumerate()**来获取每个元素的索引和值,以将列表中的每个文件头及其位置都打印出来:
import csv
filename='sitka_weather_07-2014.csv'
with open(filename) as f:
reader=csv.reader(f)
header_row=next(reader)
#print(header_row)
for index,columb_header in enumerate(header_row):
print(index,columb_header)
此时输出如下:
0 AKDT
1 Max TemperatureF
2 Mean TemperatureF
3 Min TemperatureF
4 Max Dew PointF
5 MeanDew PointF
6 Min DewpointF
7 Max Humidity
8 Mean Humidity
9 Min Humidity
10 Max Sea Level PressureIn
11 Mean Sea Level PressureIn
12 Min Sea Level PressureIn
13 Max VisibilityMiles
14 Mean VisibilityMiles
15 Min VisibilityMiles
16 Max Wind SpeedMPH
17 Mean Wind SpeedMPH
18 Max Gust SpeedMPH
19 PrecipitationIn
20 CloudCover
21 Events
22 WindDirDegrees
从中看出,时间在第0列,最高气温在第1列。故而为了分析时间和最高气温,应当处理文件中的每一行数据,提取出索引为0和1的值。
1.3 提取并读取数据
创建一个空列表,用一个循环来将每一行的最高气温存进列表。
import csv
filename='sitka_weather_07-2014.csv'
with open(filename) as f:
reader=csv.reader(f)
header_row=next(reader)
#print(header_row)
#for index,columb_header in enumerate(header_row):
#print(index,columb_header)
highs=[]
for row in reader:
highs.append(row[1])
print(highs)
注意:阅读器对象从其停留的地方继续往下读取CSV文件, 每次都自动返回当前所处位置的下一行。
由于之前已经用next()读取了文件头行, 程序中的循环将从第二行开始,而文件中从这行开始包含的是实际数据。
['64', '71', '64', '59', '69', '62', '61', '55', '57', '61', '57', '59', '57', '61', '64', '61', '59', '63', '60', '57', '69', '63', '62', '59', '57', '57', '61', '59', '61', '61', '66']
由于是在列表中使用了字符串保存天气的数据,为了让matplotlib可以读取,应当将其转换为数字。
上文程序中的循环部分改成:
for row in reader:
high=int(row[1])
highs.append(high)
此时数据为:
[64, 71, 64, 59, 69, 62, 61, 55, 57, 61, 57, 59, 57, 61, 64, 61, 59, 63, 60, 57, 69, 63, 62, 59, 57, 57, 61, 59, 61, 61, 66]
1.4 绘制气温图表
使用matplotlib来创建一个显示每日最高气温的折线图。
import matplotlib.pyplot as plt
--snip--#接上节代码
#设置分辨率和图片大小
fig=plt.figure(dpi=128,figsize=(10,6))
plt.plot(highs,c='red')
plt.title('Daily high temperatures,July 2014',fontsize=24)
plt.xlabel('',fontsize=16)
plt.ylabel('Temperature(F)',fontsize=16)
plt.tick_params(axis='both',which='major',labelsize=16)
plt.show()