🙆
Wandbにbokehのグラフを埋め込む
自分用のメモ
import io
import wandb
from dotenv import load_dotenv
load_dotenv()
import holoviews as hv
from holoviews import opts
import panel as pn
from bokeh.resources import INLINE
hv.extension("bokeh", logo=False)
opts.defaults(opts.Curve(tools=['hover']), opts.Overlay(width=800, legend_position='right'))
def holoviews_panel_to_html_str(hv_obj):
"""
Holoviewsオブジェクト (またはpn.Pane) をパネル上に配置し、
.save() の出力を StringIO に書き込んで返す関数。
"""
pane = pn.pane.HoloViews(hv_obj, sizing_mode="stretch_width")
# StringIO を作り、ここに .save() する
with io.StringIO() as html_buffer:
pane.save(html_buffer, resources=INLINE)
html_str = html_buffer.getvalue()
return html_str
def main():
from crypto_dataset import get_data
ex = "bybit_perp"
symbol = "BTC/USDT"
interval_min = 60
n_set = 1 # データセット数
df = get_data(ex, interval_min, symbol, n_set)
df = df.resample('1D').agg({
'open': 'first',
'high': 'max',
'low': 'min',
'close': 'last',
'volume': 'sum'
}).dropna()
# WandB で Run を開始
wandb.init(project="botter", tags=["gomi"])
# -------------------------------------------------
# (1) Holoviews で Open, Close のタイムシリーズを作成
# df.index を x 軸に、Open, Close を y 軸にした Curve
df = df.reset_index()
curve_open = hv.Curve(df, 'time', 'open', label="open")
curve_close = hv.Curve(df, 'time', 'close', label="close")
overlay = (curve_open * curve_close).opts(ylabel="Price", xlabel="Time")
html_str = holoviews_panel_to_html_str(overlay)
wandb.log({"Open_Close_Plot": wandb.Html(html_str)})
# 終了
wandb.finish()
# Python スクリプトとして直接実行された場合のみ main() を呼ぶ
if __name__ == "__main__":
main()
Discussion