You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

金融场景下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:45:32