-
Notifications
You must be signed in to change notification settings - Fork 1
/
hours_slept_histogram.py
47 lines (39 loc) · 1.47 KB
/
hours_slept_histogram.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import plotly as py
import plotly.graph_objs as go
import utils.names as names
from utils.csvparser import parse
from utils.exporter import export
from utils.args import args
raw_data = parse(args['data_files'], args['start_date'], args['end_date'])
sleep_durations = []
nap_durations = []
for date, rests in raw_data.items():
has_sleep = has_nap = False
sleep_total = nap_total = 0
for r in rests:
rest, wake, is_nap = r
delta_h = round((wake - rest).seconds / 3600)
if is_nap:
has_nap = True
nap_total += delta_h
else:
has_sleep = True
sleep_total += delta_h
# count sleepless nights in the histogram
if has_sleep or sleep_total == 0:
sleep_durations.append(sleep_total)
# however, ignore napless days
if has_nap:
nap_durations.append(nap_total)
durations = list(range(0, 13))
sleep_hist = [sleep_durations.count(i) for i in durations]
sleep_trace = go.Bar(x=durations, y=sleep_hist, name='Hours Slept')
nap_hist = [nap_durations.count(i) for i in durations]
nap_trace = go.Bar(x=durations, y=nap_hist, name='Hours Napped')
dates = list(raw_data.keys())
data = go.Data([sleep_trace, nap_trace])
layout = go.Layout(title=names.graph_title('Hours Slept Per Day', dates),
xaxis={'title': 'Hours Slept', 'dtick': 1},
yaxis={'title': 'Number of Days', 'dtick': 1})
figure = go.Figure(data=data, layout=layout)
export(figure, __file__, dates)