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'])))
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')
with open('收盘价Dashboard.html','w',encoding='utf8') as html_file:
html_file.write('收盘价Dashboard
\n')
for svg in[
'收盘价折线图(¥).svg','收盘价星期均值(¥).svg','收盘
价月日均值.svg','收盘周日均值.svg','收盘价星期均值.svg'
]:
html_file.write(' \n'.format(svg))
html_file.write('')