Highcharts for Python中to_js_literal()转换时open值为null问题
Highcharts for Python: Candlestick Open Values Become Null in JS Literal
问题描述
使用Highcharts for Python将时间序列K线图转换为JS字面量时,Python中CandlestickData对象的open值显示正常,但调用to_js_literal()方法后,生成的JS数据数组里open字段全部变为null。
环境版本:
- Python 3.12
- highcharts-core==1.4.0
- highcharts-stock==1.4.0
代码及输出:
from highcharts_stock.chart import Chart ohlcv = [[1665504000000, 20, 21, 19, 20, 322], [1665590400000, 21, 23, 21, 22, 168]] chart = Chart.from_array(ohlcv, series_type='candlestick') print(chart.options.series[0].data) # Output: [CandlestickData(open = 20, close = 20, high = 21, low = 19, x = 1665504000000), # CandlestickData(open = 21, close = 22, high = 23, low = 21, x = 1665590400000)] js_lit = chart.to_js_literal() print(js_lit[js_lit.find("data:"):js_lit.find(']]') + 2].replace('\n', '')) # Output: data: [[1665504000000, null, 21, 19, 20], [1665590400000, null, 23, 21, 22]]
解决方案
1. 升级Highcharts for Python版本
highcharts-core 1.4.0和highcharts-stock 1.4.0存在CandlestickData序列化的bug,后续版本已修复。执行以下命令升级:
pip install --upgrade highcharts-core highcharts-stock
升级后重新运行代码,open值将正确序列化到JS字面量中。
2. 手动构造数据点并指定序列化顺序
若暂时无法升级版本,可手动创建CandlestickData实例,并显式设置序列化字段顺序:
from highcharts_stock.chart import Chart from highcharts_stock.options.series.candlestick import CandlestickData ohlcv = [[1665504000000, 20, 21, 19, 20, 322], [1665590400000, 21, 23, 21, 22, 168]] data_points = [] for item in ohlcv: x, open_val, high, low, close, volume = item data_point = CandlestickData(x=x, open=open_val, high=high, low=low, close=close, volume=volume) # 显式定义序列化时的字段顺序 data_point.serializer.additional_properties = ['x', 'open', 'high', 'low', 'close', 'volume'] data_points.append(data_point) chart = Chart() chart.options.series = [{ 'type': 'candlestick', 'data': data_points }] js_lit = chart.to_js_literal() print(js_lit[js_lit.find("data:"):js_lit.find(']]') + 2].replace('\n', '')) # 预期输出: data: [[1665504000000, 20, 21, 19, 20, 322], [1665590400000, 21, 23, 21, 22, 168]]
3. 使用字典格式传递数据
绕过CandlestickData对象的序列化问题,直接用字典数组定义数据:
from highcharts_stock.chart import Chart ohlcv = [[1665504000000, 20, 21, 19, 20, 322], [1665590400000, 21, 23, 21, 22, 168]] data_dicts = [] for item in ohlcv: x, open_val, high, low, close, volume = item data_dicts.append({ 'x': x, 'open': open_val, 'high': high, 'low': low, 'close': close, 'volume': volume }) chart = Chart() chart.options.series = [{ 'type': 'candlestick', 'data': data_dicts }] js_lit = chart.to_js_literal() # 生成的JS字面量中open值将正常显示
内容的提问来源于stack exchange,提问作者PetarMignon
相关产品推荐
相关产品推荐

