import pandas as pd import holoviews as hv from bokeh.sampledata import stocks from holoviews.operation.timeseries import rolling, rolling_outlier_std hv.extension('bokeh') def load_symbol(symbol, variable, **kwargs): df = pd.DataFrame(getattr(stocks, symbol)) df['date'] = df.date.astype('datetime64[ns]') return hv.Curve(df, ('date', 'Date'), variable).opts(framewise=True) stock_symbols = ['AAPL', 'IBM', 'FB', 'GOOG', 'MSFT'] variables = ['open', 'high', 'low', 'close', 'volume', 'adj_close'] dmap = hv.DynamicMap(load_symbol, kdims=['Symbol','Variable']) dmap = dmap.redim.values(Symbol=stock_symbols, Variable=variables) dmap.opts(framewise=True) rolling(dmap, rolling_window=2) import panel as pn symbol = pn.widgets.RadioButtonGroup(options=stock_symbols) variable = pn.widgets.Select(options=variables) rolling_window = pn.widgets.IntSlider(name='Rolling Window', value=10, start=1, end=365) pn.Column(symbol, variable, rolling_window) dmap = hv.DynamicMap(pn.bind(load_symbol, symbol=symbol, variable=variable)) smoothed = rolling(dmap, rolling_window=rolling_window) app = pn.Row(pn.WidgetBox('## Stock Explorer', symbol, variable, rolling_window), smoothed.opts(width=500, framewise=True)).servable() app app.save("dashboard.html", embed=True) import param class StockExplorer(param.Parameterized): rolling_window = param.Integer(default=10, bounds=(1, 365)) symbol = param.ObjectSelector(default='AAPL', objects=stock_symbols) variable = param.ObjectSelector(default='adj_close', objects=variables) @param.depends('symbol', 'variable') def load_symbol(self): df = pd.DataFrame(getattr(stocks, self.symbol)) df['date'] = df.date.astype('datetime64[ns]') return hv.Curve(df, ('date', 'Date'), self.variable).opts(framewise=True) explorer = StockExplorer() stock_dmap = hv.DynamicMap(explorer.load_symbol) pn.Row(explorer.param, stock_dmap) # Apply rolling mean smoothed = rolling(stock_dmap, rolling_window=explorer.param.rolling_window) # Find outliers outliers = rolling_outlier_std(stock_dmap, rolling_window=explorer.param.rolling_window).opts( color='red', marker='triangle') pn.Row(explorer.param, (smoothed * outliers).opts(width=600)) from holoviews.operation.datashader import datashade, dynspread class AdvancedStockExplorer(StockExplorer): datashade = param.Boolean(default=False) @param.depends('datashade') def view(self): stocks = hv.DynamicMap(self.load_symbol) # Apply rolling mean smoothed = rolling(stocks, rolling_window=self.param.rolling_window) if self.datashade: smoothed = dynspread(datashade(smoothed, aggregator='any')).opts(framewise=True) # Find outliers outliers = rolling_outlier_std(stocks, rolling_window=self.param.rolling_window).opts( width=600, color='red', marker='triangle', framewise=True) return (smoothed * outliers) explorer = AdvancedStockExplorer() pn.Row(explorer.param, explorer.view)