首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将Websocket数据保存到Pandas

将Websocket数据保存到Pandas
EN

Stack Overflow用户
提问于 2018-03-24 02:38:05
回答 1查看 4.7K关注 0票数 4

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

我意识到有更好的方法来处理数据而不是数据,但我只想先开始工作。谢谢。

代码语言:javascript
复制
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()
EN

Stack Overflow用户

回答已采纳

发布于 2018-03-24 03:32:43

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

代码语言:javascript
复制
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()
票数 9
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49460665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档