Example #1
0
class StockApp(BokehApplet):
    plot = Instance(Plot)
    source = Instance(ColumnDataSource)
    pretext = Instance(PreText)

    def get_data(self, ticker1, ticker2):
        fname = join(data_dir, "table_%s.csv" % ticker1.lower())
        data1 = pd.read_csv(fname,
                            names=['date', 'foo', 'o', 'h', 'l', 'c', 'v'],
                            header=False,
                            parse_dates=['date'])
        data1 = data1.set_index('date')
        fname = join(data_dir, "table_%s.csv" % ticker2.lower())
        data2 = pd.read_csv(fname,
                            names=['date', 'foo', 'o', 'h', 'l', 'c', 'v'],
                            header=False,
                            parse_dates=['date'])
        data2 = data2.set_index('date')
        data = pd.DataFrame({ticker1: data1.c, ticker2: data2.c})
        data[ticker1 + "_returns"] = data[ticker1].diff()
        data[ticker2 + "_returns"] = data[ticker2].diff()
        data = data.dropna()
        return data

    def create(self, session):
        """
        This function is called once, and is responsible for
        creating all objects (plots, datasources, etc)
        """
        self.modelform = StockInputModel()
        self.modelform.create_inputs(session)
        ticker1 = self.modelform.ticker1
        ticker2 = self.modelform.ticker2
        self.pretext = PreText(text="")
        self.make_source(ticker1, ticker2)
        self.make_plots(ticker1, ticker2)
        self.make_stats()
        self.set_children()
        self.add_all(session)

    def make_source(self, ticker1, ticker2):
        df = self.get_data(ticker1, ticker2)
        self.source = ColumnDataSource(data=df)

    def make_plots(self, ticker1, ticker2):
        self.plot = circle(ticker1 + "_returns",
                           ticker2 + "_returns",
                           title="%s vs %s" % (ticker1, ticker2),
                           source=self.source,
                           plot_width=400,
                           plot_height=400,
                           tools="pan,wheel_zoom,select")
        session().plotcontext.children = [self]
        session().plotcontext._dirty = True

    def set_children(self):
        self.children = [self.modelform, self.plot, self.pretext]

    def input_change(self, obj, attrname, old, new):
        """
        This function is called whenever the input form changes
        This is responsible for updating the plot, or whatever
        you want.  The signature is
        obj : the object that changed
        attrname : the attr that changed
        old : old value of attr
        new : new value of attr
        """
        if attrname in ("ticker1", "ticker2"):
            ticker1 = self.modelform.ticker1
            ticker2 = self.modelform.ticker2
            self.make_source(ticker1, ticker2)
            self.make_plots(ticker1, ticker2)
            self.set_children()

    def setup_events(self):
        super(StockApp, self).setup_events()
        if self.source:
            self.source.on_change('selected', self, 'selection_change')

    def make_stats(self):
        pandas_df = pd.DataFrame(self.source.data)
        selected = self.source.selected
        if selected:
            pandas_df = pandas_df.iloc[selected, :]
        stats = pandas_df.describe()
        self.pretext.text = str(stats)

    def selection_change(self, obj, attrname, old, new):
        self.make_stats()
Example #2
0
class StockApp(BokehApplet):
    plot = Instance(Plot, has_ref=True)
    source = Instance(ColumnDataSource, has_ref=True)
    pretext = Instance(PreText, has_ref=True)
    
    def get_data(self, ticker1, ticker2):
        fname = join(data_dir, "table_%s.csv" % ticker1.lower())
        data1 = pd.read_csv(fname, 
                            names=['date', 'foo', 'o', 'h', 'l', 'c', 'v'], 
                            header=False,
                            parse_dates=['date'])
        data1 = data1.set_index('date')
        fname = join(data_dir, "table_%s.csv" % ticker2.lower())        
        data2 = pd.read_csv(fname, 
                            names=['date', 'foo', 'o', 'h', 'l', 'c', 'v'], 
                            header=False,
                            parse_dates=['date'])
        data2 = data2.set_index('date')
        data = pd.DataFrame({ticker1 : data1.c, ticker2 : data2.c})
        data[ticker1 + "_returns"] = data[ticker1].diff()
        data[ticker2 + "_returns"] = data[ticker2].diff()
        data = data.dropna()
        return data
        
    def create(self, session):
        """
        This function is called once, and is responsible for 
        creating all objects (plots, datasources, etc)
        """
        self.modelform = StockInputModel()
        self.modelform.create_inputs(session)
        ticker1 = self.modelform.ticker1
        ticker2 = self.modelform.ticker2
        self.pretext = PreText(text="")
        self.make_source(ticker1, ticker2)
        self.make_plots(ticker1, ticker2)
        self.make_stats()
        self.set_children()
        self.add_all(session)
        
    def make_source(self, ticker1, ticker2):
        df = self.get_data(ticker1, ticker2)
        self.source = ColumnDataSource(data=df)
        
    def make_plots(self, ticker1, ticker2):
        self.plot = circle(ticker1 + "_returns", ticker2 + "_returns", 
                           title="%s vs %s" %(ticker1, ticker2),
                           source=self.source,
                           plot_width=400, plot_height=400,
                           tools="pan,wheel_zoom,select"
        )
        session().plotcontext.children=[self]
        session().plotcontext._dirty = True
        
    def set_children(self):
        self.children = [self.modelform, self.plot, self.pretext]

    def input_change(self, obj, attrname, old, new):
        """
        This function is called whenever the input form changes
        This is responsible for updating the plot, or whatever
        you want.  The signature is 
        obj : the object that changed
        attrname : the attr that changed
        old : old value of attr
        new : new value of attr
        """
        if attrname in ("ticker1", "ticker2"):
            ticker1 = self.modelform.ticker1
            ticker2 = self.modelform.ticker2
            self.make_source(ticker1, ticker2)
            self.make_plots(ticker1, ticker2)
            self.set_children()
            
    def setup_events(self):
        super(StockApp, self).setup_events()
        if self.source:
            self.source.on_change('selected', self, 'selection_change')
            
    def make_stats(self):
        pandas_df = pd.DataFrame(self.source.data)
        selected = self.source.selected
        if selected:
            pandas_df = pandas_df.iloc[selected, :]
        stats = pandas_df.describe()
        self.pretext.text = str(stats)
        
    def selection_change(self, obj, attrname, old, new):
        self.make_stats()
Example #3
0
class StockApp(VBox):
    extra_generated_classes = [["StockApp", "StockApp", "VBox"]]
    jsmodel = "VBox"

    # text statistics
    pretext = Instance(PreText)

    # plots
    plot = Instance(Plot)
    line_plot1 = Instance(Plot)
    line_plot2 = Instance(Plot)
    hist1 = Instance(Plot)
    hist2 = Instance(Plot)

    # data source
    source = Instance(ColumnDataSource)

    # layout boxes
    mainrow = Instance(HBox)
    histrow = Instance(HBox)
    statsbox = Instance(VBox)

    # inputs
    ticker1 = String(default="AAPL")
    ticker2 = String(default="GOOG")
    ticker1_select = Instance(Select)
    ticker2_select = Instance(Select)
    input_box = Instance(VBoxForm)

    def __init__(self, *args, **kwargs):
        super(StockApp, self).__init__(*args, **kwargs)
        self._dfs = {}

    @classmethod
    def create(cls):
        """
        This function is called once, and is responsible for
        creating all objects (plots, datasources, etc)
        """
        # create layout widgets
        obj = cls()
        obj.mainrow = HBox()
        obj.histrow = HBox()
        obj.statsbox = VBox()
        obj.input_box = VBoxForm()

        # create input widgets
        obj.make_inputs()

        # outputs
        obj.pretext = PreText(text="", width=500)
        obj.make_source()
        obj.make_plots()
        obj.make_stats()

        # layout
        obj.set_children()
        return obj

    def make_inputs(self):
        self.ticker1_select = Select(
            name='ticker1',
            value='AAPL',
            options=['AAPL', 'GOOG', 'INTC', 'BRCM', 'YHOO']
        )
        self.ticker2_select = Select(
            name='ticker2',
            value='GOOG',
            options=['AAPL', 'GOOG', 'INTC', 'BRCM', 'YHOO']
        )

    @property
    def selected_df(self):
        pandas_df = self.df
        selected = self.source.selected
        if selected:
            pandas_df = pandas_df.iloc[selected, :]
        return pandas_df

    def make_source(self):
        self.source = ColumnDataSource(data=self.df)

    def line_plot(self, ticker, x_range=None):
        plot = circle(
            'date', ticker,
            title=ticker,
            size=2,
            x_range=x_range,
            x_axis_type='datetime',
            source=self.source,
            title_text_font_size="10pt",
            plot_width=1000, plot_height=200,
            nonselection_alpha=0.02,
            tools="pan,wheel_zoom,select"
        )
        return plot

    def hist_plot(self, ticker):
        global_hist, global_bins = np.histogram(self.df[ticker + "_returns"], bins=50)
        hist, bins = np.histogram(self.selected_df[ticker + "_returns"], bins=50)
        width = 0.7 * (bins[1] - bins[0])
        center = (bins[:-1] + bins[1:]) / 2
        start = global_bins.min()
        end = global_bins.max()
        top = hist.max()
        return rect(
            center, hist/2.0, width, hist,
            title="%s hist" % ticker,
            plot_width=500, plot_height=200,
            tools="",
            title_text_font_size="10pt",
            x_range=[start, end],
            y_range=[0, top],
        )

    def make_plots(self):
        ticker1 = self.ticker1
        ticker2 = self.ticker2
        self.plot = circle(
            ticker1 + "_returns", ticker2 + "_returns",
            size=2,
            title="%s vs %s" %(ticker1, ticker2),
            source=self.source,
            plot_width=400, plot_height=400,
            tools="pan,wheel_zoom,select",
            title_text_font_size="10pt",
            nonselection_alpha=0.02,
        )
        self.line_plot1 = self.line_plot(ticker1)
        self.line_plot2 = self.line_plot(ticker2, self.line_plot1.x_range)
        self.hist_plots()

    def hist_plots(self):
        ticker1 = self.ticker1
        ticker2 = self.ticker2
        self.hist1 = self.hist_plot(ticker1)
        self.hist2 = self.hist_plot(ticker2)

    def set_children(self):
        self.children = [self.mainrow, self.histrow, self.line_plot1, self.line_plot2]
        self.mainrow.children = [self.input_box, self.plot, self.statsbox]
        self.input_box.children = [self.ticker1_select, self.ticker2_select]
        self.histrow.children = [self.hist1, self.hist2]
        self.statsbox.children = [self.pretext]

    def input_change(self, obj, attrname, old, new):
        if obj == self.ticker2_select:
            self.ticker2 = new
        if obj == self.ticker1_select:
            self.ticker1 = new
        self.make_source()
        self.make_plots()
        self.set_children()
        curdoc().add(self)

    def setup_events(self):
        super(StockApp, self).setup_events()
        if self.source:
            self.source.on_change('selected', self, 'selection_change')
        if self.ticker1_select:
            self.ticker1_select.on_change('value', self, 'input_change')
        if self.ticker2_select:
            self.ticker2_select.on_change('value', self, 'input_change')

    def make_stats(self):
        stats = self.selected_df.describe()
        self.pretext.text = str(stats)

    def selection_change(self, obj, attrname, old, new):
        self.make_stats()
        self.hist_plots()
        self.set_children()
        curdoc().add(self)

    @property
    def df(self):
        return get_data(self.ticker1, self.ticker2)