import panel as pn import pandas as pd import plotly.graph_objects as go from bokeh.sampledata import stocks pn.extension('plotly', sizing_mode="stretch_width") title = '## Stock Explorer Plotly' tickers = ['AAPL', 'FB', 'GOOG', 'IBM', 'MSFT'] def get_df(ticker, window_size): df = pd.DataFrame(getattr(stocks, ticker)) df['date'] = pd.to_datetime(df.date) return df.set_index('date').rolling(window=window_size).mean().reset_index() def get_plot(ticker, window_size): df = get_df(ticker, window_size) return go.Scatter(x=df.date, y=df.close) interact = pn.interact(get_plot, ticker=tickers, window_size=(1, 21, 5)) pn.Row( pn.Column(title, interact[0], sizing_mode="fixed", width=300), interact[1] ) ticker = pn.widgets.Select(name='Ticker', options=tickers) window = pn.widgets.IntSlider(name='Window Size', value=6, start=1, end=21) @pn.depends(ticker.param.value, window.param.value) def get_plot(ticker, window_size): df = get_df(ticker, window_size) return go.Scatter(x=df.date, y=df.close) pn.Row( pn.Column(title, ticker, window, sizing_mode="fixed", width=300), get_plot ) import param class StockExplorer(param.Parameterized): ticker = param.Selector(default='AAPL', objects=tickers) window_size = param.Integer(default=6, bounds=(1, 21)) @param.depends('ticker', 'window_size') def plot(self): return get_plot(self.ticker, self.window_size) explorer = StockExplorer() pn.Row(pn.Column(explorer.param, sizing_mode="fixed", width=300), explorer.plot) ticker = pn.widgets.Select(name='Ticker', options=['AAPL', 'FB', 'GOOG', 'IBM', 'MSFT']) window = pn.widgets.IntSlider(name='Window', value=6, start=1, end=21) row = pn.Row( pn.Column(title, ticker, window, sizing_mode="fixed", width=300), get_plot(ticker.options[0], window.value) ) def update(event): row[1].object = get_plot(ticker.value, window.value) ticker.param.watch(update, 'value') window.param.watch(update, 'value') row description="""This example compares **four different implementations of the same app** using - the quick and easy ``interact`` function, - more flexible *reactive* functions, - declarative *Param-based* code, and - explicit *callbacks*.""" pn.template.FastListTemplate(site="Panel", title="Plotly Stock Explorer", sidebar=[ticker, window], main=[description, row[1]]).servable();