In [ ]:
import numpy as np
import pandas as pd
from bokeh.io import output_notebook, show
output_notebook()

In [ ]:
from app.utils.process_gtimelog import get_work_df
raw = get_work_df()
raw.head()

In [ ]:
import datetime
today = datetime.date(2015, 7, 13)
just_today = raw[(raw.timestamp.dt.date == today)]
just_today = just_today[just_today.activity != 'start']

# Clean & add some useful columns
just_today.activity = just_today.activity.str.capitalize()
just_today['human'] = just_today.delta.dt.seconds / (60 * 60)
just_today.human = just_today.human.round(2)
just_today['parent_activity'] = just_today.activity.str.split(' - ').str[0]
just_today['sub_activity'] = just_today.activity.str.split(' - ').str[1]
just_today.sub_activity = np.where(just_today.activity == just_today.parent_activity, 'general', just_today.sub_activity)
just_today.sub_activity = just_today.sub_activity.str.capitalize()

just_today.tail()

In [ ]:
# Categorize (probably not necessary here)
just_today.parent_activity = just_today.parent_activity.astype('category')
just_today.parent_activity.cat.categories

In [ ]:
from bokeh.charts import Bar
from bokeh.io import hplot, vplot
from bokeh.models import Range1d, DataTable, ColumnDataSource, TableColumn, Paragraph
from bokeh.palettes import Spectral4

def make_bar(category, data):
    bar = Bar(
        data, 
        width=200, height=200, 
        palette=[Spectral4[i], '#dddddd'], 
        stacked=True)
    bar.toolbar_location = None
    bar.outline_line_color = None
    bar.y_range = Range1d(0, 8)
    bar.min_border = 5
    bar.min_border_top = 10
    return bar

def make_table(category, data):
    totalled = pd.concat(
        [
            data, 
            pd.DataFrame({'human': data.human.sum()}, index=['%s - Total' % category])
        ]
    )
    source = ColumnDataSource(totalled)
    table = DataTable(
        source=source,
        columns=[
            TableColumn(field="sub_activity", title=category),
            TableColumn(field="human", title="Total")
        ],
        width=300
    )
    return table

for i, category in enumerate(just_today.parent_activity.cat.categories):
    parent_df = just_today[just_today.parent_activity == category]
    summed = parent_df.groupby('sub_activity').sum().sort('human', ascending=False)
    summed['from total'] = summed.human.sum() - summed.human
    bar = make_bar(category, summed)
    table = make_table(category, summed)
    show(vplot(hplot(bar, table)))

In [ ]:


In [ ]: