我怎样才能从 Binance API 中提取实时数据并同时在 Matplotlib 上绘制它?我可以单独做,但不能一起做

How can I pull live data from Binance API and simultaneously plot it on Matplotlib? I can do both individually but not together

我有以下两批代码;第一个从 Binance API:

中提取数据
while True: 
    await socket.__aenter__()
    msg = await socket.recv() 
    frame = createFrame(msg)
    frame.to_sql("BTCUSDT", engine, if_exists = 'append', index = False) 
    print(frame)   

上面的输出看起来像这样:

每秒都会生成一行新数据。

以上内容当然会运行持续进行,除非被打断。

然后我有下面的代码,它从上面 table 中提取数据。但我遇到的问题是上面的代码不会停止 运行ning,所以我们永远不会得到下面的代码。我当然可以在一定行数后停止上面的操作,但我想要的是将实时数据拉入下面的代码中。我有什么想法可以重新安排我的代码来实现这个目标吗?

x_axis = []
y_axis = []

def animate(i): 
    x_axis.append(frame.iloc[-1][1])
    y_axis.append(frame.iloc[-1][2])
    
    plt.cla()
    plt.plot(x_axis,y_axis)
    

ani = FuncAnimation(plt.gcf(),animate,interval = 1000)

plt.show()
    

我刚刚实现了这段代码并发现了你的问题。在此代码中,您可以看到我如何混合使用 matplot 从 Binance 获取数据。我对数据所做的事情没什么大不了的,它只是一个演示。

顺便说一下,你必须使用 FuncAnimation 来显示实时数据,无论来源是什么。此实现有可能的流程,请求的时间间隔与动画的刷新有关。

import requests
import pandas as pd
import matplotlib.pyplot as plt
from time import sleep
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

我将我的“属性”保留在更新动画的函数之外。

# Capital initial.
initial_capital         = 100
# Montant du capital à investir.
operation_invest_rate   = 0.1
# Capital cumulatif investi pendant la durée de l'opération.
invest_capital          = initial_capital*operation_invest_rate
# Frais de transaction.
fee_rate                = 0.001
# Interval de transaction.
trade_time_interval     =  2000
# Ticker choisi.                                    
token_selected          = "ATOKEN"
# Source de données.
data_door               = "https://api.binance.com/api/v3/depth"

此外,我实例化了图表。在这种情况下是散点图。 我还使用数组将未来值存储在函数中以供后续升级。

# Stockage pour visualisation.
prix_achat    = []
prix_vente    = []
fig = plt.figure()
ax = plt.axes()
ax.set_xlabel("Prix d'achat", fontsize=15)
ax.set_ylabel("Prix de vente", fontsize=15)
ax.set_title("Prix d'achat vs Prix de vente", fontsize=20)
ax.grid(True)
ax.scatter(prix_achat, prix_vente, color='blue', alpha=0.3)

在这里您可以观察更新函数的实现,我必须在其中嵌入所有查询和数据操作,因为它是动画过程中唯一要 运行 的函数。我的“道具”被称为全局变量(不良做法),因此它们可以在内部和外部访问。

def update(i):
    global initial_capital
    global operation_invest_rate
    global invest_capital
    global fee_rate
    global trade_time_interval                                   
    global token_selected
    global data_door

这里我用数据“填充”。不重要,看下一条评论

    r = requests.get(data_door,params=dict(symbol=token_selected))
    results = r.json()

    # Lier les données de réponse et définir les métadonnées.
    frames ={
        side: pd.DataFrame(
            data=results[side], 
            columns=["price", "quantity"],
            dtype=float)
        for side in ["bids", "asks"]
        }

    # Assigner les colonnes.
    frames_list = [frames[side].assign(side=side) for side in frames]

    # Definir les axes.
    data = pd.concat(frames_list, axis="index", ignore_index=True, sort=True)

    # Groupes de données par niveau de prix.
    price_summary = data.groupby("side").price.describe()

    print(price_summary)
    spread = price_summary._get_value("asks","mean") - price_summary._get_value("bids","mean")
    spread_percent = spread / price_summary._get_value("asks","mean")

    

这是您问题的答案。新数据可用后,您可以将其添加到原始数据并重新调用图表。

    # Mise a jour du graphique.
    prix_achat.append(buy_unit_price)
    prix_vente.append(sell_unit_price)
    ax.scatter(prix_achat, prix_vente, color='blue', alpha=0.5)

定义函数后,您可以调用动画并显示图表。

animation = FuncAnimation(plt.gcf(), update, interval=trade_time_interval)
plt.tight_layout()
plt.show()