Pandas如何创建空DataFrame追加数据且不生成新对象
问题根源
当前代码存在3个直接导致异常的逻辑错误:
- 每次触发K线闭合判断时都会重新初始化空DataFrame,此前存储的所有历史收盘价会被直接清空
- 拼接新数据时未重置索引,每次生成的单行DataFrame默认索引均为0,最终出现重复索引
- 拼接顺序为新数据放在旧数据头部,和按接收顺序递增排列的需求完全相反
正确实现
把DataFrame初始化逻辑移到Websocket监听循环外部,程序启动时仅初始化一次,收到新收盘价时追加数据并自动生成连续索引即可:
# 初始化操作放在Websocket连接逻辑前,仅执行1次 df = pd.DataFrame(columns=['close']) # 下方为Websocket消息回调内的处理逻辑 if candle_closed: close_val = float(candle['c']) # 追加新行,ignore_index=True会自动生成从0开始的连续递增索引 df = pd.concat( [df, pd.DataFrame([close_val], columns=['close'])], ignore_index=True ) # 如果需要索引起始值为1而非默认的0,追加完成后统一偏移索引即可 df.index = df.index + 1
执行后输出结果完全匹配预期:
close 1 20431.65 2 20439.63
性能优化建议
如果接入的是低周期K线(比如1s、1min级别),高频调用pd.concat会产生不必要的性能开销,可以先把收到的收盘价暂存在普通Python列表中,每积累固定条数(比如50/100条)再一次性批量写入DataFrame,运行效率会提升数倍。
内容的提问来源于stack exchange,提问作者testerboy22
相关产品推荐
相关产品推荐

