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 csvfilename = '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 csvfilename = '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 csvfilename = '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 csvfilename = '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 pltfilename = '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 datetimecurrent_date = datetime.strptime(row[0], "%Y/%m/%d")
orcurrent_date = datetime.strptime(row[0], "%Y-%m-%d")

1.6 在图表中添加日期

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

import csv
from matplotlib import pyplot as plt
from datetime import datetimefilename = '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 datetimefilename = '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 datetimefilename = '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编程学习笔记 - 下载数据进行可视化(I)相关推荐

  1. python编程学习笔记(三)

    五.if语句 1.示例 cars = ['audi','bmw','subaru','toyota'] for car in cars:if car=='bmw':print(car.upper()) ...

  2. python编程学习笔记列表_python编程:从入门到实践学习笔记-函数

    Python学习资料或者需要代码.视频加Python学习群:516107834 定义函数 举个简单的例子 由上所示,关键字def定义一个函数,后面跟着函数名以及用来输入参数的括号,定义以冒号结束,而p ...

  3. python编程学习笔记⑦-1函数

    函数是带名字的代码块 8.1定义函数 使用关键字def 告诉python你要定义一个函数. def greet_user():#()是必要的print("Hello!") gree ...

  4. python编程学习笔记_python编程:从入门到实践学习笔记-Django开发用户账户(一)...

    让用户能够输入数据(表单) 在创建用户账户身份验证系统之前,先添加几个页面,让用户能偶输入数据.添加新主题.添加新条目以及编辑既有条目. 添加新主题 1.用于添加主题的表单 创建一个forms.py文 ...

  5. python基础学习笔记之数据基本类型:逻辑值

    基本类型:逻辑值 → 判断与真值 → 逻辑运算 → 各种类型对应的真值 (一)逻辑(bool)类型 逻辑值仅包括真True/假False连个 用来配合if/while等语句作为条件判断 (二)与and ...

  6. 大数据第二阶段Python基础编程学习笔记(待完善)

    大数据第二阶段Python基础编程学习笔记(待完善) 第一章 Python基础语法 3.8 1-1Python概述 python基础部分: ●Python基础语法: 标识符,关键字,变量,判断循环.. ...

  7. 学习笔记之数据可视化(二)—— 页面布局(下)

    续上一章 2.7 地图区域(.map) 2.7.1 实现步骤: 2.8 用户统计模块 2.8.1 布局: 2.8.2 柱状图 2.9 订单模块 2.9.1 订单区域布局 2.9.2 订单区域(orde ...

  8. 学习笔记之数据可视化(一)——项目适配方案

    目录 最终效果展示 1. 数据可视化适配方案 1.1 项目需求 1.2 PC端适配方案 1.3 使用到的技术 2. 数据可视化项目开发 项目准备 1.1 文件准备 1.2 引入js和css文件 1.3 ...

  9. python数据挖掘学习笔记】十九.鸢尾花数据集可视化、线性回归、决策树花样分析

    #2018-04-05 16:57:26 April Thursday the 14 week, the 095 day SZ SSMR python数据挖掘学习笔记]十九.鸢尾花数据集可视化.线性回 ...

  10. 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程

    8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...

最新文章

  1. Linux学习笔记——Linux磁盘管理
  2. 【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )
  3. 关于layui-layer独立组件--弹出层
  4. 三组关键词,拆解2021年赤子城的中期业绩报告
  5. 线程间通讯机制(基础篇)——Handler、Runnable、HandlerThread、AsyncTask的使用
  6. python爬虫beautifulsoup_python爬虫初步之BeautifulSoup实战
  7. Android之SwipeRefreshLayout嵌套RecyclerView遇到的坑
  8. python图片重命名 工具_python - 请问django如何给上传的图片重命名
  9. 华为谈“不造车” ,每辆车上赚1万元。王兴:特斯拉终于遇到真正的对手!...
  10. Python的JAVA胶水——jpype
  11. 两个平面的位置关系和判定方程组解_必修二数学课后题答案
  12. 常用的科研论文作图软件
  13. 二元函数对xy同时求导_《高等数学》微课视频“二元函数的全微分求积”录音...
  14. 用过的几款步进电机驱动IC
  15. Excel 高阶学习视频收藏
  16. 异步时钟域的亚稳态问题和同步器(四)
  17. vue3.0 组件篇 Card
  18. 举办计算机知识竞赛的意义,计算机专业成功举办“计算机基础知识竞赛”
  19. [转]Java实现的求解经典罗马数字和阿拉伯数字相互转换问题示例
  20. flyway java_flyway中文教程

热门文章

  1. Java解决一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
  2. Linux下基于UDP协议实现的聊天室项目(附源码)
  3. 尼古拉斯·凯奇:名门传奇
  4. 网吧流媒体服务器系统,网吧视频点播服务器架设完全攻略流媒体服务器 -电脑资料...
  5. CondaSSLError: OpenSSL appears to be unavailable on this machine.
  6. Linux ssh 文件 authorized_keys 和 known_hosts
  7. 无线通信基础知识13:数字通信之信道编码
  8. 练习一万小时;2000-5000 小时计划和建议;现在开始!---读《异类》后刚好遇到的一篇文章
  9. 关于超实数单子的说明
  10. xzp android webview,加载gif动态图的三种方式