Json Python3:从Websocket抓取数据并将其放入数据帧
想知道是否有人能帮忙。我试图从websocket中获取数据,并将其放入一个数据帧中,而不是在每行中都有多个字典。我用来从binance中提取的代码是:Json Python3:从Websocket抓取数据并将其放入数据帧,json,python-3.x,dataframe,websocket,Json,Python 3.x,Dataframe,Websocket,想知道是否有人能帮忙。我试图从websocket中获取数据,并将其放入一个数据帧中,而不是在每行中都有多个字典。我用来从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 m
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列中的值…不确定这是什么):
我尝试了很多方法,但都没能成功:Json到DataFrame,多个字典到DataFrame,还有其他一些方法。如果我找对了地方,请告诉我。其中一些数字显示为“xxxx.xxxx”,而不仅仅是xxxx.xxxx
我最终想做的是从上面的流中获取所有股票代码数据,并将每个股票代码保存到一个单独的文件中。ie NEOBTC amnd BNBBTC将保存在其自己的csv中。我只希望它在“x”时保存:然而,为True
非常感谢您在我遇到的任何困难时给予我的任何帮助,并感谢您抽出时间来了解这一点。在您当前的代码中,每次收到一条消息时,您都会将其附加到数据帧中(注意,附加到数据帧总是很慢,从来都不是一个好主意)。然后将数据帧附加到文件中。因此,当你收到消息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)
这样,您根本不需要处理消息()
from pprint import pprint
retorno = 0
retornoold = 0
def process_m_message(msg):
global retorno
retorno = msg
conn_key = bm.start_multiplex_socket(connstr, process_m_message)
bm.start()
while True:
if retorno != 0 and retorno != retornoold:
pprint(retorno)
for x in range(0,len(retorno)):
...
retornoold = retorno
这不是一个干净的解决方案,需要一些工作,但它是一种摆脱过程消息的方法最终目标是生成CSV文件,还是将数据保存在内存中的数据框中并停止写入文件?最终目标是生成CSV文件。不过,我可以生成csv,但数据如上所示,即字典中的字典,但我希望它看起来像底部示例谢谢您的回复。我已经输入了您的代码,我认为它可以工作,但我得到一个错误:dict包含字段名中没有的字段:“data”,“stream”。我认为这是因为我在原始代码中有header=False。这将在数据流0,“{e':'kline',e':1521848434118,'s':'BNBBTC','k'”中删除此项:{t':1521848400000,'t':1521848459999,'s':'BNBBTC','i':'1m','f':12747441,'L':12747497,'o':'0.00130880','c':'0.00130890','h':'0.00131000','L':'0.00130860','v':'989.09000000','n':57',x':False,'q':'1.29497482','v':'757.9800000。。。。。
from pprint import pprint
retorno = 0
retornoold = 0
def process_m_message(msg):
global retorno
retorno = msg
conn_key = bm.start_multiplex_socket(connstr, process_m_message)
bm.start()
while True:
if retorno != 0 and retorno != retornoold:
pprint(retorno)
for x in range(0,len(retorno)):
...
retornoold = retorno