【问题标题】:Save Websocket Data to Pandas将 Websocket 数据保存到 Pandas
【发布时间】:2018-03-24 02:38:05
【问题描述】:

我正在尝试使用 websocket 数据并将其保存到 pandas DataFrame 以供其他功能使用。但是我对它们非常不熟悉,最初出错是因为我试图直接将 df 参数传递给 on_message()。 This 链接建议使用 partial 添加参数,但我仍然收到 error from callback <function on_message at 0x000002A098207510>: local variable 'df' referenced before assignment 错误。

我意识到有更好的方法来处理数据而不是数据框,但我只想先让它发挥作用。谢谢。

import websocket
import pandas as pd
import json
from functools import partial

# create empty df
df = pd.DataFrame(columns=['foreignNotional','grossValue','homeNotional','price','side','size','symbol','tickDirection',
                          'timestamp','trdMatchID'])

def on_message(ws, message):
    msg = json.loads(message)
    print(msg)
    df = df
    df = df.append(msg)

def on_error(ws, error):
    print(error)

def on_close(ws):
    print("### closed ###")

def on_open(ws):
    return

func = partial(on_message, df)
ws.on_message = func

if __name__ == "__main__":
    #websocket.enableTrace(True)
    ws = websocket.WebSocketApp("wss://www.bitmex.com/realtime?subscribe=trade:XBTUSD",
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close)
    ws.on_open = on_open
    ws.run_forever()

【问题讨论】:

    标签: python pandas websocket


    【解决方案1】:

    由于您必须修改外部对象,而pandas.DataFrame.append 不允许就地修改,您必须使所有函数和df 作为某个类的成员可用,这样您就可以编写@ 987654323@,或使用global

    import json
    
    import pandas as pd
    import websocket
    
    df = pd.DataFrame(columns=['foreignNotional', 'grossValue', 'homeNotional', 'price', 'side',
                               'size', 'symbol', 'tickDirection', 'timestamp', 'trdMatchID'])
    
    
    def on_message(ws, message):
        msg = json.loads(message)
        print(msg)
        global df
        # `ignore_index=True` has to be provided, otherwise you'll get
        # "Can only append a Series if ignore_index=True or if the Series has a name" errors
        df = df.append(msg, ignore_index=True)
    
    
    def on_error(ws, error):
        print(error)
    
    
    def on_close(ws):
        print("### closed ###")
    
    
    def on_open(ws):
        return
    
    
    if __name__ == "__main__":
        ws = websocket.WebSocketApp("wss://www.bitmex.com/realtime?subscribe=trade:XBTUSD",
                                    on_open=on_open, on_message=on_message, on_error=on_error, on_close=on_close)
        ws.run_forever()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 2014-09-28
      • 2021-11-03
      • 2023-03-13
      • 2019-02-09
      • 1970-01-01
      相关资源
      最近更新 更多