我正在连接到以这种格式发送消息的 websocket:
msg = {'ev': 'A', 'sym': 'SPY', 'v': 222, 'av': 107783639, 'op': 391.841, 'vw': 396.45, 'o': 396.45, 'c': 396.45, 'h': 396.45, 'l': 396.45, 'a': 393.1093, 'z': 27, 's': 1679696390000, 'e': 1679696391000}
我尝试将每个消息转换为数据框并使用以下代码设置列:
df = pd.DataFrame(list(msg.items()))
df = df.T
df.columns = df.iloc[1]
df = df.T
我希望能够将每条新消息添加到 df 的末尾,直到我有 60 行的 df。然后我计划使用 pd.resample() 可能将其转换为 1 小时条,这样我就可以将它附加到我下载的批量数据中。
我怎样才能至少达到追加行的程度,最好以最有效的方式进行追加。我猜到目前为止我所尝试的可以用更少的代码来完成。
我会通过维护字典列表并在收集 60 条消息后将其转换为 DataFrame 来做到这一点。
这是一个例子,请注意,当它们到达时,你必须将我的例子调整到
msgs
列表:
import pandas as pd
msgs = []
for _ in range(60):
msg = {'ev': 'A', 'sym': 'SPY', 'v': 222, 'av': 107783639, 'op': 391.841, 'vw': 396.45, 'o': 396.45, 'c': 396.45, 'h': 396.45, 'l': 396.45, 'a': 393.1093, 'z': 27, 's': 1679696390000, 'e': 1679696391000}
msgs.append(msg)
df = pd.DataFrame(msgs)
df['s'] = pd.to_datetime(df['s'], unit='ms')
df['e'] = pd.to_datetime(df['e'], unit='ms')
df.set_index('s', inplace=True)
ohlc = df.resample('1H').agg({'o': 'first', 'h': 'max', 'l': 'min', 'c': 'last'})
print(ohlc)