🙆

Wandbにbokehのグラフを埋め込む

2025/01/04に公開

自分用のメモ

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