使用mpl_finance绘制OHLC蜡烛图遇TypeError错误,求解决方案
解决Kraken API蜡烛图绘制的TypeError问题
嘿,我一眼就看出问题所在啦——你遇到的TypeError是因为从Kraken API获取到的OHLC数据全都是字符串类型,而candlestick_ohlc函数需要用数值类型来计算蜡烛的涨跌高度(也就是报错里的close - open这一步),字符串当然没法做减法运算啦!
核心解决方案:转换数据类型
我们需要做两件关键的转换:
- 把价格列(Open/High/Low/Close)从字符串转成浮点型
- 把时间戳转成matplotlib能识别的日期格式(内部用浮点数表示)
修改后的完整代码
import requests import pandas as pd import matplotlib import numpy as np from mpl_finance import candlestick_ohlc import matplotlib.ticker as mticker import matplotlib.dates as mdates import matplotlib.pyplot as plt import datetime # Get OHLC data from kraken api [time,open,high,low,close,vwap,volume,count] ticker='XXBTZEUR' period='5' starting='1505677500' parameters={"pair":ticker,"interval":period,"since":starting} response=requests.get("https://api.kraken.com/0/public/OHLC", params=parameters) krakohlc=response.json()['result'][ticker] ohlc=[] for i in range(len(krakohlc)): ohlcdata=krakohlc[i][0:5] ohlc.append(ohlcdata) #Make data array (time,O,H,L,C) labels = ['Date', 'Open', 'High', 'Low', 'Close'] ohlc_df=pd.DataFrame.from_records(ohlc, columns=labels) # ------------------------ 新增的转换代码 ------------------------ # 把价格列转为浮点型,解决字符串减法报错 ohlc_df[['Open', 'High', 'Low', 'Close']] = ohlc_df[['Open', 'High', 'Low', 'Close']].astype(float) # 把Unix时间戳转为matplotlib兼容的日期格式(浮点数),让x轴正常显示日期 ohlc_df['Date'] = ohlc_df['Date'].apply(lambda x: mdates.date2num(datetime.datetime.fromtimestamp(x))) # --------------------------------------------------------------- print(ohlc_df) #Making plot area fig = plt.figure() ax1 = plt.subplot2grid((6,1), (0,0), rowspan=6, colspan=1) #Making candlestick plot candlestick_ohlc(ax1,ohlc_df.values,width=1, colorup='g', colordown='k',alpha=0.75) ax1.xaxis_date() ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) ax1.xaxis.set_major_locator(mticker.MaxNLocator(10)) ax1.grid(True) plt.xlabel("Date") plt.ylabel("Price") plt.show()
关键修改点说明
- 价格类型转换:用
astype(float)把字符串格式的价格转为数值,这样candlestick_ohlc就能正常计算蜡烛的涨跌幅度了 - 日期格式转换:Kraken返回的是Unix时间戳(整数),我们先用
datetime.datetime.fromtimestamp()把它转成Python的datetime对象,再用mdates.date2num()转成matplotlib内部使用的浮点数格式,这样x轴才能正确解析并显示日期
另外顺便提个小优化:你原来的import datetime as datetime有点冗余,改成import datetime就够用啦~
内容的提问来源于stack exchange,提问作者ACF
相关产品推荐
相关产品推荐

