Python 入门项目——《数据可视化》(二)


CSV 文件数据读取并生成图形

CSV 文件格式

在文本文件中存储数据,最简单的方式就是将数据按照一定的格式存放在文件中,在读取文件时根据设计好的格式去将对应数据读取出来,这样就能很方便的进行简单数据的分类存储和读取了。

CSV 文件格式就是这样一种有着固定的格式的文件格式,CSV 文件中保存的数据之间会以逗号分割开来。例如下图这样。

CSV 文件头

Python 模块 csv 包含在 Python 标准库中,可用于分析 CSV 文件中的数据行,使得能够快速提取文件中感兴趣的值。下面可以编写简单代码来查看这个文件中的文件头数据。

import csv

filename = 'sitka_weather_07-2014.csv'
with open(filename) as f:
	reader = csv.reader(f)
	header_row = next(reader)
	print(header_row)

在导入模块 csv 后,读取文件数据,并使用模块中的 reader (文件阅读器)对象读取文件信息,模块包含函数 next() ,调用它可以返回读取的阅读器对象的下一行内容,这里调用了一次,返回当前文件的文件头数据,使用 print() 将数据打印出来,如下图:
在这里插入图片描述

此时能够看出该文件的文件头数据内容,reader 处理文件中以逗号分隔的第一行数据,并将每项数据都作为一个元素存储在列表中。文件头 AKDT 表示阿拉斯加时间、其他数据都各有表示,分别对应文件中后面每一列中具体数据所代表的含义。

输出文件头位置信息

为了方便后面对文件进行数据提取可以直接提取到感兴趣的数据,在 CSV 文件中就需要准确的了解到对应数据所存放的列序号,所以首先需要输出文件头位置信息,从而了解到每一列所对应的数据含义,如下代码:

import csv

filename = 'sitka_weather_07-2014.csv'
with open(filename) as f:
	reader = csv.reader(f)
	header_row = next(reader)
	
	for index, colum_header in enumerate(header_row):
		print(index, colum_header)

在这里插入图片描述
从输出结果可以看出,日期数据和最高气温数据都存放在第0列和第1列。接下来就可以直接提取对应数据并绘制图表。

提取数据绘制图表

知道需要的数据存放在哪一列中,就可以直接去提取对应的列数据,代码如下:

import csv
from matplotlib import pyplot as plt

filename = 'death_valley_2014.csv'
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)
    highs = []
    for row in reader:
        try:
            high = int(row[1])
            highs.append(high)
        except ValueError:
            print('missing data')


# 根据数据绘制图形
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()


绘制如下图:

在这里插入图片描述

使用模块 datetime 提取时间信息

下面在图表中添加日期,使得图表显示的信息更有效。在数据文件中的日期数据是存在第二行,所以读取该数据获得一个字符串,通过使用 datetime 模块将字符串时间数据转换为更友好的时间显示方式,使用 datetime 模块中的 strptime() 方法。例如下面代码演示这样:

from datetime import datetime
first_data = datetime.strptime("2014-7-1", '%Y-%m-%d')
print(first_data)

输出显示如下:

在这里插入图片描述

下表列出了调用 strptime 方式接受的各种形式的实参及对应的格式:

实参
%A星期的名称,如 Monday
%B月份的名称,如 January
%m用数字表示的月份(01~02)
%d用数字表示月份中的一天(01~31)
%Y四位的年份,如2014
%y两位的年份,如 15
%H24小时制的小时数(00~23)
%I12小时制的小时数(01~12)
%pam 或 pm
%M分钟数(00~59)
%S秒数(00~61)

接下来就是在刚刚的代码中添加日期显示,需要完成提取日期信息并转换格式,最后加入图表作为 X坐标轴即可。

import csv
from datetime import datetime
from matplotlib import as plt

# 从文件中提取日期和最高气温
filename = 'sitka_weather_07-2014.csv'
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)
    dates, highs = [], []
    for row in reader:
        current_date = datetime.strptime(row[0], '%Y-%m-%d')
        dates.append(current_data)
        high = int(row[1])
        highs.append(high)

# 根据数据绘制图形
fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red')
plt.xlabel('', fontsize=16)
fig.autofmt_xdate()
plt.ylabel("Temperature (F)", fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=16)

plt.show()

显示结果如下图所示:

【图片】

添加低温数据曲线

前面绘制了高温数据变化曲线,同时在这个图表上添加低温的变化曲线以方便我们通过图表能清晰看到温度的具体变化情况,修改代码如下:

# 从文件中获取日期,最高气温和最低气温
filename = 'sitka_weather_2014.csv'
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)
    dates, highs, lows = [], [], []
    for row in reader:
        current_date = datetime.strptime(row[0], '%Y-%m-%d')
        dates.append(current_date)
        high = int(row[1])
        highs.append(high)
        low = int(row[3])
        lows.append(low)

# 根据数据绘制图形
fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red')
plt.plot(dates, lows, c='blue')

# 设置图形格式
plt.title('Daily high and low temperatures- 2014', fontsize=24)

显示如下:

【图片】

图表区域着色

在同时显示高温和低温后,能够看到每天温度的变化区间,如果在这个区域添加上颜色那么久会是图表显示更清晰。

import csv
from matplotlib import pyplot as plt
from datetime import datetime

filename = 'death_valley_2014.csv'
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)
    dates, highs, lows = [], [], []
    for row in reader:
        try:
            current_date = datetime.strptime(row[0], "%Y-%m-%d")
            high = int(row[1])
            low = int(row[3])
        except ValueError:
            print(current_date, 'missing data')
        else:
            dates.append(current_date)
            highs.append(high)
            lows.append(low)


# Plot data.
fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red', alpha=0.5)
plt.plot(dates, lows, c='blue', alpha=0.5)
plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)

# Format plot.
title = "Daily high and low temperatures - 2014\nDeath Valley, CA"
plt.title(title, fontsize=20)
plt.xlabel('', fontsize=16)
fig.autofmt_xdate()
plt.ylabel("Temperature (F)", fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=16)

plt.show()

如下图所示:

【图片】

添加错误检查

为了防止因为数据提取和处理不正常而影响程序的正常运行,需要对一些意外情况做一定的处理,也就是对容易出现的意外错误进行检查。

import csv
from matplotlib import pyplot as plt
from datetime import datetime

filename = 'death_valley_2014.csv'
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)
    dates, highs, lows = [], [], []
    for row in reader:
        try:
            current_date = datetime.strptime(row[0], "%Y-%m-%d")
            high = int(row[1])
            low = int(row[3])
        except ValueError:
            print(current_date, 'missing data')
        else:
            dates.append(current_date)
            highs.append(high)
            lows.append(low)


# Plot data.
fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red', alpha=0.5)
plt.plot(dates, lows, c='blue', alpha=0.5)
plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)

# Format plot.
title = "Daily high and low temperatures - 2014\nDeath Valley, CA"
plt.title(title, fontsize=20)
plt.xlabel('', fontsize=16)
fig.autofmt_xdate()
plt.ylabel("Temperature (F)", fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=16)

plt.show()


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值