从订单簿中绘制热图(pandas 数据框)

Plotly heatmap from order book (pandas dataframe)

我正在尝试将订单簿数据输入到我从交易所检索的绘图热图中 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]

如您所见,出价和要价列的内容具有以下格式:[[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 axis/color 是给定价格下的订单大小

对于 plotly 中的给定示例,我很难获得正确的 y 和 z 值。我的印象是,我需要聚合所有订单(针对所有时间戳),然后按价格对它们进行排序,然后将价格放入箱子中,然后填充间隙(使用 None),然后将它们放入正确的数组结构中...这似乎真的很复杂,我不知道该怎么做。有没有更简单的方法来实现这一目标?或者一些神奇的 python 功能可以满足需要?

fig = go.Figure(data=go.Heatmap(
                   x=df['timestamp'],
                   y=???,
                   z=???
))

如有任何帮助,我将不胜感激!谢谢!

编辑:来自数据框的示例数据:https://file.io/p2hktQxKljkI 您可以使用 df_order_book = pandas.read_csv("test.csv").

加载它
  • 看过这个结构数据 - 刚看过
  • 当绘制成散点图、较小的订单、较高的购买价格时很有意义
  • 热图,没看懂

获取一些数据

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