json - Python3 : Grabbing data from Websocket and putting it into a DataFrame

标签 json python-3.x dataframe websocket

想知道是否有人可以帮忙。我试图从 websocket 中获取数据并将其放入 DataFrame 中,而每一行中不包含多个字典。我用来从 binance 中提取的代码是:

from binance.client import Client
from binance.websockets import BinanceSocketManager
from binance.enums import *
import datetime as dt
import matplotlib.pyplot as plt
from matplotlib import style
import pandas as pd
import pandas_datareader.data as web
from pandas.io.json import json_normalize

client = Client('api-key', 'api-secret')
tickers = client.get_all_tickers()


df = pd.DataFrame([])
count = 0
bm = None

### Multiplex socket

# Save incoming data
def process_message(msg):
    global count, df, bm
    print("stream: {} data: {}".format(msg['stream'], msg['data']))
    # append message to array

    df = df.append(msg, ignore_index=True)

    count += 1

    with open('klinesmultiplex_socket.csv', 'a') as f:
        df.to_csv(f, header=False)
    #df = pd.DataFrame(df)
    #df.to_csv('test.csv')


def initiate():
    global bm
    # Connect to client
    client = Client('api-key', 'api-secret')

    # Setup Socket
    bm = BinanceSocketManager(client)

    # then start the socket manager
    conn_key = bm.start_multiplex_socket(['bnbbtc@kline_1m', 'neobtc@kline_1m'], process_message)

    # start the socket
    bm.start()


initiate()

这是 csv 中保存的内容:

0,"{'e': 'kline', 'E': 1521847596412, 's': 'NEOBTC', 'k': {'t': 1521847560000, 'T': 1521847619999, 's': 'NEOBTC', 'i': '1m', 'f': 11202559, 'L': 11202604, 'o': '0.00765700', 'c': '0.00765900', 'h': '0.00766000', 'l': '0.00765400', 'v': '182.38000000', 'n': 46, 'x': False, 'q': '1.39674356', 'V': '131.09000000', 'Q': '1.00404646', 'B': '0'}}",neobtc@kline_1m
0,"{'e': 'kline', 'E': 1521847596412, 's': 'NEOBTC', 'k': {'t': 1521847560000, 'T': 1521847619999, 's': 'NEOBTC', 'i': '1m', 'f': 11202559, 'L': 11202604, 'o': '0.00765700', 'c': '0.00765900', 'h': '0.00766000', 'l': '0.00765400', 'v': '182.38000000', 'n': 46, 'x': False, 'q': '1.39674356', 'V': '131.09000000', 'Q': '1.00404646', 'B': '0'}}",neobtc@kline_1m
1,"{'e': 'kline', 'E': 1521847597055, 's': 'BNBBTC', 'k': {'t': 1521847560000, 'T': 1521847619999, 's': 'BNBBTC', 'i': '1m', 'f': 12744199, 'L': 12744341, 'o': '0.00132050', 'c': '0.00131530', 'h': '0.00132200', 'l': '0.00131500', 'v': '5571.10000000', 'n': 143, 'x': False, 'q': '7.33546205', 'V': '2637.29000000', 'Q': '3.47577851', 'B': '0'}}",bnbbtc@kline_1m
0,"{'e': 'kline', 'E': 1521847596412, 's': 'NEOBTC', 'k': {'t': 1521847560000, 'T': 1521847619999, 's': 'NEOBTC', 'i': '1m', 'f': 11202559, 'L': 11202604, 'o': '0.00765700', 'c': '0.00765900', 'h': '0.00766000', 'l': '0.00765400', 'v': '182.38000000', 'n': 46, 'x': False, 'q': '1.39674356', 'V': '131.09000000', 'Q': '1.00404646', 'B': '0'}}",neobtc@kline_1m

但是,我希望它看起来像这样(或者甚至删除第 0 列中的值...不确定那是什么):

   0, 'kline', 1521847596412, NEOBTC', 1521847560000, 1521847619999, 'NEOBTC', '1m', 11202559, 11202604, 0.00765700, 0.00765900, 0.00766000, 0.00765400, 182.38000000, 46, False, 1.39674356', 131.09000000, 1.00404646,0,neobtc@kline_1m
    0,'kline', 1521847596412, 'NEOBTC', 1521847560000, 1521847619999, 'NEOBTC', '1m', 11202559, 11202604, 0.00765700, 0.00765900, 0.00766000, 0.00765400, 182.38000000, 46, False, 1.39674356, 131.09000000, 1.00404646, 0,neobtc@kline_1m
    1,'kline', 1521847597055, 'BNBBTC', 1521847560000, 1521847619999, 'BNBBTC', '1m', 12744199, 12744341, 0.00132050, 0.00131530, 0.00132200, 0.00131500, 5571.10000000, 143, False, 7.33546205, 2637.29000000, 3.47577851, 0,bnbbtc@kline_1m
    0,'kline', 1521847596412, 'NEOBTC', 1521847560000, 1521847619999, 'NEOBTC', '1m', 11202559, 11202604,0.00765700, 0.00765900, 0.00766000, 0.00765400, 182.38000000, 46, False, 1.39674356, 131.09000000, 1.00404646, 0,neobtc@kline_1m

我已经尝试了很多东西,但无法让它工作:Json 到 DataFrame、多个字典到 DataFrame 以及其他一些东西。如果我正在寻找正确的地方,请告诉我。有些号码显示为“xxxx.xxxx”,而不仅仅是 xxxx.xxxx。

我最终想要做的是获取所有股票代码数据并将每个股票代码从上面的流中保存到单独的文件中。即 NEOBTC amnd BNBBTC 将保存在它们自己的 csv 中。然而,我只希望它在 'x': True 时保存。

对于我遇到的任何困难,任何帮助将不胜感激,并感谢您花时间查看此内容。

最佳答案

在您当前的代码中,每次收到一条消息时,都会将其附加到 DataFrame 中(注意,附加到 DataFrame 总是很慢,而且从来都不是一个好主意)。然后将 DataFrame 附加到文件中。因此,当您收到消息 A、B 和 C 时,您会写 A、A、B、A、B、C。这是一个主要错误。

您的代码的另一个问题是没有理由为此使用 Pandas。您应该使用内置的 csv 模块。像这样的事情:

import csv
columns = ['e', 'E', 's', 'k'] # add whatever JSON keys you want
out = csv. DictWriter(open('klines.csv', 'wb'), columns)

然后对于每条消息:

out.writerow(msg)

这将为您提供所需的输出格式(假设您添加了所需的所有列)。

如果您只需将每条消息写入 CSV,您可以直接传递 writerow() 函数作为 API 回调:

bm.start_multiplex_socket(['bnbbtc@kline_1m'], out.writerow)

这样您就根本不需要process_message()

关于json - Python3 : Grabbing data from Websocket and putting it into a DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49459883/

相关文章:

r - 找到两个不同长度的向量之间的所有组合

python - Blender 2.6 JSON 导出器,纹理仅在立方体的一侧错误

javascript - JSONP回调乱序

Python:未定义全局名称(但它不是全局变量)

python - 根据日期增加 Pandas Dataframe 列

R-创建按列名称选择数据框中整行的函数

MySQL - 查询 JSON 列时转义双引号和括号

当值包含单引号 (') 时,PHP json_decode 失败

python - 将 tweepy 流限制为特定数量

python - 使用 PyParsing 的两个标记之间的字符串