def assemble_metric_comparison_table(self, daily_metrics, model_dropdown, time_period_slider): model = model_dropdown.value date_start, date_end = time_period_slider.value_as_datetime target_df = daily_metrics[model][date_start:date_end] metric_data = self._calculate_metrics(target_df) source = ColumnDataSource(data=metric_data) columns = [ TableColumn(field="precision", title="Precision"), TableColumn(field="recall", title="Recall"), TableColumn(field="f1_score", title="F1 Score"), TableColumn(field="sample_size", title="Sample Size"), TableColumn(field="threshold", title="Threshold") ] data_table = DataTable(source=source, columns=columns, width=600, height=280) title_div = Div() title_div.text = "Precision, Recall, F1 Score, Sample Size and Threshold for <strong>{}</strong>".format( model) def update(attr, old, new): model = model_dropdown.value date_start, date_end = time_period_slider.value_as_datetime title_div.text = "Precision, Recall, F1 Score, Sample Size and Threshold for <strong>{}</strong>".format( model) model_metrics = daily_metrics[model][date_start:date_end] source.data = ColumnDataSource.from_df( self._calculate_metrics(model_metrics)) model_dropdown.on_change('value', update) time_period_slider.on_change('value', update) return row(column(title_div, data_table))
def create_2d_molecule(data, title="Generated Molecules", position=-1, width=850, height=590, css_classes=["img_outside"]): img_fig = Div(text="", width=width, height=height) img_fig.css_classes = css_classes if position < 0: position = len(data) - 1 smiles, score = extract_compounds(data, position) mols = [] scores = [] for i, smile in enumerate(smiles): mol = Chem.MolFromSmiles(smile) if mol: mols.append(mol) scores.append(str(score[i])) if len(mols) >= 6: break if len(mols) > 0: img = Draw.MolsToGridImage(mols, molsPerRow=3, legends=scores, subImgSize=(250, 250), useSVG=True) img = img.replace("FFFFFF", "EDEDED") else: img = "" img_fig.text = '<h2>' + title + ' Step: ' + str(position) + '</h2>' + '<div class="img_inside">' + img + '</div>' return img_fig
f_update() def preview(): read_values() c_update() f_update() c_controls = [ov_min_text, ov_min1_text] for cc in c_controls: cc.on_change("value", lambda attr, old, new: change_values()) preview_clust_button.on_click(preview) reset_button.on_click(reset_values) ### Page layout top_title = Div( text="<h3></h3>", name='top_title') if trimmed: top_title.text = "<h3>Caution: some regions had >50 hits, and have been truncated.</h3>" cl_title = Div( text="<h3>Clustering parameters:</h3>" ) empty_vert = Div( text="<br><br>" ) goto_summary_button = Div(text='''<form name="Goto_summary" action="/'''+orf+'''" method="get"> <input type="hidden" name="prob" id="prob" value="'''+str(prob_def)+'''"/> <input type="hidden" name="ovm" id="ovm" value="'''+str(om_def)+'''" /> <input type="hidden" name="ovm1" id="ovm1" value="'''+str(om_def1)+'''" /> <button type="submit">Go to summary view</button> </form>''', name='goto_summary_button') page = layout( [widgetbox(top_title)], [widgetbox(threshold_text), widgetbox(cl_title, ov_min_text, ov_min1_text), widgetbox(empty_vert, preview_clust_button, reset_button), widgetbox(goto_summary_button)], [p], sizing_mode='scale_width' )
year_input.on_change('value', season_handler) # arrange layout tab1 = Panel(child=plot1_wrap, title='Scores') tab2 = Panel(child=plot2_wrap, title='Expected Wins') tab3 = Panel(child=table_wrap, title='Summary') figures = Tabs(tabs=[tab1, tab2, tab3], width=500) compare_widgets = column(team1_dd, team2_dd, comp_button) wid_spac1 = Spacer(height=30) wid_spac2 = Spacer(height=30) wid_spac3 = Spacer(height=30) lg_id_message.text = '<b><p style="color: green;">League accessed successfully.</p></b>' all_widgets = column(lg_id_input, lg_id_message, wid_spac1, compare_widgets, wid_spac2, week_slider, wid_spac3, year_input) page_title = Div( text= """<strong><h1 style="font-size: 2.5em;">ESPN Fantasy Football League Explorer</h1></strong>""", width=700, height=50) main_area = row(all_widgets, figures) layout = column(page_title, main_area) curdoc().add_root(layout)
def selection_tab(rtdap_data): def make_base_map(tile_map=CARTODBPOSITRON_RETINA, map_width=800, map_height=500, xaxis=None, yaxis=None, xrange=(-9990000, -9619944), yrange=(5011119, 5310000), plot_tools="pan,wheel_zoom,reset,save"): p = figure(tools=plot_tools, width=map_width, height=map_height, x_axis_location=xaxis, y_axis_location=yaxis, x_range=xrange, y_range=yrange, toolbar_location="above") p.grid.grid_line_color = None #p.background_fill_color = None p.background_fill_alpha = 0.5 p.border_fill_color = None p.add_tile(tile_map) return p def rtdap_avg(df, corr, value): """ returns mean for specificed attribute by highway corridor Keyword arguments: df -- dataframe to filter by corridor and calculate mean corr -- corridor name value -- dataframe column name to calculate mean """ df_corr = df.loc[df['corridor'] == corr] mean_value = df_corr[value].mean() return mean_value def filter_selection(df, corr, date_s, date_e, weekday, tod): """ returns subset of data based on corridor and time selections Keyword arguments: df -- dataframe to filter by corridor and time selections corr -- corridor name date_s -- start date date_e -- end date weekday -- day of week (Monday - Friday) tod -- time of day (8 tod time periods) """ tod_start = tod[0] tod_end = tod[1] date_start = datetime.strptime(date_s, '%Y-%m-%d') date_end = datetime.strptime(date_e, '%Y-%m-%d') if weekday == 'All': weekday = df['dow'].drop_duplicates().values.tolist() else: weekday = [weekday] select_df = df.loc[(df['corridor'] == corr) &\ (df['date']>=date_start) & (df['date']<=date_end) &\ (df['dow'].isin(weekday)) &\ (df['hour']>=tod_start) & (df['hour']<=tod_end)] return select_df def summarize_metrics(df, corr, group, avg, select, label, missing): """ return a summary of frequency, mean, mean difference, and count of missing values Keyword arguments: df -- dataframe to summarize corr -- corridor name group -- dataframe column name used to group and summarize data avg -- mean value derived from rtdap_avg(), used calculate mean diff select -- dateframe column name to calculate mean label -- name for values being calculate (ie Speed, Volumne, Time etc) missing -- dataframe column name of missing values """ df['freq'] = 1 df_groupby = df.groupby(group).agg({ 'freq': 'count', select: np.mean, missing: sum }).reset_index() df_groupby.loc[:, 'Mean Diff'] = (avg - df_groupby[select]) / df_groupby[select] df_groupby.loc[:, group] = label df_groupby.columns = [ corr, 'Frequency', 'Mean', 'Missing Values', 'Mean Diff' ] df_groupby = df_groupby.set_index(corr) return df_groupby[['Frequency', 'Mean', 'Mean Diff', 'Missing Values']] def vbar_chart(full_df, df): """ returns bokeh horizontal barchart representing mean % diff Keyword arguments: df -- dataframe to derive content of barchart col -- column name for values to diplay in graph """ df_avg = full_df.groupby('FieldDeviceID').agg({'avgSpeed': np.mean}) df_select = df.groupby('FieldDeviceID').agg({'avgSpeed': np.mean}) df_select.columns = ['speed'] diff = df_avg.merge(df_select, how='left', left_index=True, right_index=True).fillna(0) diff_no_zero = diff.loc[(diff['avgSpeed'] > 0) & (diff['speed'] > 0)] diff_no_zero['speed_difference'] = diff_no_zero[ 'avgSpeed'] - diff_no_zero['speed'] diff_no_zero = diff_no_zero.reset_index() diff_no_zero['bins'] = pd.cut(diff_no_zero['speed_difference'], bins=list(range(-20, 22)), labels=list(range(-20, 22))[:-1]) source = ColumnDataSource( data=diff_no_zero.groupby('bins').agg({ 'speed_difference': 'count' }).reset_index()) p = figure(plot_width=1000, plot_height=150, title="Speed Difference Distribution", toolbar_location="above") p.vbar(x='bins', top='speed_difference', width=1, color='navy', alpha=0.5, source=source) #p.yaxis.visible = False #p.xaxis.formatter = NumeralTickFormatter(format="0.f%") p.xgrid.visible = False p.ygrid.visible = False #p.background_fill_color = None p.background_fill_alpha = 0.5 p.border_fill_color = None return p def hbar_chart(df, col): """ returns bokeh horizontal barchart representing mean % diff Keyword arguments: df -- dataframe to derive content of barchart col -- column name for values to diplay in graph """ df_src = df[[col]] df_src['type'] = df_src.index df_src['order'] = 0 df_src['order'] = np.where(df_src.index == 'Speed', 2, df_src['order']) df_src['order'] = np.where(df_src.index == 'Occupancy', 1, df_src['order']) df_src['order'] = np.where(df_src.index == 'Volume', 0, df_src['order']) df_src['color'] = '#C0C0C0' df_src['color'] = np.where(df_src['Mean Diff'] < -.05, '#FF0000', df_src['color']) df_src['color'] = np.where(df_src['Mean Diff'] > .05, '#008000', df_src['color']) source = ColumnDataSource(data=df_src.sort_values(by='order')) hover = HoverTool(tooltips=[ ("Corridor Attribute", "@type"), ("% Difference", "@{%s}" % (col) + '{%0.2f}'), ]) tools = ['reset', 'save', hover] p = figure(plot_width=400, plot_height=175, toolbar_location="above", title='Mean Difference', tools=tools) p.hbar(y='order', height=0.5, left=0, fill_color='color', line_color=None, right=col, color="navy", source=source) p.yaxis.visible = False p.xaxis.formatter = NumeralTickFormatter(format="0.f%") p.xgrid.visible = False p.ygrid.visible = False #p.background_fill_color = None p.background_fill_alpha = 0.5 p.border_fill_color = None return source, p def scatter_plot(title_text): rng = np.random.RandomState(0) x = rng.randn(100) y = rng.randn(100) source = ColumnDataSource(data=dict( x=rng.randn(100), y=rng.randn(100), desc=['A', 'b', 'C', 'd', 'E'] * 20, )) hover = HoverTool(tooltips=[ ("index", "$index"), ("(x,y)", "($x, $y)"), ("desc", "@desc"), ]) p = figure(plot_width=300, plot_height=250, tools=[hover, 'box_select'], toolbar_location="above", title=title_text) p.circle('x', 'y', size=5, source=source) #p.background_fill_color = None p.background_fill_alpha = 0.5 p.border_fill_color = None return p """ return selection tab contents Keyword arguments: rtdap_data - dataframe containing rtdap vds detail data """ #----------------------------------------------------------------------------------------------------------------- #submit_selection -- Data Selection Update Function def submit_selection(): """ python callback to update table and visual content based on user selections in the data review panel """ avgs_speed = rtdap_avg(rtdap_data, corridor_select.value, 'avgSpeed') avgs_occ = rtdap_avg(rtdap_data, corridor_select.value, 'avgOccupancy') avgs_volume = rtdap_avg(rtdap_data, corridor_select.value, 'avgVolume') filtered_data = filter_selection(rtdap_data, corridor_select.value, str(date_picker_start.value), str(date_picker_end.value), day_of_week.value, time_of_day.value) speed = summarize_metrics(filtered_data, corridor_select.value, 'corridor', avgs_speed, 'avgSpeed', 'Speed', 'missing_speed') occ = summarize_metrics(filtered_data, corridor_select.value, 'corridor', avgs_occ, 'avgOccupancy', 'Occupancy', 'missing_occ') volume = summarize_metrics(filtered_data, corridor_select.value, 'corridor', avgs_volume, 'avgVolume', 'Volume', 'missing_vol') summary_df = speed.append(occ) summary_df = summary_df.append(volume) summary_title.text = "<h1>" + corridor_select.value + " Summary</h1>" summary_df_tbl = summary_df.copy() summary_df_tbl['Mean Diff'] = summary_df_tbl['Mean Diff'] * 100 summary_df_tbl = summary_df_tbl.reset_index() summary_table.text = str( summary_df_tbl.fillna(0).to_html( index=False, formatters=[ str, '{:20,}'.format, '{:20,.1f}'.format, '{:20,.1f}%'.format, '{:20,}'.format ], classes=["w3-table", "w3-hoverable", "w3-small"])) if len(summary_df) > 0: new_df = summary_df.fillna(0) bar_viz_new = hbar_chart(new_df, 'Mean Diff')[0] bar_viz_src.data.update(bar_viz_new.data) #----------------------------------------------------------------------------------------------------------------- #Data Review Panel panel_title = Div( text="Data Review", css_classes=["panel-heading", "text-center", "w3-text-white"]) panel_text = Div( text= """Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.""", css_classes=["panel-content", "w3-text-white"]) #Panel Buttons corridor_select = Select( options=rtdap_data['corridor'].drop_duplicates().values.tolist(), title='Corridor:', height=60, value='Dan Ryan Express Lane', css_classes=["panel-content"]) date_picker_start = DatePicker(min_date=date(2015, 1, 1), max_date=date(2018, 12, 31), css_classes=["panel-content"], title="Start Date:", height=60, value=date(2015, 12, 31)) date_picker_end = DatePicker(min_date=date(2015, 1, 1), max_date=date(2018, 12, 31), css_classes=["panel-content"], title="End Date:", height=60, value=date(2017, 12, 31)) time_of_day = RangeSlider(start=1, end=8, step=1, value=(1, 2), title="Time of Day:", bar_color="black", css_classes=["panel-content"]) tod_description = Div( text="""Time of Day Categories:<br> <ol> <li>8pm-6am</li> <li>6pm-7am</li> <li>7am-8am</li> <li>9am-10am</li> <li>10am-2pm</li> <li>2pm-4pm</li> <li>4pm-6pm</li> <li>6pm-8pm</li> </ol>""", css_classes=["panel-content", "caption", "w3-text-white"]) day_of_week = Select(options=['All'] + rtdap_data['dow'].drop_duplicates().values.tolist(), title="Day of Week:", css_classes=["panel-content"], height=60, value="All") select_data = Button(label="Select Subset", css_classes=["panel-content"], height=60) select_data.on_click(submit_selection) #----------------------------------------------------------------------------------------------------------------- #----------------------------------------------------------------------------------------------------------------- #Create initial content avgs_speed = rtdap_avg(rtdap_data, corridor_select.value, 'avgSpeed') avgs_occ = rtdap_avg(rtdap_data, corridor_select.value, 'avgOccupancy') avgs_volume = rtdap_avg(rtdap_data, corridor_select.value, 'avgVolume') filtered_data = filter_selection(rtdap_data, corridor_select.value, str(date_picker_start.value), str(date_picker_end.value), day_of_week.value, time_of_day.value) speed = summarize_metrics(filtered_data, corridor_select.value, 'corridor', avgs_speed, 'avgSpeed', 'Speed', 'missing_speed') occ = summarize_metrics(filtered_data, corridor_select.value, 'corridor', avgs_occ, 'avgOccupancy', 'Occupancy', 'missing_occ') volume = summarize_metrics(filtered_data, corridor_select.value, 'corridor', avgs_volume, 'avgVolume', 'Volume', 'missing_vol') summary_df = speed.append(occ) summary_df = summary_df.append(volume) summary_df_tbl = summary_df.copy() summary_df_tbl['Mean Diff'] = summary_df_tbl['Mean Diff'] * 100 summary_df_tbl = summary_df_tbl.reset_index() summary_title = Div(text="<h1>" + corridor_select.value + " Summary</h1>", width=2000, css_classes=["w3-panel", "w3-white"]) summary_table = Div(text="", width=550, height=150) summary_table.text = str( summary_df_tbl.fillna(0).to_html( index=False, formatters=[ str, '{:20,}'.format, '{:20,.1f}'.format, '{:20,.1f}%'.format, '{:20,}'.format ], classes=["w3-table", "w3-hoverable", "w3-small"])) line = Div(text="<hr>", css_classes=["w3-container"], width=1000) #----------------------------------------------------------------------------------------------------------------- #----------------------------------------------------------------------------------------------------------------- #Create initial graphics '''#horizontal bar chart p = figure(plot_width=300, plot_height=100) p.hbar(y=[1, 2, 3], height=0.5, left=0, right=[1.2, 2.5, 3.7], color="navy") p.yaxis.visible = False p.xaxis.formatter = NumeralTickFormatter(format="0.0f%")''' bar_viz = hbar_chart(summary_df.fillna(0), 'Mean Diff') bar_viz_src = bar_viz[0] bar_viz_chart = bar_viz[1] volume_scatter = scatter_plot('Volumes') time_scatter = scatter_plot('Time') corr_df = rtdap_data.loc[rtdap_data['corridor'] == corridor_select.value] speed_diff_vbar = (vbar_chart(corr_df, filtered_data)) occ_diff_vbar = (vbar_chart(corr_df, filtered_data)) volume_diff_vbar = (vbar_chart(corr_df, filtered_data)) base_map = make_base_map(map_width=450, map_height=960, xaxis=None, yaxis=None, xrange=(-9990000, -9619944), yrange=(5011119, 5310000), plot_tools="pan,wheel_zoom,reset,save") select_content = row( #PANEL column(panel_title, panel_text, corridor_select, date_picker_start, date_picker_end, day_of_week, time_of_day, tod_description, select_data, height=1000, css_classes=["w3-sidebar", "w3-bar-block", "w3-darkgrey"]), column(css_classes=["w3-col"], width=275), #CONTENT column(summary_title, row( Spacer(width=20), column( Spacer(height=10), row(summary_table, Spacer(width=50), bar_viz_chart, css_classes=["w3-panel", "w3-white", "w3-card-4"]), Spacer(height=10), row(volume_scatter, Spacer(width=10), time_scatter, css_classes=["w3-panel", "w3-white", "w3-card-4"], width=650), Spacer(height=10), row(column(speed_diff_vbar, occ_diff_vbar, volume_diff_vbar), css_classes=["w3-panel", "w3-white", "w3-card-4"], width=1050), ), row( Spacer(width=20), column( Spacer(height=10), column(base_map, css_classes=[ "w3-panel", "w3-white", "w3-card-4" ], width=500)))), css_classes=["w3-container", "w3-row-padding"]), css_classes=["w3-container", "w3-light-grey"], width=2000, height=1200) return select_content
import pandas as pd tsCache = qqqPath+'/qqqTs.pkl' indxCache = qqqPath+'/qqqIndx.pkl' if os.path.isfile(tsCache) and os.path.isfile(indxCache): ts = pd.read_pickle(tsCache) indx = pd.read_pickle(indxCache) else: ts,indx=qqq_ret(getRetDF()) ts.to_pickle(tsCache) indx.to_pickle(indxCache) if not ts.empty and not indx.empty: try: lineSrc = ColumnDataSource(data={'t':ts,'i':indx}) retPlot.line(x='t',y='i',line_color='tan',source=lineSrc) except Exception as e: errBox.text = 'ERROR: '+str(e) if log.DEBUG>=log.getLogger().getEffectiveLevel(): traceback.print_exc() else: errBox.text = 'ERROR: QQQ timeseries is emtpy' except Exception as e: errBox.text = 'ERROR: '+str(e) if log.DEBUG>=log.getLogger().getEffectiveLevel(): traceback.print_exc() # assign actions submit1.on_click(searchNews1) submit2.on_click(searchNews2) selBox1.on_change('value', populateQuery1) selBox2.on_change('value', populateQuery2) assemble_page()
notificationDiv = Div(text="", width=800) gateways = [] if redisconn.get("gateways"): gateways = json.loads(redisconn.get("gateways")) else: try: cursor = db.gateways.find( {}, {"id":1, "name":1} ) gateways = [] gateways.append((None, "--- Choose a Gateway ---")) for d in cursor: gateways.append((d["id"], d["name"])) redisconn.set("gateways", json.dumps(gateways)) except errors.ServerSelectionTimeoutError as e: print ("MongoDB Server timed out: %s" % e) notificationDiv.text = "MongoDB Server timed out: %s" % e sys.exit(-1) gatewayControl = Select( title="Choose a Gateway", options=gateways) deviceControl = Select( title="Choose a Device") indicatorControl = Select( title="Choose an indicator") submitButton = Button(label="Submit", button_type="primary") timemachine = Slider(title="How many minutes back would you like to travel", start=1, end=30, value=1, step=1, callback_policy="mouseup") controls = [gatewayControl, deviceControl, indicatorControl, timemachine, submitButton, notificationDiv] doc = curdoc() source = ColumnDataSource(data=dict(last_mod_date=[None], date=[None], v=[None])) # source = ColumnDataSource(data=dict(last_mod_date=[None], date=[None], v=[None])) # hover = HoverTool(tooltips=[
def bokeh_plot(import_df): import pandas as pd import numpy as np from bokeh.plotting import figure, show from bokeh.layouts import layout, widgetbox, row, column, gridplot from bokeh.models import ColumnDataSource, HoverTool, BoxZoomTool, ResetTool, PanTool, CustomJS, PrintfTickFormatter, WheelZoomTool, SaveTool, LassoSelectTool, NumeralTickFormatter from bokeh.models.widgets import Slider, Select, TextInput, Div, Tabs, Panel, DataTable, DateFormatter, TableColumn, PreText, NumberFormatter, RangeSlider from bokeh.io import curdoc from functools import lru_cache from bokeh.transform import dodge from os.path import dirname, join from bokeh.core.properties import value #load plotting data here @lru_cache() def load_data(): df = import_df df.dropna(how='all', axis=0) #Northest=['3229','3277','3276','3230','3259','All_Stores_NE'] df.location_reference_id = df.location_reference_id.astype(str) #df['region'] = ['Northeast' if x in Northest else 'Midwest' for x in df['location_reference_id']] df['date'] = pd.to_datetime(df['date']) df[[ 'BOH_gt_Shelf_Capacity', 'OTL_gt_Shelf_Capacity', 'Ideal_BOH_gt_Shelf_Capacity', 'BOH_lt_Ideal', 'BOH_eq_Ideal', 'BOH_gt_Ideal', 'Demand_Fulfilled', 'Fill_Rate', 'Backroom_OH', 'Total_OH', 'Prop_OH_in_Backroom', 'Never_Q98_gt_POG', 'Never_Ideal_BOH_gt_POG', 'Sometimes_OTL_Casepack_1_gt_POG', 'Always_OTL_Casepack_1_le_POG', 'Non_POG' ]] = df[[ 'BOH > Shelf Capacity', 'OTL > Shelf Capacity', 'Ideal BOH > Shelf Capacity', 'BOH < Ideal', 'BOH = Ideal', 'BOH > Ideal', 'Demand Fulfilled', 'Fill Rate', 'Backroom_OH', 'Total OH', 'Prop OH in Backroom', 'Never: Q98 > POG', 'Never: Ideal BOH > POG', 'Sometimes: OTL+Casepack-1 > POG', 'Always: OTL+Casepack-1 <= POG', 'Non-POG' ]] df['date_bar'] = df['date'] df['date_bar'] = df['date_bar'].astype(str) return df #Filter data source for "All" stores OR data agrregation on DC level df_agg = load_data().groupby(['location_reference_id'], as_index=False).sum() source1 = ColumnDataSource(data=df_agg) sdate = min(load_data()['date']) edate = max(load_data()['date']) nodes = len(list(load_data().location_reference_id.unique())) days = len(list(load_data().date.unique())) policy = "Prod" #list of dates for vbar charts x_range_list = list(load_data().date_bar.unique()) #direct access to number of location_reference_idand region all_locations1 = list(load_data().location_reference_id.unique()) #agg_value=['All'] #all location_reference_idfrom csv file along with an option for agg data "All" #all_locations=all_locations1+agg_value #all_regions = ['Northeast', 'Midwest'] all_regions = list(load_data().region.unique()) desc = Div(text="All locations", width=230) pre = Div(text="_", width=230) location = Select(title="Location", options=all_locations1, value="All_Stores_NE") region = Select(title="Region", options=all_regions, value="NE") text_input = TextInput(value="default", title="Search Location:") #full data set from load_data(df=df_import) source = ColumnDataSource(data=load_data()) original_source = ColumnDataSource(data=load_data()) #plotting starts........... here are total 8 graphs for each Metric. #Back room on hand hover = HoverTool( tooltips=[("Location", "@location_reference_id"), ( "Date", "@date_bar"), ("Backroom_OH", "@Backroom_OH{0,0.00}")]) TOOLS = [ hover, BoxZoomTool(), LassoSelectTool(), WheelZoomTool(), PanTool(), ResetTool(), SaveTool() ] p = figure(x_range=x_range_list, plot_width=1000, plot_height=525, title="Backroom On hand by store", tools=TOOLS, toolbar_location='above', x_axis_label="Date", y_axis_label="Backroom OH") p.background_fill_color = "#e6e9ed" p.background_fill_alpha = 0.5 p.vbar(x=dodge('date_bar', -0.25, range=p.x_range), top='Backroom_OH', hover_alpha=0.5, hover_line_color='black', width=0.8, source=source, color="#718dbf") p.xaxis.major_label_orientation = 1 p.legend.border_line_width = 3 p.legend.border_line_color = None p.legend.border_line_alpha = 0.5 p.title.text_color = "olive" #inbound outbound hover_m = HoverTool( tooltips=[("Location", "@location_reference_id"), ( "Date", "@date_bar"), ( "Inbound", "@Inbound{0,0.00}"), ("Outbound", "@Outbound{0,0.00}")]) TOOLS_m = [ hover_m, BoxZoomTool(), LassoSelectTool(), WheelZoomTool(), PanTool(), ResetTool(), SaveTool() ] m = figure(plot_height=525, plot_width=1000, x_range=x_range_list, title="Inbound/Outbound by store", tools=TOOLS_m, toolbar_location='above', x_axis_label="Date", y_axis_label="Units") m.background_fill_color = "#e6e9ed" m.background_fill_alpha = 0.5 m.vbar(x=dodge('date_bar', -0.25, range=m.x_range), top='Inbound', hover_alpha=0.5, hover_line_color='black', width=0.4, source=source, color="#718dbf", legend=value("Inbound")) m.vbar(x=dodge('date_bar', 0.25, range=m.x_range), top='Outbound', hover_alpha=0.5, hover_line_color='black', width=0.4, source=source, color="#e84d60", legend=value("Outbound")) m.xaxis.major_label_orientation = 1 m.legend.border_line_width = 3 m.legend.border_line_color = None m.legend.border_line_alpha = 0.5 m.title.text_color = "olive" #Stockout hover_s = HoverTool( tooltips=[("Location", "@location_reference_id"), ( "Date", "@date_bar"), ( "BOH_OOS", "@BOH_OOS{0,0.000}"), ("EOH_OOS", "@EOH_OOS{0,0.000}")]) TOOLS_s = [ hover_s, BoxZoomTool(), LassoSelectTool(), WheelZoomTool(), PanTool(), ResetTool(), SaveTool() ] s = figure(plot_height=525, plot_width=1000, title="Stockouts by store", x_axis_type="datetime", toolbar_location='above', tools=TOOLS_s, x_axis_label="Date", y_axis_label="Prop Stockout") s.background_fill_color = "#e6e9ed" s.background_fill_alpha = 0.5 s.circle(x='date', y='EOH_OOS', source=source, fill_color=None, line_color="#4375c6") s.line(x='date', y='EOH_OOS', source=source, hover_alpha=0.5, hover_line_color='black', line_width=2, line_color='navy', legend=value("EOH OOS")) s.circle(x='date', y='BOH_OOS', source=source, fill_color=None, line_color="#4375c6") s.line(x='date', y='BOH_OOS', source=source, hover_alpha=0.5, hover_line_color='black', line_width=2, line_color='red', legend=value("BOH OOS")) s.legend.border_line_width = 3 s.legend.border_line_color = None s.legend.border_line_alpha = 0.5 s.title.text_color = "olive" #Fill rate hover_t = HoverTool( tooltips=[("Location", "@location_reference_id"), ( "Date", "@date_bar"), ("Fill Rate", "@Fill_Rate{0,0.00}")]) TOOLS_t = [ hover_t, BoxZoomTool(), LassoSelectTool(), WheelZoomTool(), PanTool(), ResetTool(), SaveTool() ] t = figure(plot_height=525, x_range=x_range_list, plot_width=1000, title="Fill rates by store", tools=TOOLS_t, toolbar_location='above', x_axis_label="Date", y_axis_label="Fill rate") t.background_fill_color = "#e6e9ed" t.background_fill_alpha = 0.5 t.vbar(x=dodge('date_bar', -0.25, range=t.x_range), top='Fill Rate', hover_alpha=0.5, hover_line_color='black', width=0.8, source=source, color="#718dbf") t.xaxis.major_label_orientation = 1 t.legend.border_line_width = 3 t.legend.border_line_color = None t.legend.border_line_alpha = 0.5 t.title.text_color = "olive" # % Backroom spillover hover_w = HoverTool( tooltips=[("Location", "@location_reference_id"), ("Date", "@date_bar"), ("Prop OH in Backroom", "@Prop_OH_in_Backroom{0,0.00}")]) TOOLS_w = [ hover_w, BoxZoomTool(), LassoSelectTool(), WheelZoomTool(), PanTool(), ResetTool(), SaveTool() ] w = figure(plot_height=525, plot_width=1000, title="Prop OH in Backroom by store", x_axis_type="datetime", tools=TOOLS_w, toolbar_location='above', x_axis_label="Date", y_axis_label=" % Backroom spillover") w.background_fill_color = "#e6e9ed" w.background_fill_alpha = 0.5 w.circle(x='date', y='Prop OH in Backroom', source=source, fill_color=None, line_color="#4375c6") w.line(x='date', y='Prop OH in Backroom', source=source, hover_alpha=0.5, hover_line_color='black', line_width=2, line_color='navy') w.title.text_font_style = "bold" w.title.text_color = "olive" w.legend.click_policy = "hide" w.yaxis[0].formatter = NumeralTickFormatter(format="0.0%") #BOH vs Ideal hover_f = HoverTool( tooltips=[("Location", "@location_reference_id"), ( "Date", "@date_bar"), ('BOH < Ideal', "@BOH_lt_Ideal{0,0.00}" ), ('BOH > Ideal', "@BOH_gt_Ideal{0,0.00}" ), ('BOH = Ideal', "@BOH_eq_Ideal{0,0.00}")]) TOOLS_f = [ hover_f, BoxZoomTool(), LassoSelectTool(), WheelZoomTool(), PanTool(), ResetTool(), SaveTool() ] colors = ["#c9d9d3", "#718dbf", "#e84d60"] BOH_vs_ideal = ['BOH < Ideal', 'BOH > Ideal', 'BOH = Ideal'] f = figure(x_range=x_range_list, plot_height=525, plot_width=1000, title="BOH vs Ideal by store", toolbar_location='above', x_axis_label="Date", y_axis_label="Prop", tools=TOOLS_f) f.vbar_stack(BOH_vs_ideal, x='date_bar', width=0.9, color=colors, source=source, legend=[value(x) for x in BOH_vs_ideal], name=BOH_vs_ideal) f.xaxis.major_label_orientation = 1 f.legend.border_line_width = 3 f.legend.border_line_color = None f.legend.border_line_alpha = 0.5 f.title.text_color = "olive" #Pog Fit hover_g = HoverTool( tooltips=[("Location", "@location_reference_id"), ( "Date", "@date_bar"), ('Never: Q98 > POG', "@Never_Q98_gt_POG{0,0.00}"), ("Never: Ideal BOH > POG", "@Never_Ideal_BOH_gt_POG{0,0.00}"), ("Sometimes: OTL+Casepack-1 > POG", "@Sometimes_OTL_Casepack_1_gt_POG{0,0.00}"), ("Always: OTL+Casepack-1 <= POG", "@Always_OTL_Casepack_1_le_POG{0,0.00}" ), ("Non-POG'", "@Non_POG{0,0.00}")]) TOOLS_g = [ hover_g, BoxZoomTool(), LassoSelectTool(), WheelZoomTool(), PanTool(), ResetTool(), SaveTool() ] colors2 = ['#79D151', "#718dbf", '#29788E', '#fc8d59', '#d53e4f'] pog_fit = [ 'Never: Q98 > POG', 'Never: Ideal BOH > POG', 'Sometimes: OTL+Casepack-1 > POG', 'Always: OTL+Casepack-1 <= POG', 'Non-POG' ] g = figure(x_range=x_range_list, plot_height=525, plot_width=1200, title="Pog Fit by store", toolbar_location='above', x_axis_label="Date", y_axis_label="Counts", tools=TOOLS_g) g.vbar_stack(pog_fit, x='date_bar', width=0.9, color=colors2, source=source, legend=[value(x) for x in pog_fit], name=pog_fit) g.xaxis.major_label_orientation = 1 g.legend.border_line_width = 3 g.legend.border_line_color = None g.legend.border_line_alpha = 0.5 g.title.text_color = "olive" g.legend.location = "top_right" # BOH vs Pog colors3 = ["#c9d9d3", "#718dbf", "#e84d60"] shelf = [ 'BOH > Shelf Capacity', 'OTL > Shelf Capacity', 'Ideal BOH > Shelf Capacity' ] hover_h = HoverTool( tooltips=[("Location", "@location_reference_id"), ("Date", "@date_bar"), ("OTL > Shelf Capacity", "@OTL_gt_Shelf_Capacity{0,0.00}" ), ("BOH > Shelf Capacity", "@BOH_gt_Shelf_Capacity{0,0.00}"), ("Ideal BOH > Shelf Capacity", "@Ideal_BOH_gt_Shelf_Capacity{0,0.00}")]) TOOLS_h = [ hover_h, BoxZoomTool(), LassoSelectTool(), WheelZoomTool(), PanTool(), ResetTool(), SaveTool() ] h = figure(plot_height=525, plot_width=1000, title="BOH vs Pog by store", x_axis_type="datetime", toolbar_location='above', tools=TOOLS_h, x_axis_label="Date", y_axis_label="Prop") h.background_fill_color = "#e6e9ed" h.background_fill_alpha = 0.5 h.circle(x='date', y='BOH > Shelf Capacity', source=source, fill_color=None, line_color="#4375c6") h.line(x='date', y='BOH > Shelf Capacity', source=source, hover_alpha=0.5, hover_line_color='black', line_width=2, line_color='navy', legend=value("BOH > Shelf Capacity")) h.circle(x='date', y='OTL > Shelf Capacity', source=source, fill_color=None, line_color="#4375c6") h.line(x='date', y='OTL > Shelf Capacity', source=source, hover_alpha=0.5, hover_line_color='black', line_width=2, line_color="green", legend=value("OTL > Shelf Capacity")) h.circle(x='date', y='Ideal BOH > Shelf Capacity', source=source, fill_color=None, line_color="#4375c6") h.line(x='date', y='Ideal BOH > Shelf Capacity', source=source, hover_alpha=0.5, hover_line_color='black', line_width=2, line_color="#e84d60", legend=value("Ideal BOH > Shelf Capacity")) h.legend.border_line_width = 3 h.legend.border_line_color = None h.legend.border_line_alpha = 0.5 h.title.text_color = "olive" h.legend.click_policy = "mute" # Inventory hover_j = HoverTool( tooltips=[("Location", "@location_reference_id"), ( "Date", "@date_bar"), ("DFE_Q98", "@DFE_Q98{0,0.00}"), ("OTL", "@OTL{0,0.00}"), ("EOH", "@EOH{0,0.00}"), ("BOH", "@BOH{0,0.00}")]) TOOLS_j = [ hover_j, BoxZoomTool(), LassoSelectTool(), WheelZoomTool(), PanTool(), ResetTool(), SaveTool() ] j = figure(plot_height=525, plot_width=1200, x_range=x_range_list, title="Inbound/Outbound by store", tools=TOOLS_j, toolbar_location='above', x_axis_label="Date", y_axis_label="Units") j.background_fill_color = "#e6e9ed" j.background_fill_alpha = 0.5 j.vbar(x=dodge('date_bar', -0.40, range=j.x_range), top='DFE_Q98', hover_alpha=0.3, hover_line_color='black', width=0.2, source=source, color="#FBA40A", legend=value("DFE_Q98")) j.vbar(x=dodge('date_bar', -0.20, range=j.x_range), top='OTL', hover_alpha=0.3, hover_line_color='black', width=0.2, source=source, color="#4292c6", legend=value("OTL")) j.vbar(x=dodge('date_bar', 0.00, range=j.x_range), top='EOH', hover_alpha=0.3, hover_line_color='black', width=0.2, source=source, color='#a1dab4', legend=value("EOH")) j.vbar(x=dodge('date_bar', 0.20, range=j.x_range), top='BOH', hover_alpha=0.3, hover_line_color='black', width=0.2, source=source, color="#DC5039", legend=value("BOH")) j.xaxis.major_label_orientation = 1 j.legend.border_line_width = 3 j.legend.border_line_color = None j.legend.border_line_alpha = 0.5 j.title.text_color = "olive" j.legend.location = "top_left" j.legend.click_policy = "mute" #desc.text = " <br > <b> Region:</b> <i> </i> <br /> " pre.text = " <b>Start date:</b> <i>{}</i> <br /> <b>End date:</b> <i>{}</i> <br /> <b>Time period:</b> <i>{}</i> days <br /> <b> Total Number of Nodes:</b> <i>{}</i> <br /> <b>Policy</b> = <i>{}</i><br /> ".format( sdate, edate, days, nodes, policy) #fuction to update data on selection callback = CustomJS(args=dict(source=source, original_source=original_source, location_select_obj=location, region_select_obj=region, div=desc, text_input=text_input), code=""" var data = source.get('data'); var original_data = original_source.get('data'); var loc = location_select_obj.get('value'); var reg = region_select_obj.get('value'); var line = " <br /> <b> Region:</b>"+ reg + "<br /> <b>Location:</b> " + loc; var text_input =text_input.get('value'); div.text=line; for (var key in original_data) { data[key] = []; for (var i = 0; i < original_data['location_reference_id'].length; ++i) { if ((original_data['location_reference_id'][i] === loc) && (original_data['region'][i] === reg) ) { data[key].push(original_data[key][i]); } } } source.trigger('change'); """) #controls = [location, region] #for control in controls: #control.js_on_change("value", callback) #source.js_on_change("value", callback) desc.js_on_event('event', callback) location.js_on_change('value', callback) region.js_on_change('value', callback) text_input.js_on_change('value', callback) #inputs = widgetbox(*controls, sizing_mode="fixed") #inputs = widgetbox(*controls,width=220,height=500) inputs = widgetbox(location, region, desc, pre, width=220, height=500) # controls number of tabs tab1 = Panel(child=p, title='Backroom OH') tab2 = Panel(child=s, title='Stockouts') tab3 = Panel(child=f, title='BOH vs Ideal') tab4 = Panel(child=g, title='Pog Fit') tab5 = Panel(child=m, title='Inbound/Outbound') tab6 = Panel(child=h, title='BOH vs POG') tab7 = Panel(child=t, title='Fill Rate') tab8 = Panel(child=j, title='Inventory') tab9 = Panel(child=w, title='Prop OH in Backroom') #data table columns to summarize data columns = [ TableColumn(field="location_reference_id", title="Location"), TableColumn(field="Backroom_OH", title="Backroom_OH", formatter=NumberFormatter(format="0,0")), TableColumn(field="Outbound", title="Outbound", formatter=NumberFormatter(format="0,0")), TableColumn(field="Inbound", title="Inbound", formatter=NumberFormatter(format="0,0")), TableColumn(field="OTL", title="OTL", formatter=NumberFormatter(format="0,0")), TableColumn(field="DFE_Q98", title="DFE_Q98", formatter=NumberFormatter(format="0,0")), TableColumn(field="BOH", title="BOH", formatter=NumberFormatter(format="0,0")), TableColumn(field="EOH", title="EOH", formatter=NumberFormatter(format="0,0")), TableColumn(field="BOH_OOS", title="BOH_OOS", formatter=NumberFormatter(format="0,0")), TableColumn(field="EOH_OOS", title="EOH_OOS", formatter=NumberFormatter(format="0,0")) ] data_table = DataTable(source=source1, columns=columns, width=1250) tab10 = Panel(child=data_table, title='Summary Table') view = Tabs( tabs=[tab1, tab2, tab5, tab8, tab6, tab3, tab7, tab4, tab9, tab10]) layout_text = column(inputs) layout1 = row(layout_text, view) #laying out plot layout2 = layout(children=[[layout_text, view]], sizing_mode='scale_height') #update plots return layout2
'border-color': ' #05BAC5',\ 'background-color': 'white',\ 'padding': '.5em'}) if check_file['check'][0] == 0: source = ColumnDataSource(data={ 'File_1': [decode(data64_1)], 'File_2': [decode(data64_2)] }) else: source = ColumnDataSource( data={ 'File_1': [pd.read_csv(main_path + 'file1_data.csv')], 'File_2': [pd.read_csv(main_path + 'file2_data.csv')] }) running_info.text = '<b>Status Bar</b>: Datasource is Updated ->->-> <b>Blend</b>, <b>Reset</b>, or <b>Select</b> New Data.' # This is important! Save curdoc() to make sure all threads # see the same document. doc = curdoc() @gen.coroutine def update(data): source.stream(data) def blocking_task(): while True: # do some blocking computation time.sleep(10)
def selection_tab(rtdap_data): """ return selection tab contents Keyword arguments: rtdap_data - dataframe containing rtdap vds detail data """ #----------------------------------------------------------------------------------------------------------------- #submit_selection -- Data Selection Update Function def submit_selection(): """ python callback to update table and visual content based on user selections in the data review panel """ avgs_speed = rtdap_avg(rtdap_data, corridor_select.value, 'avgSpeed') avgs_occ = rtdap_avg(rtdap_data, corridor_select.value, 'avgOccupancy') avgs_volume = rtdap_avg(rtdap_data, corridor_select.value, 'avgVolume') filtered_data = filter_selection(rtdap_data, corridor_select.value, str(date_picker_start.value), str(date_picker_end.value), day_of_week.value, time_of_day.value) speed = summarize_metrics(filtered_data, corridor_select.value, 'corridor', avgs_speed, 'avgSpeed', 'Speed', 'missing_speed') occ = summarize_metrics(filtered_data, corridor_select.value, 'corridor', avgs_occ, 'avgOccupancy', 'Occupancy', 'missing_occ') volume = summarize_metrics(filtered_data, corridor_select.value, 'corridor', avgs_volume, 'avgVolume', 'Volume', 'missing_vol') summary_df = speed.append(occ) summary_df = summary_df.append(volume) summary_title.text = "<h1>" + corridor_select.value + " Summary</h1>" summary_df_tbl = summary_df.copy() summary_df_tbl['Mean Diff'] = summary_df_tbl['Mean Diff'] * 100 summary_df_tbl = summary_df_tbl.reset_index() summary_table.text = str( summary_df_tbl.fillna(0).to_html( index=False, formatters=[ str, '{:20,}'.format, '{:20,.1f}'.format, '{:20,.1f}%'.format, '{:20,}'.format ], classes=["w3-table", "w3-hoverable", "w3-small"])) if len(summary_df) > 0: new_df = summary_df.fillna(0) bar_viz_new = hbar_chart(new_df, 'Mean Diff')[0] bar_viz_src.data.update(bar_viz_new.data) #----------------------------------------------------------------------------------------------------------------- #Data Review Panel panel_title = Div( text="Data Review", css_classes=["panel-heading", "text-center", "w3-text-white"]) panel_text = Div( text= """Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.""", css_classes=["panel-content", "w3-text-white"]) #Panel Buttons corridor_select = Select( options=rtdap_data['corridor'].drop_duplicates().values.tolist(), title='Corridor:', height=60, value='Dan Ryan Express Lane', css_classes=["panel-content"]) date_picker_start = DatePicker(min_date=date(2015, 1, 1), max_date=date(2018, 12, 31), css_classes=["panel-content"], title="Start Date:", height=60, value=date(2015, 12, 31)) date_picker_end = DatePicker(min_date=date(2015, 1, 1), max_date=date(2018, 12, 31), css_classes=["panel-content"], title="End Date:", height=60, value=date(2017, 12, 31)) time_of_day = RangeSlider(start=1, end=8, step=1, value=(1, 2), title="Time of Day:", bar_color="black", css_classes=["panel-content"]) tod_description = Div( text="""Time of Day Categories:<br> <ol> <li>8pm-6am</li> <li>6pm-7am</li> <li>7am-8am</li> <li>9am-10am</li> <li>10am-2pm</li> <li>2pm-4pm</li> <li>4pm-6pm</li> <li>6pm-8pm</li> </ol>""", css_classes=["panel-content", "caption", "w3-text-white"]) day_of_week = Select(options=['All'] + rtdap_data['dow'].drop_duplicates().values.tolist(), title="Day of Week:", css_classes=["panel-content"], height=60, value="All") select_data = Button(label="Select Subset", css_classes=["panel-content"], height=60) select_data.on_click(submit_selection) #----------------------------------------------------------------------------------------------------------------- #----------------------------------------------------------------------------------------------------------------- #Create initial content avgs_speed = rtdap_avg(rtdap_data, corridor_select.value, 'avgSpeed') avgs_occ = rtdap_avg(rtdap_data, corridor_select.value, 'avgOccupancy') avgs_volume = rtdap_avg(rtdap_data, corridor_select.value, 'avgVolume') filtered_data = filter_selection(rtdap_data, corridor_select.value, str(date_picker_start.value), str(date_picker_end.value), day_of_week.value, time_of_day.value) speed = summarize_metrics(filtered_data, corridor_select.value, 'corridor', avgs_speed, 'avgSpeed', 'Speed', 'missing_speed') occ = summarize_metrics(filtered_data, corridor_select.value, 'corridor', avgs_occ, 'avgOccupancy', 'Occupancy', 'missing_occ') volume = summarize_metrics(filtered_data, corridor_select.value, 'corridor', avgs_volume, 'avgVolume', 'Volume', 'missing_vol') summary_df = speed.append(occ) summary_df = summary_df.append(volume) summary_df_tbl = summary_df.copy() summary_df_tbl['Mean Diff'] = summary_df_tbl['Mean Diff'] * 100 summary_df_tbl = summary_df_tbl.reset_index() summary_title = Div(text="<h1>" + corridor_select.value + " Summary</h1>", width=2000, css_classes=["w3-panel", "w3-white"]) summary_table = Div(text="", width=550, height=150) summary_table.text = str( summary_df_tbl.fillna(0).to_html( index=False, formatters=[ str, '{:20,}'.format, '{:20,.1f}'.format, '{:20,.1f}%'.format, '{:20,}'.format ], classes=["w3-table", "w3-hoverable", "w3-small"])) line = Div(text="<hr>", css_classes=["w3-container"], width=1000) #----------------------------------------------------------------------------------------------------------------- #----------------------------------------------------------------------------------------------------------------- #Create initial graphics '''#horizontal bar chart p = figure(plot_width=300, plot_height=100) p.hbar(y=[1, 2, 3], height=0.5, left=0, right=[1.2, 2.5, 3.7], color="navy") p.yaxis.visible = False p.xaxis.formatter = NumeralTickFormatter(format="0.0f%")''' bar_viz = hbar_chart(summary_df.fillna(0), 'Mean Diff') bar_viz_src = bar_viz[0] bar_viz_chart = bar_viz[1] volume_scatter = scatter_plot('Volumes') time_scatter = scatter_plot('Time') corr_df = rtdap_data.loc[rtdap_data['corridor'] == corridor_select.value] speed_diff_vbar = (vbar_chart(corr_df, filtered_data)) occ_diff_vbar = (vbar_chart(corr_df, filtered_data)) volume_diff_vbar = (vbar_chart(corr_df, filtered_data)) base_map = make_base_map(map_width=450, map_height=960, xaxis=None, yaxis=None, xrange=(-9990000, -9619944), yrange=(5011119, 5310000), plot_tools="pan,wheel_zoom,reset,save") return row( #PANEL column(panel_title, panel_text, corridor_select, date_picker_start, date_picker_end, day_of_week, time_of_day, tod_description, select_data, height=1000, css_classes=["w3-sidebar", "w3-bar-block", "w3-darkgrey"]), column(css_classes=["w3-col"], width=275), #CONTENT column(summary_title, row( Spacer(width=20), column( Spacer(height=10), row(summary_table, Spacer(width=50), bar_viz_chart, css_classes=["w3-panel", "w3-white", "w3-card-4"]), Spacer(height=10), row(volume_scatter, Spacer(width=10), time_scatter, css_classes=["w3-panel", "w3-white", "w3-card-4"], width=650), Spacer(height=10), row(column(speed_diff_vbar, occ_diff_vbar, volume_diff_vbar), css_classes=["w3-panel", "w3-white", "w3-card-4"], width=1050), ), row( Spacer(width=20), column( Spacer(height=10), column(base_map, css_classes=[ "w3-panel", "w3-white", "w3-card-4" ], width=500)))), css_classes=["w3-container", "w3-row-padding"]), css_classes=["w3-container", "w3-light-grey"], width=2000, height=1200)
def make_sheet_div(self, text): d = Div() d.text = "<h3>" + text + "</h3>" return d
def make_title_div(self, text): d = Div() d.text = "<h1>" + text + "</h1>" return d
print text div.update(text=text) fd = figure(tools=[TOOLS]) scatter = fd.circle( x='sumhobbit24hour', y='area24hour', size=sizescale, fill_color=colors, fill_alpha=0.9, line_color=None, selection_line_color="firebrick", source=source, nonselection_fill_color='colors', nonselection_fill_alpha=0.5, ) div.text = '<img src=\"' + df['url24hour'][0] + '" width="700"/>' p = row(fd, div) #output_file("color_scatter.html", title="color_scatter.py example") #show(p) curdoc().add_root(p) print scatter.data_source.properties() print "testing" scatter.data_source.on_change('selected', update) # scatter.data_source.