如何高效从WebSocket字典消息生成OHLC Bars并追加DataFrame行
高效处理WebSocket消息并构建DataFrame方案
一、简化单条消息转DataFrame的代码
你之前的转换代码过于繁琐,直接用pd.DataFrame([msg])就能将单条字典格式的消息转换为带正确列名的单行DataFrame,无需多次转置操作。
示例代码:
import pandas as pd # 单条WebSocket消息转DataFrame msg = {'ev': 'A', 'sym': 'SPY', 'v': 222, 'av': 107783639, 'op': 391.841, 'vw': 396.45, 'o': 396.45, 'c': 396.45, 'h': 396.45, 'l': 396.45, 'a': 393.1093, 'z': 27, 's': 1679696390000, 'e': 1679696391000} df_single = pd.DataFrame([msg])
二、高效实现消息追加(直到60行)
不要使用已被弃用的df.append()逐行追加,推荐用列表暂存消息字典,攒够60条后一次性转换为DataFrame,这种方式性能远高于逐行操作。
实现逻辑:
- 初始化空列表存储消息字典
- 每收到一条WebSocket消息,将字典追加到列表中
- 当列表长度达到60时,批量转换为DataFrame
示例代码:
# 初始化消息存储列表 msg_list = [] # 模拟WebSocket消息接收循环(实际替换为你的WS回调逻辑) while len(msg_list) < 60: # 替换为实际获取WS消息的代码 msg = {'ev': 'A', 'sym': 'SPY', 'v': 222, 'av': 107783639, 'op': 391.841, 'vw': 396.45, 'o': 396.45, 'c': 396.45, 'h': 396.45, 'l': 396.45, 'a': 393.1093, 'z': 27, 's': 1679696390000, 'e': 1679696391000} msg_list.append(msg) # 批量转换为DataFrame df = pd.DataFrame(msg_list)
三、生成1小时K线并合并批量数据
首先需要将时间戳列转换为datetime类型并设置为索引,再通过resample()完成1小时K线的聚合,最后合并到已有批量数据中。
示例代码:
# 将时间戳(以's'列为例)转换为datetime并设为索引 df['timestamp'] = pd.to_datetime(df['s'], unit='ms') df.set_index('timestamp', inplace=True) # 1小时重采样,按需定义字段聚合规则 hourly_df = df.resample('1H').agg({ 'o': 'first', # 开盘价取时段第一条数据 'h': 'max', # 最高价取时段最大值 'l': 'min', # 最低价取时段最小值 'c': 'last', # 收盘价取时段最后一条数据 'v': 'sum', # 成交量求和 'av': 'last' # 其他字段根据业务需求调整聚合方式 }) # 合并到已下载的批量数据(假设batch_df为你的批量数据,需确保时间格式一致) combined_df = pd.concat([batch_df, hourly_df]).sort_index()
内容的提问来源于stack exchange,提问作者Andy Visser
相关产品推荐
相关产品推荐

