金融场景下WebSocket数据转DataFrame:实现行追加的技术问询
金融WebSocket API数据追加到DataFrame的问题
问题背景
正在学习金融领域的API与WebSocket使用,目标是获取tick数据并创建包含index、ask、bid、quote列的DataFrame,但每次接收消息时都会生成新的DataFrame,无法实现追加行的效果。
当前问题
- 当前代码输出(每次收到消息时的结果):
0 {'ask': 20150.93, 'bid': 20144.93, 'epoch': 16... Name: tick, dtype: object
- 加载JSON后的原始数据结构:
{ 'echo_req': {'ticks': 'R_100'}, 'msg_type': 'tick', 'subscription': {'id': '248a0656-44e9-91da-5e06-10712edf2cdf'}, 'tick': { 'ask': 20150.19, 'bid': 20144.19, 'epoch': 1658228500, 'id': '248a0656-44e9-91da-5e06-10712edf2cdf', 'pip_size': 2, 'quote': 20147.19, 'symbol': 'R_100' } }
- 期望输出:每次收到新的tick消息时,将
ask、bid、quote作为新行追加到DataFrame中,DataFrame包含自动生成的index列。
解决方案
问题出在未正确初始化全局DataFrame,且未执行追加操作。修改后的代码如下:
import websocket import json import pandas as pd app_id = '*****' # 替换为你的app_id # 全局初始化指定列名的空DataFrame df = pd.DataFrame(columns=['ask', 'bid', 'quote']) def on_open(ws): json_data = json.dumps({"ticks": "R_100"}) ws.send(json_data) def on_message(ws, message): global df data = json.loads(message) # 提取需要的字段构造单行数据 new_row = { 'ask': data['tick']['ask'], 'bid': data['tick']['bid'], 'quote': data['tick']['quote'] } # 追加新行到DataFrame,自动生成连续索引 df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True) # 可选:打印最新的DataFrame查看效果 print(df.tail()) if __name__ == "__main__": apiUrl = "wss://websockets/v3?app_id=" + app_id # 修正URL中的多余斜杠 ws = websocket.WebSocketApp(apiUrl, on_message=on_message, on_open=on_open) ws.run_forever()
关键修改点
- 提前全局初始化指定列名的空DataFrame,避免每次创建新实例。
- 提取
tick中目标字段,用pd.concat追加行,ignore_index=True保证索引连续。 - 修正API URL中的多余斜杠,避免连接错误。
- 仅保留需求中的
ask、bid、quote字段,符合预期输出要求。
内容的提问来源于stack exchange,提问作者john mugi
相关产品推荐
相关产品推荐

