Python编程学习笔记 - 下载数据进行可视化(I)

0. 前言

两种常见的数据存储格式是CSV和JSON。

我们将使用Python模块csv来处理以CSV(逗号分隔的值)格式存储的天气数据,找出两个不同地区在一段时间内的最高温度和最低温度。然后,我们将使用matplotlib根据下载的数据创建一个图表,展示阿拉斯加锡特卡地区的气温变化。

在后面,我们将使用模块json来访问以JSON格式存储的交易收盘价数据,并使用Pygal来绘制图形以探索价格变化的周期性。

通过本章,我们将能够处理各种类型和格式的数据集,并对如何创建复杂的图表有更多深入的认识,要处理各种真实世界的数据集,必须能够访问并可视化各种类型和格式的在线数据。

1. CVS文件格式

要在文本文件中存储数据,最简单的方式是将数据作为一系列以逗号分隔的值(CSV)写入文件。这样的文件称为CSV文件。例如,下面是一行CSV格式的天气数据:

2014/1/5,44,42,41,42,36,32,97,77,63,30.2,30.02,29.88,10,8,2,26,17,36,0.37,8,Rain,113

这是阿拉斯加锡特卡2014年1月5日的天气数据,其中包含当天的最高气温和最低气温,还有其他数据。

1.1 分析CVS文件头

csv模块包含在Python标准库中,可用于分析CSV文件中的数据行。

文件highs_lows.py 的代码

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包含函数next(),返回文件的下一行,返回的数据存储在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 VisibilityMi
les’, ’ Mean VisibilityMiles’, ’ Min VisibilityMiles’, ’ Max Wind SpeedMPH’, ’ Mean Wind SpeedMPH’, ’ Max Gust SpeedMPH’, ‘PrecipitationIn’,
’ CloudCover’, ’ Events’, ’ WindDirDegrees’]

从上面可见,所有的数据都是在一个列表中,每项数据(元素)都是字符串。

1.2 打印文件头及其位置

为了让文件头数据更容易理解,将列表中的每个文件头及其位置打印出来:

import csv
    
filename = 'sitka_weather_07-2014.csv'

with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

for index, column_header in enumerate(header_row, 0):
    print(index, column_header)

我们对列表调用了enumerate()来获取每个元素的索引及其值。输出如下:

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列。为研究这些数据,我们将处理sitka_weather_07-2014.csv中的每行数据,并提取其中索引为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)

    highs = []
    for row in reader:
        highs.append(int(row[1]))
    print(highs)

我们创建了空列表highs,再遍历文件中余下的各行。下面显示了列表highs现在存储的数据:
[‘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能够读取它们,我们将数字字符串转换为整数:

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

    highs = []
    for row in reader:
        highs.append(int(row[1]))
    print(highs)

最终的列表将包含以整数表示的每日最高气温:
[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 csv
from matplotlib import pyplot as plt
    
filename = 'sitka_weather_07-2014.csv'
    
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)

    highs = []
    for row in reader:
        highs.append(int(row[1]))

    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()

一个简单的折线图显示了阿拉斯加锡特卡2014年7月每天的最高气温:
在这里插入图片描述

1.5 模块datetime

下面再图表中添加日期,使其更有用。在天气数据文件中,第一个日期在第二行:
2014/7/1,64,56,50,53,51,48,96,83,58,30.19,30,29.79,10,10,10,7,4,0,7, ,337
读取该数据时,获取的是一个字符串,因为我们需要想办法将字符串‘2014/7/1’转换为一个表示相应日期的对象,可以使用模块datetime中的方法strptime()。相应的代码如下:

import datetime

    current_date = datetime.strptime(row[0], "%Y/%m/%d")
or
    current_date = datetime.strptime(row[0], "%Y-%m-%d")

1.6 在图表中添加日期

知道如何处理CSV文件中的日期后,就可以对气温图形进行改进了,即提取日期和最高气温,并将它们传递给plot(),如下所示:

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

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_date)
        highs.append(int(row[1]))
    
    fig = plt.figure(dpi=128, figsize=(10, 6))
    plt.plot(dates, highs, c='red')
    plt.title('Daily high temperatures, July 2014', fontsize=24)
    plt.xlabel('',fontsize=16)
    fig.autofmt_xdate()
    plt.ylabel('Temperature(F)', fontsize=16)
    plt.tick_params(axis='both',which='major',labelsize=16)

    plt.show()   

改进后的图表的x轴上有日期,含义更丰富,我们调用了fig.autofmt_xdate()来绘制斜的日期标签,以免他们彼此重叠,图标如下:
在这里插入图片描述

1.7 涵盖更长的时间

设置好图表后,我们来添加更多的数据,以生成一幅更复杂的锡特卡天气图。需要用文件sitka_weather_2014.csv。

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

filename = 'sitka_weather_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_date)
        highs.append(int(row[1]))
    
    fig = plt.figure(dpi=128, figsize=(10, 6))
    plt.plot(dates, highs, c='red')
    plt.title('Daily high temperatures - 2014', fontsize=24)
    plt.xlabel('',fontsize=16)
    fig.autofmt_xdate()
    plt.ylabel('Temperature(F)', fontsize=16)
    plt.tick_params(axis='both',which='major',labelsize=16)

    plt.show()

我们修改了文件名,以使用新的数据文件sitka_weather_2014.csv;我们还修改了图表的标题,以反映其内容的变化。下图显示了生成的锡特卡一年的最高气温的图形:
在这里插入图片描述

1.8 再绘制一个数据系列

我们可以在上图的基础上再添加最低气温数据,使其更有用。为此,需要从数据文件中提取最低气温,并将它们添加到图表中。

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

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)
        highs.append(int(row[1]))
        lows.append(int(row[3]))
    
    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)
    plt.xlabel('',fontsize=16)
    fig.autofmt_xdate()
    plt.ylabel('Temperature(F)', fontsize=16)
    plt.tick_params(axis='both',which='major',labelsize=16)

    plt.show()

我们添加了空列表lows,用于存储最低气温。接下来,我们从每行的第4列(row[3])提取每天的最低气温,并存储它们。我们添加了一个plot()的调用,以使用蓝色绘制最低气温。最后,我们修改了标题。下面显示了我们绘制的图表:
在这里插入图片描述

1.9 再绘制一个数据系列

添加了两个数据系列后,我们就可以了解每天的气温范围了,下面来给这个图做最后的修饰,通过着色来呈现每天的气温范围。为此,我们将使用方法fill_between(),它接受一个x值系列和两个y值系列,并填充两个y值系列之间的空间:

	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)

实参alpha指定颜色的透明度。alpha值为0表示完全透明,1(默认设置)表示完全不透明。通过将alpha设置为0.5,可让红色和蓝色折线的颜色看起来更浅。

我们向fill_between()传递了一个x值系列:列表dates,还传递了两个y值系列: highs和lows。实参facecolor指定了填充区域的颜色,我们还将alpha设置成了较小的值0.1,让填充区域将两个数据系列连接起来的同时不分散观察者的注意。下图显示了最高气温和最低气温之间的区域被填充的图表:
在这里插入图片描述

1.10 错误检查

有时候数据不完整或缺失能导致程序运行时产生错误,所以,我们对分析数据集时可能出现的异常进行处理:

	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)

对于每一行,我们都尝试从中提取日期、最高气温和最低气温。只要缺失其中一项数据,Python就会引发ValueError异常没,而我们可这样处理:打印一条错误信息,指出缺失数据的日期。打印错误消息后,循环将接着处理下一行。如果获取特定日期的所有数据时没有发生错误,将运行else代码块,并将数据附加到相应列表的末尾。

文章内容来自《Python编程 从入门到实践》 [美] Eric Matthes 袁国忠 译

Python学习笔记》是由皮大庆编写的一本关于Python语言学习的教材。在这本书中,作者详细介绍了Python语言的基础知识、语法规则以及常用的编程技巧。 首先,作者简要介绍了Python语言的特点和优势。他提到,Python是一种易于学习和使用的编程语言,受到了广大程序员的喜爱。Python具有简洁、清晰的语法结构,使得代码可读性极高,同时也提供了丰富的库和模块,能够快速实现各种功能。 接着,作者详细讲解了Python的基本语法。他从变量、数据类型、运算符等基础知识开始,逐步介绍了条件语句、循环控制、函数、模块等高级概念。同时,作者通过大量的示例代码和实践案例,帮助读者加深对Python编程的理解和应用。 在书中,作者还特别强调了编写规范和良好的编程习惯。他从命名规范、注释风格、代码缩进等方面指导读者如何写出清晰、可读性强的Python代码。作者认为,良好的编程习惯对于提高代码质量和提高工作效率非常重要。 此外,作者还介绍了Python的常用库和模块。他提到了一些常用的库,如Numpy、Pandas、Matplotlib等。这些库在数据处理、科学计算、可视化等领域有广泛的应用,帮助读者更好地解决实际问题。 总的来说,《Python学习笔记》是一本非常实用和全面的Python学习教材。通过学习这本书,读者可以系统地学习和掌握Python编程的基础知识和高级应用技巧,为以后的编程学习和工作打下坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值