diff --git a/README.md b/README.md index 72c4eb4..06cdf3e 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,21 @@ exits = exits | forced_exits_window exits.tail(20) ``` +## display plotly figs in single ntb cells + +`figs2cell(figlist)` + +Example usage: + +```python +figs = [] +fig1 = df.groupby([df['Exit Index'].dt.day_name(), 'Direction'])['PnL'].sum().unstack().vbt.barplot() +fig2 = df.groupby([df['Exit Index'].dt.day_name(), 'Direction'])['PnL'].sum().unstack().vbt.barplot() +figs.append(fig1) +figs.append(fig2) +display_figs_side_by_side(figs) +``` + ## is rising/is falling `isrising(series,n)`,`isfalling(series, n)` - returns mask where the condition is satisfied of rising or falling elements including equal values diff --git a/setup.py b/setup.py index 19a8fac..2d7a0b2 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name='ttools', - version='0.3.9', + version='0.4.0', packages=find_packages(), install_requires=[ 'vectorbtpro', diff --git a/ttools/__init__.py b/ttools/__init__.py index 120c6ea..f729e87 100644 --- a/ttools/__init__.py +++ b/ttools/__init__.py @@ -1,2 +1,2 @@ -from .vbtutils import AnchoredIndicator, create_mask_from_window, isrising, isfalling, isrisingc, isfallingc, trades2entries_exits +from .vbtutils import AnchoredIndicator, create_mask_from_window, isrising, isfalling, isrisingc, isfallingc, trades2entries_exits, figs2cell from .vbtindicators import register_custom_inds \ No newline at end of file diff --git a/ttools/vbtutils.py b/ttools/vbtutils.py index 1ae2655..12ef7d3 100644 --- a/ttools/vbtutils.py +++ b/ttools/vbtutils.py @@ -3,8 +3,41 @@ import vectorbtpro as vbt import pandas_market_calendars as mcal from typing import Any import datetime +import plotly.graph_objects as go +import ipywidgets as widgets +from IPython.display import display +def figs2cell(fig_list): + """ + Display a list of plotly figures side by side in a notebook. + Allows to display multiple plots in a single cell. + Args: + fig_list (list): list of figures + + Example usage: + + ```python + figs = [] + fig1 = df.groupby([df['Exit Index'].dt.day_name(), 'Direction'])['PnL'].sum().unstack().vbt.barplot() + fig2 = df.groupby([df['Exit Index'].dt.day_name(), 'Direction'])['PnL'].sum().unstack().vbt.barplot() + figs.append(fig1) + figs.append(fig2) + display_figs_side_by_side(figs) + ``` + """ + # Create output widgets for each figure + output_widgets = [] + for fig in fig_list: + out = widgets.Output() + with out: + fig.show() + output_widgets.append(out) + + # Create an HBox to display the widgets side by side + hbox = widgets.HBox(output_widgets) + display(hbox) + def trades2entries_exits(pf, notext=False): """ Convert trades from Portfolio to entries and exits DataFrame for use in lw plot