如何基于Pandas Resample处理后的时序数据绘制K线图
如何基于Pandas Resample处理后的时序数据绘制K线图
你遇到的问题其实很常见——当你用resample把高频时序数据聚合成天级别的OHLC(开盘/最高/最低/收盘)数据后,只需要把这些聚合结果规整到一个标准的DataFrame里,再调整好索引,就能复用你原来的K线绘图逻辑啦!
我给你整理了完整的步骤和代码,一步步来:
1. 一次性聚合出完整的OHLC数据
不要分开调用resampler.first()、resampler.last()这些方法,用Pandas的agg()可以一次性把四个指标聚合到一个DataFrame里,结构更清晰,代码也更简洁:
import pandas as pd from datetime import datetime from bokeh.plotting import figure, show # 你的原始高频数据 data = { 'time': [ datetime(2025, 1, 1, 6), datetime(2025, 1, 1, 10), datetime(2025, 1, 1, 14), datetime(2025, 1, 1, 18), datetime(2025, 1, 2, 6), datetime(2025, 1, 2, 10), datetime(2025, 1, 2, 14), datetime(2025, 1, 2, 18), datetime(2025, 1, 3, 6), datetime(2025, 1, 3, 10), datetime(2025, 1, 3, 14), datetime(2025, 1, 3, 18), ], 'price': [ 10, 5, 40, 40, 40, 10, 50, 20, 20, 20, 35, 30, ] } df = pd.DataFrame(data) # 天级别聚合,一次性得到open/high/low/close ohlc_df = df.resample('D', on='time', kind='period').agg( open=('price', 'first'), # 当天第一个价格是开盘价 high=('price', 'max'), # 当天最高价 low=('price', 'min'), # 当天最低价 close=('price', 'last') # 当天最后一个价格是收盘价 )
2. 调整索引适配绘图
因为你用了kind='period',所以ohlc_df的索引是Period类型(比如2025-01-01这种周期对象)。虽然Bokeh能直接处理,但转成Timestamp类型(具体的时间戳)会让x轴的日期显示更直观:
# 将Period索引转为Timestamp ohlc_df.index = ohlc_df.index.to_timestamp()
如果你想保留Period索引也完全没问题,直接用ohlc_df.index即可,Bokeh会自动适配。
3. 复用K线绘图逻辑
这一步就和你之前的代码几乎一样了,只是把数据源换成规整后的ohlc_df,索引直接用ohlc_df.index就行:
# 判断涨跌:收盘价>开盘价为涨,反之则跌 inc = ohlc_df.close > ohlc_df.open dec = ohlc_df.open > ohlc_df.close # 创建绘图对象,指定x轴为时间类型 p = figure(x_axis_type='datetime', title="天级K线图", width=800, height=400) # 绘制高低点连线(K线的上影线和下影线) p.segment(ohlc_df.index, ohlc_df.high, ohlc_df.index, ohlc_df.low, color="black") # 绘制下跌K线(红色实体) p.vbar(ohlc_df.index[dec], 0.6, ohlc_df.open[dec], ohlc_df.close[dec], color="#eb3c40") # 绘制上涨K线(白色实体+蓝色边框) p.vbar(ohlc_df.index[inc], 0.6, ohlc_df.open[inc], ohlc_df.close[inc], fill_color="white", line_color="#49a3a3", line_width=2) # 加上轴标签,让图表更清晰 p.xaxis.axis_label = "日期" p.yaxis.axis_label = "价格" # 显示图表 show(p)
这样运行后,你得到的K线图会和你最开始用手动定义的OHLC数据画的效果完全一致!
备注:内容来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

