python学习笔记-json文件处理,用pygal绘出收盘价格走势


先引入json,pygal ,math模块

import json
import pygal
import math #用来计算log
from itertools import groupby

打开文件并将数据储存到btc_data中
创建空列表,用来储存日期,月份,星期,星期日,收盘价格
对于要转化成int类型
对于浮点型数字的字符串要先转化为float在转化为int,自动舍弃小数

file_name='btc_close_2017.json'
with open(file_name) as f:
    btc_data=json.load(f)

dates,months,weekdays,weeks,closes=[],[],[],[],[]
for btc_dict in btc_data:
    #以下是键值对操作
    dates.append(btc_dict['date'])
    months.append(int(btc_dict['month']))
    weekdays.append(btc_dict['weekday'])
    weeks.append(int(btc_dict['week']))
    closes.append(int(float(btc_dict['close'])))

编写draw_line函数


def draw_line(x_data,y_data,title,y_legend):
    xy_map=[]
    #下一句中:zip返回一个列表。列表中的元素是元组
    #[(1,~),(2,~),(3,~)...,(12,~)]
    #sorted()和kep=[——]是连用的
    #意思是以——为键值排序
    #lambada是匿名函数
    #相当于:def fun(元素):
    #               return 元素索引-例如dates[0]
    # key=元素索引
    for x, y in groupby(sorted(zip(x_data,y_data)),key=lambda _: _[0]):
        #此时的y是一个含有月份x中所有元素的列表吗?
        #y是啥不知道
        #y_list是储存了当月所有数值的一个列表
        y_list=[v for _, v in y]
        #将12个列表存入xy——map
        xy_map.append([x,sum(y_list)/len(y_list)])

绘制过程

    #zip的逆过程
    #目前的xy——map状态
    #[[1, 6285.870967741936], [2, 7315.714285714285],
    # [3, 7789.032258064516], [4, 8390.466666666667],
    # [5, 12963.935483870968], [6, 18092.166666666668],
    # [7, 17146.16129032258], [8, 26092.645161290322],
    # [9, 26865.633333333335], [10, 35460.67741935484],
    # [11, 51436.166666666664]]
    #也就是一个包含了11个列表的大列表
    # 用**语法,先将1-11赋值给x_unique,再讲平均值赋值给y_mean

    x_unique,y_mean = [*zip(*xy_map)]
    line_chart=pygal.Line()
    line_chart.title=title
    line_chart.x_labels=x_unique
    line_chart.add(y_legend,y_mean)
    line_chart.render_to_file(title+'.svg')
    return line_chart

绘制月日均值


idx_month=dates.index('2017-12-01')
line_chart_month=draw_line(months[:idx_month],closes[:idx_month],'收盘价月日均值','月日均值')
#line_chart_month

绘制周日均值


#idx_week是索引 对weeks进行切片
idx_week=dates.index('2017-12-11')
line_chart_week=draw_line(weeks[1:idx_week],closes[1:idx_week],'收盘周日均值','周日均值')
#line_chart_week

绘制收盘价星期均值


wd= ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
#下面一句很有意思:遍历weekdays中由1到索引的每一天的weekdays值
#wd.index返回英文天气在列表wb里的索引数为0-6分别对应周一到周五,所以需要+1
weekdays_int=[ wd.index(w)+1 for w in weekdays[1:idx_week]]
line_chart_weekday=draw_line(weekdays_int,closes[1:idx_week],'收盘价星期均值','星期均值')
line_chart_weekday.x_labels=['周一','周二','周三','周四','周五','周六','周日']
line_chart_weekday.render_to_file('收盘价星期均值(¥).svg')

绘制收盘价折线图


# line_chart=pygal.Line(x_label_rotation=20,show_minor_x_labels=False)
# line_chart.title='收盘价¥'
# line_chart.x_labels= dates
# N = 20
# log10_closes=[math.log10(_) for _ in closes]
# line_chart.x_labels_major=dates[::N]
# line_chart.add("收盘价¥",log10_closes)
# line_chart.render_to_file('收盘价折线图(¥).svg')

编写HTML网址文件(这段完全不会啊)

with open('收盘价Dashboard.html','w',encoding='utf8') as html_file:
    html_file.write('<html><head><title>收盘价Dashboard
</title><metacharset="utf-8"></head><body>\n')
    for svg in[
        '收盘价折线图(¥).svg','收盘价星期均值(¥).svg','收盘
价月日均值.svg','收盘周日均值.svg','收盘价星期均值.svg'
    ]:
        html_file.write('   <object type="image/svg+xml" 
 data="{0}" height=500></object>\n'.format(svg))
    html_file.write('</body></html>')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值