从订单簿绘制热图(熊猫数据框)
Posted
技术标签:
【中文标题】从订单簿绘制热图(熊猫数据框)【英文标题】:Plotly heatmap from order book (pandas dataframe) 【发布时间】:2021-09-26 12:39:13 【问题描述】:我正在尝试将订单簿数据输入到我从交换 API 检索的绘图热图中。我检索的数据以这种格式存储在 pandas 数据框中:
id timestamp asks bids
0 4 2021-07-13 18:50:02 [[31416.0, 12.6396], [31417.0, 0.3847], [31418... [[31415.0, 0.6475], [31413.0, 0.1592], [31412....
1 10 2021-07-13 18:51:02 [[31416.0, 12.6396], [31417.0, 0.3847], [31418... [[31415.0, 0.6475], [31413.0, 0.1592], [31412....
2 15 2021-07-13 18:52:02 [[31416.0, 12.6396], [31417.0, 0.3847], [31418... [[31415.0, 0.6475], [31413.0, 0.1592], [31412....
3 20 2021-07-13 18:53:03 [[31416.0, 12.6396], [31417.0, 0.3847], [31418... [[31415.0, 0.6475], [31413.0, 0.1592], [31412....
4 25 2021-07-13 18:54:02 [[31416.0, 12.6396], [31417.0, 0.3847], [31418... [[31415.0, 0.6475], [31413.0, 0.1592], [31412....
... ... ... ... ...
4863 25288 2021-07-18 15:10:01 [[31416.0, 12.6396], [31417.0, 0.3847], [31418... [[31415.0, 0.6475], [31413.0, 0.1592], [31412....
4864 25294 2021-07-18 15:11:01 [[31416.0, 12.6396], [31417.0, 0.3847], [31418... [[31415.0, 0.6475], [31413.0, 0.1592], [31412....
4865 25299 2021-07-18 15:12:02 [[31416.0, 12.6396], [31417.0, 0.3847], [31418... [[31415.0, 0.6475], [31413.0, 0.1592], [31412....
4866 25304 2021-07-18 15:13:03 [[31416.0, 12.6396], [31417.0, 0.3847], [31418... [[31415.0, 0.6475], [31413.0, 0.1592], [31412....
4867 25309 2021-07-18 15:14:02 [[31416.0, 12.6396], [31417.0, 0.3847], [31418... [[31415.0, 0.6475], [31413.0, 0.1592], [31412....
[4868 rows x 4 columns]
如您所见,bids 和 asks 列的内容格式如下:[[price, size of order], [price, size of order], ...]
根据https://plotly.com/python/heatmaps/,热图可以按照这种格式填写数据:
import plotly.graph_objects as go
fig = go.Figure(data=go.Heatmap(
z=[[1, None, 30, 50, 1], [20, 1, 60, 80, 30], [30, 60, 1, -10, 20]],
x=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
y=['Morning', 'Afternoon', 'Evening'],
hoverongaps = False))
fig.show()
热图应该像这个例子一样可视化:
--> x 轴是时间戳
--> y轴是价格
--> z 轴/颜色是给定价格下的订单大小
通过 plotly 给出的示例,我很难正确设置 y 和 z 值。我的印象是,我需要汇总所有订单(对于所有时间戳),然后按价格对它们进行排序,然后将价格放入箱中,然后填补空白(无),然后将它们放入正确的数组结构中......这个似乎真的很复杂,我不知道该怎么做。是否有更简单的方法来实现这一目标?或者一些神奇的python函数可以做需要的事情?
fig = go.Figure(data=go.Heatmap(
x=df['timestamp'],
y=???,
z=???
))
如果有任何帮助,我将不胜感激!谢谢!
编辑:数据框中的示例数据:https://file.io/p2hktQxKljkI
您可以使用df_order_book = pandas.read_csv("test.csv")
加载它。
【问题讨论】:
您能否提供从 API 获取的代码。看起来像是众多 kraken API 之一…… 嗨!好问题...我正在使用 ccxt python 库来检索数据并将其存储在我从中检索它的数据库中...太复杂了,无法完成此处的步骤。但是,我将 pandas 数据框导出到一个 csv 文件中,可以使用 df_order_book = pandas.read_csv("test.csv") 读取该文件。我添加了指向问题的文件的链接。谢谢! :) 【参考方案1】: 看过这个结构数据 - 刚刚看过 ask 将其绘制为散点图、较小的订单、较高的购买价格是有意义的 热图,没看懂获取一些数据
import requests
import pandas as pd
import time
df = pd.DataFrame()
for i in range(20):
df = pd.concat([df, pd.json_normalize(requests.get("https://api.cryptowat.ch/markets/kraken/btcusd/orderbook").json()["result"]).assign(timestamp=pd.to_datetime("now"))])
time.sleep(1)
重新构造并绘制为散点图
import numpy as np
import plotly.graph_objects as go
import plotly.express as px
d = df.loc[:, ["timestamp", "asks"]].explode("asks").assign(
price=lambda d: d["asks"].apply(lambda a: a[0]),
size=lambda d: d["asks"].apply(lambda a: a[1]),
)
px.scatter(d, x="timestamp", y="size", color="price")
热图
go.Figure(go.Heatmap(x=d["timestamp"], y=d["size"], z=d["price"]))
【讨论】:
太棒了,非常感谢!它就像魅力一样!我现在将尝试详细了解您的重组线实际上做了什么...... :) 谢谢!以上是关于从订单簿绘制热图(熊猫数据框)的主要内容,如果未能解决你的问题,请参考以下文章