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='adj_close', **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'] dmap = hv.DynamicMap(load_symbol, kdims='Symbol').redim.values(Symbol=stock_symbols) dmap.opts(framewise=True) import param import panel as pn variables = ['open', 'high', 'low', 'close', 'volume', 'adj_close'] 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(pn.panel(explorer.param, parameters=['symbol', 'variable']), 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)) 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.depends(symbol=symbol.param.value, variable=variable.param.value) def load_symbol_cb(symbol, variable): return load_symbol(symbol, variable) dmap = hv.DynamicMap(load_symbol_cb) smoothed = rolling(dmap, rolling_window=rolling_window.param.value) pn.Row(pn.WidgetBox('## Stock Explorer', symbol, variable, rolling_window), smoothed.opts(width=500, framewise=True)) 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)