chebe: (HandAgainstGlass)
chebe ([personal profile] chebe) wrote2016-12-12 11:25 am

Quantified Self and Fitbit sleep data

This weekend involved getting to see Placebo in concert, so not much else happened. But that's the great thing about software, you can be productive without getting out of bed.

I recently attended a Quantified Self meetup on sleep, that gave me the kick up the arse I've been needing. (Which was only compounded when I heard about Pebble closing, and that Fitbit would take over their servers, and staff.) One of the presenters talked about how he got his Fitbit data and how he analysed it. (If you're interested, slides are here, and blog post here.) He switched to using the official APIs when they became available, but I went with his original approach, a python program to log in and get your intraday data points instead of the aggregated stuff you get on the dashboard.

I haven't been the most steady wearable user, but there were a few months when I wore it reliably. Simply because I was sleeping terribly and wanted to understand just how badly. Although I never got around to actually analaysing the data, until now. (That's one thing about all these QS talks, typically everyone showing their data is the picture of good health. I'm more interested in seeing what it looks like when it goes wrong.)

I used the website dashboard to find the months that actually contained data. Then I exported csv files, month-by-month, using the official export option. This is the aggregated information, but it will be nice to see if it correlates with the intraday info.

Then armed with dates that contain valid data, I put them into the python program, and grabbed all my data. In short, download and extract the source code. In the same folder as create your own python file, where you will create your own client. (This information is apparently in the example files, but I poked around before I noticed that.) To create your own client you just pass in your email address and password;
client = fitbit.Client.login(email="", password="password")
You grab the specific info you're interested in;
And then dump it to screen/file/whatever you want. Although it's a good idea to format it a little.

Sleep data is recorded as one value per minute.

# The different values for sleep are:
# 0: no sleep data
# 1: asleep
# 2: awake
# 3: very awake

# data will be a similar list of tuples, but spaced one minute apart
# [
# (datetime.datetime(2010, 2, 20, 23, 59), 2),
# (datetime.datetime(2010, 2, 21, 0, 0), 1),
# (datetime.datetime(2010, 2, 21, 0, 1), 1),
# ....
# (datetime.datetime(2010, 2, 21, 8, 34), 1),
# ]

And then, we are left with the task of analysing the data. Which is a much bigger one.