def talk_days(self):
"""Returns a stacked bar chart showing percentage of chats and emails on each day of the week.
"""
c = self.conn.cursor()
c.execute('''SELECT strftime('%w', `date`) AS dow,
COUNT(CASE WHEN gmail_labels LIKE '%Chat%' THEN 1 ELSE NULL END) AS talk_messages,
COUNT(CASE WHEN gmail_labels NOT LIKE '%Chat%' THEN 1 ELSE NULL END) AS email_messages
FROM messages
WHERE dow NOTNULL
GROUP BY dow;''')
talk_percentages = OrderedDict()
talk_messages = OrderedDict()
email_percentages = OrderedDict()
email_messages = OrderedDict()
for row in c.fetchall():
dow = calendar.day_name[int(row[0]) - 1] # sqlite strftime() uses 0 = SUNDAY.
talk_percentages[dow] = str(round(float(row[1]) / sum([row[1], row[2]]) * 100, 2)) + '%'
email_percentages[dow] = str(round(float(row[2]) / sum([row[1], row[2]]) * 100, 2)) + '%'
talk_messages[dow] = row[1]
email_messages[dow] = row[2]
chats_trace = pgo.Bar(
x=talk_messages.keys(),
y=talk_messages.values(),
text=talk_percentages.values(),
name='Chat messages',
marker=dict(
color=self.config.get('color', 'primary'),
),
)
emails_trace = pgo.Bar(
x=email_messages.keys(),
y=email_messages.values(),
text=email_percentages.values(),
name='Email messages',
marker=dict(
color=self.config.get('color', 'secondary'),
),
)
layout = plotly_default_layout_options()
layout['barmode'] = 'stack'
layout['margin'] = pgo.Margin(**layout['margin'])
layout['title'] = 'Chat (vs. Email) Days'
layout['xaxis']['title'] = 'Day of the week'
layout['yaxis']['title'] = 'Messages exchanged'
return plotly_output(pgo.Figure(data=[chats_trace, emails_trace], layout=pgo.Layout(**layout)))
评论列表
文章目录