import pandas as pd import holoviews as hv from bokeh.sampledata import stocks from holoviews.operation.timeseries import rolling, rolling_outlier_std from holoviews.streams import Stream hv.notebook_extension('bokeh') %%opts Curve {+framewise} 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) stock_symbols = ['AAPL', 'IBM', 'FB', 'GOOG', 'MSFT'] dmap = hv.DynamicMap(load_symbol, kdims='Symbol').redim.values(Symbol=stock_symbols) dmap import param import parambokeh class StockExplorer(Stream): rolling_window = param.Integer(default=10, bounds=(1, 365)) symbol = param.ObjectSelector(default='AAPL', objects=stock_symbols) def view(self): stocks = hv.DynamicMap(load_symbol, kdims=[], streams=[self]) # Apply rolling mean smoothed = rolling(stocks, streams=[self]) # Find outliers outliers = rolling_outlier_std(stocks, streams=[self]) return smoothed * outliers %opts Curve [width=600] {+framewise} Scatter (color='red' marker='triangle') explorer = StockExplorer() parambokeh.Widgets(explorer, continuous_update=True, callback=explorer.event, on_init=True) explorer.view() def render(obj, view): renderer = hv.renderer('bokeh') return renderer.get_plot(obj).state class AdvancedStockExplorer(StockExplorer): output = parambokeh.view.Plot(renderer=render) variable = param.ObjectSelector(default='adj_close', objects=[c for c in stocks.AAPL.keys() if c!= 'date']) def event(self, **kwargs): if self.output is None or 'variable' in kwargs: self.output = self.view() else: super(AdvancedStockExplorer, self).event(**kwargs) explorer = AdvancedStockExplorer() parambokeh.Widgets(explorer, continuous_update=True, callback=explorer.event, on_init=True, view_position='right')