从订单簿绘制热图(熊猫数据框)

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"]))


【讨论】:

太棒了,非常感谢!它就像魅力一样!我现在将尝试详细了解您的重组线实际上做了什么...... :) 谢谢!

以上是关于从订单簿绘制热图(熊猫数据框)的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn 热图未显示所有 xticks 和 yticks

用Pandas数据框中的值注释热图

使用 Pandas 数据框中的值注释热图

我们如何在热图中绘制来自多索引数据框的数据?

如何从 pandas DataFrame 绘制热图

如何在熊猫数据框组中创建订单?