Sunday, April 14, 2013

medhelp sleep graph replacement using python


In other words, graphing time of day versus date in python.

This morning I logged on to medhelp.org only to see that it had gone from somewhat usable for my purposes:
from my previous post, http://orangenarwhals.blogspot.com/2012/05/caffeines-impact-on-sleep-inkscape-a0.html
where I can at least type in the times to some extent, even if there is no batch input (e.g. uploading a text file), to

wtf is this? i am clearly not in their target demographic...

So I decided to get up off my lazy butt and do some python plotting.

This is the end result:

(it's flipped, so time increases going upward like you would expect a graph to do but opposite of how you would read the medhelp graph, where time increases going downwards, which I feel makes more intuitive sense).

The code is here:
https://github.com/nouyang/sleepgraph/blob/master/graph.py

I keep track of my sleep in a google doc that I just downloaded as a csv file. See the github repo.

===

brain/linkdump as i was working out how to do this

===

http://stackoverflow.com/questions/5498510/creating-graph-with-date-and-time-in-axis-labels-with-matplotlib
http://stackoverflow.com/questions/2369492/generate-a-heatmap-in-matplotlib-using-a-scatter-data-set?rq=1
http://stackoverflow.com/questions/8973846/how-do-i-create-this-kind-of-grid-table-using-matplotlib?rq=1
http://blog.brianhouse.net/post/6877602920/an-activity-heatmap-from-fitbit-data
http://stackoverflow.com/questions/4790265/plot-time-of-day-vs-date-in-matplotlib
vlines

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.vlines
can set line width but the plot does not adjust to this (how to pad the dates out so the lines won't ever overlap?)

unix time
http://www.epochconverter.com/

bar plot
http://matplotlib.org/api/pyplot_api.html?highlight=pyplot%20bar#matplotlib.pyplot.bar
http://stackoverflow.com/questions/5902371/matplotlib-bar-chart-with-dates
 now just need to adjust so not height, but also have start time

x = '3/18/2013'
datetime.datetime.strptime(str(x),'%m/%d/%Y')

x = 1365739200
datetime.datetime.fromtimestamp(x)
# datetime.datetime(2013, 4, 12, 0, 0)

http://matplotlib.org/api/pyplot_api.html?highlight=pyplot%20bar#matplotlib.pyplot.bar
http://matplotlib.org/api/axes_api.html?highlight=xaxis_date#matplotlib.axes.Axes.xaxis_date
http://matplotlib.org/api/dates_api.html#matplotlib.dates.DateFormatter
dates.DateFormatter('%B %d, %Y') # January 16, 1970
format: http://linux.die.net/man/3/strptime

http://stackoverflow.com/questions/886716/controling-bars-width-in-matplotlib-with-per-month-data

http://datadebrief.blogspot.com/2010/10/plotting-sunrise-sunset-times-in-python.html
okay, this solves the y-axis problem! excellent.

http://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html
In particular,genfromtxt is able to take missing data into account, when other faster and simpler functions like loadtxt cannot

does not deal well with quotation marks in data
"Line #31 (got 8 columns instead of 7)"

24:00 --> 0:00:00 else

ValueError: time data '3/18/2013 24:00:00' does not match format '%m/%d/%Y %H:%M:%S'

also does not like 0 instead of 0:00:00

No comments:

Post a Comment