Skip to content

Instantly share code, notes, and snippets.

@flavianh
Created January 27, 2018 18:20
Show Gist options
  • Select an option

  • Save flavianh/5db8e98652e5a324305d0fbcc94ce0dc to your computer and use it in GitHub Desktop.

Select an option

Save flavianh/5db8e98652e5a324305d0fbcc94ce0dc to your computer and use it in GitHub Desktop.

Revisions

  1. Flavian Hautbois created this gist Jan 27, 2018.
    60 changes: 60 additions & 0 deletions bokeh_interactivity.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,60 @@
    def filter_categories(indexes):
    categories_filtered = [CATEGORIES[ind] for ind in indexes] if indexes != [] else CATEGORIES
    update_num_categories_source(categories_filtered, force_categories=True)
    update_usd_vs_date_source(categories_filtered, force_categories=True)


    def update_usd_vs_date_source(categories=None, force_categories=False):
    # To get the current state of the categories
    if categories is None:
    categories = source_num_categories.data['categories']
    elif not force_categories:
    categories = list(set(categories) & set(source_num_categories.data['categories']))
    df_categories = kickstarter_df_sub[kickstarter_df_sub.broader_category.isin(categories)]
    for color, state in zip(COLORS, STATES):
    df_by_state = df_categories[df_categories.state == state]
    data = {
    'x': df_by_state['created_at'],
    'y': df_by_state['usd_pledged'],
    'name': df_by_state['name'],
    'state': [state] * len(df_by_state),
    }
    sources_usd_vs_date[state].data = data


    def update_on_usd_vs_date_selection(event):
    geometry = event.geometry
    if geometry['type'] == 'rect':
    x0 = datetime.datetime.fromtimestamp(geometry['x0'] / 1000)
    x1 = datetime.datetime.fromtimestamp(geometry['x1'] / 1000)
    y0 = geometry['y0']
    y1 = geometry['y1']
    sub_df = kickstarter_df[kickstarter_df.created_at.between(x0, x1) & kickstarter_df.usd_pledged.between(y0, y1)]
    update_num_categories_source(source_num_categories.data['categories'], sub_df)


    def update_num_categories_source(categories=None, df=kickstarter_df, force_categories=False):
    # To get the current state of the categories
    if categories is None:
    categories = source_num_categories.data['categories']
    elif not force_categories:
    categories = list(set(categories) & set(source_num_categories.data['categories']))
    stacked_barchart_df = (
    df['state'].groupby(df['broader_category'])
    .value_counts(normalize=False)
    .rename('count')
    )

    data = {
    'categories': categories,
    }

    # Sadly, I could not find a more efficient method to prepare a pandas array for a stacked bar chart
    for state, category in product(STATES, categories):
    data.setdefault(state, [])

    try:
    data[state].append(stacked_barchart_df.loc[category, state])
    except KeyError:
    data[state].append(0)
    source_num_categories.data = data