美文网首页
Python数据可视化day05|下载数据

Python数据可视化day05|下载数据

作者: 习惯芥末味 | 来源:发表于2018-04-22 16:27 被阅读0次

制作交易收盘价走势图:JSPN格式

下载JSON格式的交易收盘价数据,并使用json 模块来处理它们。

下载世界人口数据

我么首先可以下载并打开btc_close_2017.json这个文件。打开之后可以发现,这个文件就是一个很长的Python列表,其中每一个元素都包含5个键的字典:统计日期、月份、周数、周几以及收盘价。如果用函数urlopen来瞎子数据,可以使用下面的代码:

➜ btc_close_2017.py
from __future__ import (absolute_import,division,print_function,unicode_literals)

try:
    #python2版本
    from urllib2 import urlopen
except ImportError:
    #python3版本
    from urllib.request import urlopen
import json

json_url = 'https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json'
response = urlopen(json_url)
#读取数据
req = response.read()
#将数据写入文件
with open('btc_close_2017_urllib.json','wb') as f:
    f.write(req)
#加载json格式
file_urllib = json.loads(req)
print(file_urllib)

函数urlopen的代码稍微复杂一些,第三方模块request封装了许多常用的方法,让数据下载和读取变得简单:

import request
json_url = 'https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json'
req = request.get(json_url)
#将数据写入文件
with open('btc_close_2017_urllib.json','w') as f:
    f.write(req.text)
file_request = req.json()

request通过get方法向GitHub服务器发送请求。请求成后返回的结果存储在req变量中。req.text属性可以直接读取文件数据,返回的格式是字符串。

提取相关的数据

➜ btc_close_2017.py
import json

#将数据加载到一个列表中
filename = 'btc_close_2017.json'
with open(filename) as f:
    btc_data = json.load(f)  #将数据存储在btc_data中
#打印每一天的信息
for btc_dict in btc_data:  #遍历btc_data的每一个元素
    date = btc_dict['date']      #取出所有键的值
    month = btc_dict['month']
    week = btc_dict['week']
    weekday = btc_dict['weekday']
    close = btc_dict['close']
    print("{} is month {} week {},{},the close price is {} RMB".format (date,month,week,weekday,close))

打印结果为:

2017-01-01 is month 01 week 52,Sunday,the close price is 6928.6492 RMB
2017-01-02 is month 01 week 1,Monday,the close price is 7070.2554 RMB
2017-01-03 is month 01 week 1,Tuesday,the close price is 7175.1082 RMB
--snip--
2017-12-10 is month 12 week 49,Sunday,the close price is 99525.1027 RMB
2017-12-11 is month 12 week 50,Monday,the close price is 110642.88 RMB
2017-12-12 is month 12 week 50,Tuesday,the close price is 113732.6745 RMB

将字符串转换为数字值

在btc_close_2017.json 中的每一个键和值都是字符串。为了进行计算,需要将字符串转换为数值,可以使用int()方法:

➜ btc_close_2017.py
--snip--
#打印每一天的信息
for btc_dict in btc_data:
    date = btc_dict['date']
    month = int(btc_dict['month'])
    week = int(btc_dict['week'])
    weekday = int(btc_dict['weekday'])
    close = int(btc_dict['close'])
    print("{} is month {} week {},{},the close price is {} RMB".format (date,month,week,weekday,close))

当把weekday和close转换后会出现错误:

ValueError:invalid literal for int() with base 10: 'Sunday'
ValueError: invalid literal for int() with base 10: '6928.6492'

所以,weekday不需要转换,而第二报错是因为python不能直接把包含小数的字符串转换成整数,所以要先用float()转换成浮点数,再用int()转换成整数。

➜ btc_close_2017.py
--snip--
#打印每一天的信息
for btc_dict in btc_data:
    date = btc_dict['date']
    month = int(btc_dict['month'])
    week = int(btc_dict['week'])
    weekday = btc_dict['weekday']
    close = int(float(btc_dict['close']))
    print("{} is month {} week {},{},the close price is {} RMB".format(date,month,week,weekday,close))

绘制收盘折线图

➜ btc_close_2017.py
--snip--
#创建5个列表,分别存储日期和收盘价
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'])))


import pygal
❶import sys
❷reload(sys)                         
❸sys.setdefaultencoding('utf-8')  
line_chart = pygal.Line(x_label_rotation=20,show_minor_x_labels=False)
line_chart.title = '收盘价(¥)'
line_chart.x_label = dates
N = 20 #x轴坐标每隔20天显示一次
line_chart.x_label_major = dates[::N]
line_chart.add('收盘价',close)
line_chart.render_to_file('收盘价折线图(¥).svg')

注意当出现下列报错的时候,要将❶❷❸引入:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
收盘价折线图

时间序列特征初探:

为了验证周期性的假设,需要首先将非线性的趋势消除。对数(log transformation)是你常用的处理方法之一,者就用到了Python标准库的数学模块math方法。

➜ btc_close_2017.py
--snip--
import pygal
import math
import sys
reload(sys)                         
sys.setdefaultencoding('utf-8')  
line_chart = pygal.Line(x_label_rotation=20,show_minor_x_labels=False)
line_chart.title = '收盘价对数变换(¥)'
line_chart.x_label = dates
N = 20 #x轴坐标每隔20天显示一次
line_chart.x_label_major = dates[::N]
close_log = [math.log10(_) for _ in close]
line_chart.add('收盘价',close)
line_chart.render_to_file('收盘价折线图(¥).svg')

相关文章

网友评论

      本文标题:Python数据可视化day05|下载数据

      本文链接:https://www.haomeiwen.com/subject/ckxclftx.html