关于Python编程从入门到实践16.2节程序运行出错的解析
16.2 制作交易收盘价走势图:JSON格式
这里整理了两个运行错误的解析,有错漏和不足的地方还请各位大佬体谅!
16.2.1下载收盘价数据
***现象:***在原封不动照抄书本上程序代码,并且仔细检查多遍之后程序仍然报错:
****urllib.error.URLError: <urlopen error [WinError 10054] 远程主机强迫关闭了一个现有的连接。>****
,只在根目录下创建一个空的文件(btc_close_2017_urllib.json)
原因分析:https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json链接失效,即所需数据源代码网页连接不上;
在Github上创建一个新的数据链接https://raw.githubusercontent.com/muxuezi/btc/master/btc_close_2017.json,并将其替换入程序中,仍然出现原先报错,直接搜索新的链接,发现新链接也很不稳定,十次重复搜索中只有一次能连接上此网页。得出结果:Github的某种未知因素,导致raw数据的网页很不稳定!
16.2.6 收盘价均值
***现象:***在原封不动照抄书本上程序代码,并且仔细检查多遍之后程序仍然报错:
TypeError: object of type 'int' has no len()
原因分析:在程序中,x_unique是一个由数字组成的元组——(1,2,3,4,5,6,7,8,9,10,11),而数字是不能通过pygal转换为图表上的图文显示的,这时我们需要把数字转为字符串——[‘1’, ‘2’, ‘3’,……]。话不多说,直接奉上修改后的代码:
from itertools import groupby
def draw_line(x_data, y_data, title, y_legend):
xy_map = []
for x, y in groupby(sorted(zip(x_data, y_data)), key=lambda _: _[0]):
y_list = [v for _, v in y]
xy_map.append([x, sum(y_list) / len(y_list)])
x_unique, y_mean = [*zip(*xy_map)]
x_list = []
for a in x_unique:
b = '%d' % a
x_list.append(b)
line_chart = pygal.Line()
line_chart.title = title
line_chart.x_labels = x_list
line_chart.add(y_legend, y_mean)
line_chart.render_to_file(title+'.svg')
return line_chart