专栏名称: VPointer
软件开发
目录
相关文章推荐
封面新闻  ·  刚刚!《哪吒2》全球第五! ·  昨天  
封面新闻  ·  刚刚!《哪吒2》全球第五! ·  昨天  
江苏新闻  ·  《哪吒2》,破150亿! ·  昨天  
中央戏剧学院就业创业指导中心  ·  南京林业大学诚邀依托申报海外优青 ·  2 天前  
中央戏剧学院就业创业指导中心  ·  外交部2025年招聘公告 ·  2 天前  
桃桃淘电影  ·  票房堪忧,奉俊昊科幻梦撞墙。 ·  5 天前  
51好读  ›  专栏  ›  VPointer

Python学习之路15-下载数据

VPointer  · 掘金  ·  · 2018-06-08 02:10

正文

Python学习之路15-下载数据

《Python编程:从入门到实践》笔记。

本篇是Python数据处理的第二篇,本篇将使用网上下载的数据,对这些数据进行可视化。

1. 前言

本篇将访问并可视化以两种常见格式存储的数据:CSV和JSON:

  • 使用Python的 csv 模块来处理以CSV(逗号分隔的值)格式存储的天气数据,找出两个不同地区在一段时间内的最高温度和最低温度;
  • 使用 json 模块来访问以JSON格式存储的交易收盘价数据。

本文数据均可从 图书官网 下载。

2. CSV文件格式

新建一个项目,将文件 death_valley_2014.csv 复制到项目根目录,并新建 highs_lows.py 文件,改程序读取加州死亡谷2014年的温度数据,提取出每天的最高和最低气温,并绘制出折线图:

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

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)

fig = plt.figure(dpi=141, figsize=(10, 6))
# 绘制最高气温折线图
plt.plot(dates, highs, c="red")
# 绘制最低气温折线图
plt.plot(dates, lows, c="blue")
# 填充两个折现之间的空间,alpha为透明度,0为全透明,1为不透明
plt.fill_between(dates, highs, lows, facecolor="blue", alpha=0.1)
plt.title("Daily high and low temperatures - 2014\nDeath Valley, CA", fontsize=20)
plt.xlabel("", fontsize=16)
# 自动排版x轴的日期数据,避免重叠
fig.autofmt_xdate()
plt.ylabel("Temperature(F)", fontsize=16)
plt.tick_params(axis="both", which="major", labelsize=16)

plt.show()

代码现将文件打开,然后通过 csv.reader() 函数创建一个CSV文件阅读器,参数就是刚才打开的文件;通过 next() 函数读取文件的一行,并自动将数据转换为列表;然后通过一个 for 循环读取全部数据。 for 循环中还添加了错误检查,以防文件中数据丢失等问题造成程序终止。我们还通过 fill_between() 函数将两个折现之间的区域着色。最后得到的图像如下:

同时我们还得到了一条信息输出:

2014-02-16 00:00:00 missing data

即该日的数据丢失了。

3. 制作交易收盘价走势图:JSON格式

现将将 btc_close_2017.json 拷贝到项目根目录下。本节中将绘制5幅图像:收盘折线图,收盘价对数变换,收盘价月日均值,收盘价周日均值,收盘价星期均值。均使用 Pygal 绘制。

3.1 绘制收盘价折线图

import json
import pygal

# 将数据加载到一个列表中,列表中的元素是字典
filename = "btc_close_2017.json"
with open(filename) as f:
    btc_data = json.load(f)

dates, months, weeks, weekdays, close = [], [], [], [], []
for btc_dict in btc_data:
    dates.append(btc_dict["date"])
    months.append(int(btc_dict["month"]))
    weeks.append(int(btc_dict["week"]))
    weekdays.append(btc_dict["weekday"])
    close.append(int(float(btc_dict["close"])))

# x轴坐标上的刻度顺时针旋转20度
line_chart = pygal.Line(x_label_rotation=20, show_minor_x_labels=False)
line_chart.title = "收盘价(¥)"
line_chart.x_labels = dates
N = 20  # x轴坐标每隔20天显示一次
line_chart.x_labels_major = dates[::N]
line_chart.add("收盘价", close)
line_chart.render_to_file("收盘价折线图(¥).svg")

最后得到的图像如下:

3.2 收盘价对数变换

从上图可以看出,收盘价基本呈指数增长,但其中有一些相似的波动(3,6,9月)。尽管这些波动被增长的趋势掩盖了,但也许其中有周期性。为了验证周期性的假设,需要首先将非线性的趋势消除。对数变换是常用的处理方法之一。我们使用Python标准库中的 math 模块来解决此问题。

-- snip --
import math

line_chart = pygal.Line(x_label_rotation=20, show_minor_x_labels=False)
line_chart.title = "收盘价对数变换(¥)"
line_chart.x_labels = dates
N = 20  # x轴坐标每隔20天显示一次
line_chart.x_labels_major = dates[::N]
# 对数变换
close_log = [math.log10(_) for _ in close]
line_chart.add("log收盘价", close_log)
line_chart.render_to_file("收盘价对数变换折线图(¥).svg")

得到了如下图像:

可以看出,3,6,9月都出现了剧烈的波动。下面再看看收盘价的月日均值和周日均值。

3.3 收盘价均值

3.3.1 月日均值

在继续新的代码之前,需要补充一些知识: 对于 zip() 函数,它将多个列表按照元素的位置组成新的列表,而新列表的元素是元组。如下:

# 代码
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, 10]
zipped_1 = zip(a,b)
zipped_2 = zip(a, b, c)
print(zipped_1)
print(list(zipped_1))
print(list(zipped_2))

# 结果
<zip object at 0x0000021D732DCDC8>
[(1, 4), (2, 5), (3, 6






请到「今天看啥」查看全文


推荐文章
封面新闻  ·  刚刚!《哪吒2》全球第五!
昨天
封面新闻  ·  刚刚!《哪吒2》全球第五!
昨天
江苏新闻  ·  《哪吒2》,破150亿!
昨天
中央戏剧学院就业创业指导中心  ·  南京林业大学诚邀依托申报海外优青
2 天前
中央戏剧学院就业创业指导中心  ·  外交部2025年招聘公告
2 天前
桃桃淘电影  ·  票房堪忧,奉俊昊科幻梦撞墙。
5 天前
半导体照明网  ·  LED照明发展现状及2017年发展趋势展望
8 年前
界面新闻  ·  在三和玩游戏的人们
7 年前