[英]How can I keep the data from being crowded together in matplotlib scatter plot?
[英]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)
上面的輸出看起來像這樣:
每秒都會生成一行新數據。
以上當然會連續運行,除非被中斷。
然后我有下面的代碼,它從上表中提取數據。 但我遇到的問題是上面的代碼不會停止運行,所以我們永遠不會看到下面的代碼。 我當然可以在一定數量的行之后停止上面的操作,但我想要的是將實時數據提取到下面的代碼中。 有什么想法可以重新排列我的代碼來實現這一點嗎?
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.