diff --git a/openbb_terminal/dashboards/stream/Forecasting.py b/openbb_terminal/dashboards/stream/Forecasting.py index bebafc92b17..b05fd29a378 100644 --- a/openbb_terminal/dashboards/stream/Forecasting.py +++ b/openbb_terminal/dashboards/stream/Forecasting.py @@ -27,6 +27,7 @@ st.set_page_config( initial_sidebar_state="expanded", ) st_helpers.set_css() +st_helpers.set_current_page("Forecasting") EXPLAINABILITY_FIGURE: Union[OpenBBFigure, None] = None @@ -89,10 +90,10 @@ class Handler: st_helpers.load_state("last_tickers", "") st_helpers.load_state("last_intervals", "1d") st_helpers.load_state("df", pd.DataFrame()) - default_opts = { + self.default_opts = { key: [] for key in ["target_widget", "column_widget", "past_covs_widget"] } - st_helpers.load_widget_options(default_opts, "Forecasting") + st_helpers.load_widget_options(self.default_opts) self.feature_model = None self.feature_target = None @@ -177,7 +178,7 @@ class Handler: fig.update_layout( title=dict(x=0.5, xanchor="center", yanchor="top", y=0.99), showlegend=True, - margin=dict(t=40), + margin=dict(t=40, l=30), height=500, legend=dict( bgcolor="rgba(0,0,0,0.5)", @@ -313,7 +314,9 @@ class Handler: with col_order[1]: target_widget = st.selectbox( "Target", - options=st.session_state["widget_options"]["target_widget"], + options=st_helpers.get_widget_options( + self.default_opts, "target_widget" + ), ) with col_order[2]: @@ -328,7 +331,9 @@ class Handler: with col_order[0]: past_covs_widget = st.multiselect( "Past Covariates", - options=st.session_state["widget_options"]["past_covs_widget"], + options=st_helpers.get_widget_options( + self.default_opts, "past_covs_widget" + ), disabled=not enable_past_covs, label_visibility="hidden" if not enable_past_covs else "visible", ) diff --git a/openbb_terminal/dashboards/stream/pages/Chains.py b/openbb_terminal/dashboards/stream/pages/Chains.py index d702d2234c9..c6508715209 100644 --- a/openbb_terminal/dashboards/stream/pages/Chains.py +++ b/openbb_terminal/dashboards/stream/pages/Chains.py @@ -15,6 +15,7 @@ st.set_page_config( page_title="Chains", initial_sidebar_state="expanded", ) +st_helpers.set_current_page("Chains") st_helpers.set_css() st.sidebar.markdown( diff --git a/openbb_terminal/dashboards/stream/pages/Correlation.py b/openbb_terminal/dashboards/stream/pages/Correlation.py index 2e3adeb0acd..3b875dcf05a 100644 --- a/openbb_terminal/dashboards/stream/pages/Correlation.py +++ b/openbb_terminal/dashboards/stream/pages/Correlation.py @@ -16,6 +16,8 @@ st.set_page_config( page_title="Correlation", initial_sidebar_state="expanded", ) + +st_helpers.set_current_page("Correlation") st_helpers.set_css() st.sidebar.markdown( "

Correlation Analysis

", diff --git a/openbb_terminal/dashboards/stream/pages/Futures.py b/openbb_terminal/dashboards/stream/pages/Futures.py index 03af7b7daab..6f982bcd64b 100644 --- a/openbb_terminal/dashboards/stream/pages/Futures.py +++ b/openbb_terminal/dashboards/stream/pages/Futures.py @@ -21,6 +21,7 @@ st.set_page_config( page_title="Futures", initial_sidebar_state="expanded", ) +st_helpers.set_current_page("Futures") st_helpers.set_css() df = pd.read_csv(MISCELLANEOUS_DIRECTORY / "futures" / "futures.csv") @@ -130,12 +131,12 @@ class Chart: self.tickers = st_helpers.load_state("tickers", {}) self.last_ticker = st_helpers.load_state("last_ticker", TICKERS[0]) self.last_exchange = st_helpers.load_state("last_exchange", EXCHANGES[0]) - default_opts = { + self.default_opts = { "exch_widget": EXCHANGES, "tickers_widget": TICKERS, "cat_widget": CATEGORIES, } - st_helpers.load_widget_options(default_opts, "Futures") + st_helpers.load_widget_options(self.default_opts) def create_stock(self, chart_type, contracts, ticker): if not ticker: @@ -216,25 +217,25 @@ class Chart: st.sidebar.multiselect( "Category", - st.session_state["widget_options"]["cat_widget"], + st_helpers.get_widget_options(self.default_opts, "cat_widget"), on_change=self.on_change, key="cat_widget", ) st.sidebar.multiselect( "Exchange", - st.session_state["widget_options"]["exch_widget"], + st_helpers.get_widget_options(self.default_opts, "exch_widget"), key="exch_widget", on_change=self.on_change, ) ticker_widget = st.sidebar.selectbox( "Ticker", - st.session_state["widget_options"]["tickers_widget"], + st_helpers.get_widget_options(self.default_opts, "tickers_widget"), key="tickers_widget", index=0, ) - chart_widget = st.sidebar.multiselect( - "Chart Type", chart_type, key="chart_widget", default=chart_type[0] + chart_widget = st.sidebar.selectbox( + "Chart Type", chart_type, key="chart_widget", index=0 ) contracts_widget = st.sidebar.slider( "Contracts", 1, 24, 6, key="contracts_widget" diff --git a/openbb_terminal/dashboards/stream/pages/Indicators.py b/openbb_terminal/dashboards/stream/pages/Indicators.py index 6b650f7f749..6a63aeb8dc6 100644 --- a/openbb_terminal/dashboards/stream/pages/Indicators.py +++ b/openbb_terminal/dashboards/stream/pages/Indicators.py @@ -25,11 +25,13 @@ set_system_variable("LOGGING_SUPPRESS", True) pd.options.plotting.backend = "plotly" + st.set_page_config( layout="wide", page_title="Indicators", initial_sidebar_state="expanded", ) +st_helpers.set_current_page("Indicators") st_helpers.set_css() logger = st.empty() diff --git a/openbb_terminal/dashboards/stream/pages/Short_Data.py b/openbb_terminal/dashboards/stream/pages/Short_Data.py index 73ff3aa0a5f..215b7e3168e 100644 --- a/openbb_terminal/dashboards/stream/pages/Short_Data.py +++ b/openbb_terminal/dashboards/stream/pages/Short_Data.py @@ -49,6 +49,7 @@ st.markdown(middle_html, unsafe_allow_html=True) MAIN_LOOP: asyncio.AbstractEventLoop = None # type: ignore +st_helpers.set_current_page("Short Data") st_helpers.set_css() @@ -133,7 +134,7 @@ class FinraShortData: ) fig.update_layout( title=f"Top {self.count_slider} Short Volume in Last {self.days_slider} Days", - margin=dict(l=5), + margin=dict(l=30), xaxis_title="Volume", yaxis_title="Ticker", barmode="stack", @@ -171,7 +172,7 @@ class FinraShortData: ) fig2.update_layout( title=f"Stock Volume and Short Volume for {self.stock_input.upper()}", - margin=dict(l=5), + margin=dict(l=30), xaxis_title="Date", yaxis_title="Volume", ) diff --git a/openbb_terminal/dashboards/stream/pages/Stocks.py b/openbb_terminal/dashboards/stream/pages/Stocks.py index 3c7e6553f9c..c53a0448aa9 100644 --- a/openbb_terminal/dashboards/stream/pages/Stocks.py +++ b/openbb_terminal/dashboards/stream/pages/Stocks.py @@ -24,6 +24,7 @@ st.set_page_config( page_title="Stocks", initial_sidebar_state="expanded", ) +st_helpers.set_current_page("Stocks") logger = st.empty() page_title = st.empty() diff --git a/openbb_terminal/dashboards/stream/streamlit_helpers.py b/openbb_terminal/dashboards/stream/streamlit_helpers.py index 5f0028d51c6..a52a4f232a0 100644 --- a/openbb_terminal/dashboards/stream/streamlit_helpers.py +++ b/openbb_terminal/dashboards/stream/streamlit_helpers.py @@ -25,6 +25,16 @@ STOCKS_CLEAN_DATA = { } +def update_current_page() -> None: + """Updates the current page to the set page""" + st.session_state["set_page"] = st.session_state["current_page"] + + +def set_current_page(page: str) -> None: + """Sets the current page to the given page""" + st.session_state["current_page"] = page + + def get_calc(item, df, rolling) -> pd.DataFrame: return STOCKS_VIEWS[item](df, rolling) @@ -67,20 +77,36 @@ def has_parameter(func: Callable[..., Any], parameter: str) -> bool: def load_state(name: str, default: Any) -> Any: if name not in st.session_state: st.session_state[name] = default + elif st.session_state.get("current_page", None) != st.session_state.get( + "set_page", None + ): + update_current_page() + st.session_state[name] = default + return st.session_state[name] -def load_widget_options(default: Any, page: str) -> Any: +def load_widget_options(default: Any) -> Any: name = "widget_options" if name not in st.session_state: st.session_state[name] = default - elif st.session_state[name].get("page", "") != page: + elif st.session_state.get("current_page", None) != st.session_state.get( + "set_page", None + ): + update_current_page() st.session_state[name] = default - st.session_state[name]["page"] = page return st.session_state[name] +def get_widget_options(default: dict, key: str) -> Any: + options = load_widget_options(default) + if key not in options: + options[key] = default.get(key, None) + + return options[key] + + def save_state(name: str, value: Any): st.session_state[name] = value diff --git a/openbb_terminal/forecast/autoselect_model.py b/openbb_terminal/forecast/autoselect_model.py index b31a8b74536..53282e35403 100644 --- a/openbb_terminal/forecast/autoselect_model.py +++ b/openbb_terminal/forecast/autoselect_model.py @@ -10,6 +10,7 @@ import pandas as pd from darts import TimeSeries from statsforecast.core import StatsForecast +from openbb_terminal.core.session.current_user import get_current_user from openbb_terminal.decorators import log_start_end from openbb_terminal.forecast import helpers from openbb_terminal.rich_config import USE_COLOR, console @@ -21,10 +22,14 @@ logger = logging.getLogger(__name__) # pylint: disable=E1123,E1137 -def precision_format(best_model: str, index: str, val: float) -> str: - if index == best_model and USE_COLOR: +def precision_format(best_model: str, index: str, val: float) -> Union[str, float]: + if ( + index == best_model + and USE_COLOR + and not get_current_user().preferences.USE_INTERACTIVE_DF + ): return f"[#00AAFF]{val:.2f}% [/#00AAFF]" - return f"{val:.2f}%" + return val @log_start_end(log=logger) @@ -167,6 +172,7 @@ def get_autoselect_data( helpers.mean_absolute_percentage_error(y_true, historical_fcast[model].values) for model in model_names ] + precision: pd.DataFrame = pd.DataFrame( {"precision": precision_per_model}, index=model_names ) @@ -181,12 +187,18 @@ def get_autoselect_data( for index, val in precision["precision"].iteritems() ] console.print("\n") + + title = ( + f"[#00AAFF]{best_model}[/#00AAFF]" + if not get_current_user().preferences.USE_INTERACTIVE_DF + else best_model + ) helpers.print_rich_table( precision, show_index=True, index_name="Model", headers=["MAPE"], - title=f"Performance per model.\nBest model: [#00AAFF]{best_model}[/#00AAFF]", + title=f"Performance per model.\nBest model: {title}", ) # transform outputs to make them compatible with diff --git a/openbb_terminal/forecast/helpers.py b/openbb_terminal/forecast/helpers.py index c91ce3bb54b..238b6b33f1a 100644 --- a/openbb_terminal/forecast/helpers.py +++ b/openbb_terminal/forecast/helpers.py @@ -335,11 +335,6 @@ def prepare_scale_train_valid_test( ) -def lambda_price_prediction_color(val: float) -> str: - """Set prediction to be a colored string. This was changed to always shows blue""" - return f"[#00AAFF]{val:.2f} [/#00AAFF]" - - def print_pretty_prediction(df_pred: pd.DataFrame, last_price: float): """Print predictions""" @@ -348,7 +343,7 @@ def print_pretty_prediction(df_pred: pd.DataFrame, last_price: float): df_pred.columns = ["pred"] if not get_current_user().preferences.USE_INTERACTIVE_DF: df_pred["pred"] = df_pred["pred"].apply( - lambda x: lambda_price_prediction_color(x) + lambda x: f"[#00AAFF]{x:.2f} [/#00AAFF]" ) if check_dates(df_pred.index.to_series()): df_pred.index = df_pred.index.date