我怎样才能从 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()
我有以下两批代码;第一个从 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()