七転八転

よしなしごとを。

ウェアラブル的に一年を振り返る(その2)

いつものまえがき

この記事はぴょこりんクラスタ:Re Advent Calendar 2016 - Adventarのために書かれました。

サマリ
  • fitbitHRに貯めこまれたデータから、記憶を蘇らせたかった。
  • 前回、データをとってくるところで気力がつきたので
  • 週次の睡眠時間を可視化するところをやりました
1. データの取得(続き)
sleep_ts = authd_client.time_series('sleep/minutesAsleep',period='3m')
data = sleep_ts['sleep-minutesAsleep']

csv_file = open("sleep_csv","w")
for s in data:
    csv_file.write(s['dateTime'])
    csv_file.write(',')
    csv_file.write(s['value'])
    csv_file.write('\n')
csv_file.close()

で、3ヶ月分の時系列がとれました!

2. データの整形
  • 週次の睡眠時間を集計します。
  • データを眺めてみます
2016-09-27,0
2016-09-28,318
2016-09-29,325
2016-09-30,372
2016-10-01,376
2016-10-02,341
2016-10-03,0
2016-10-04,281
  • のように、データがとれていない日があり、0が入っています。
  • (なお充電しっぱなしで寝落ちしたり、風呂あがりに付けるの忘れたとかです)
  • なので、欠損値をとばす必要があります。
  • pandasを使うと便利です。
import pandas as pd

df = pd.read_csv('./sleep_csv',names=['date','asleep'],na_values='0')
df = df.dropna()
  • na_valuesで0を欠損値として、dropnaで欠損値ありの行を落とすとうまくいきます。
3. データの集計
  • これもpandas先生におまかせ。
idx = pd.to_datetime(df['date'])
ts = pd.Series(df.asleep.values,index=idx)
ts_r = ts.resample('W', how='mean', kind='period')
  • で週単位に集計できますね。
4. 眺める
  • 描画部分は、コードを略します。結果はこんな感じ
  • いまさらながら折れ線グラフはよくないですね。(欠損値のところに線がひかれてしまったり)
  • 日別の睡眠時間f:id:darumap:20161218182055p:plain
  • 週別の平均睡眠時間f:id:darumap:20161218182100p:plain
  • 直近死に絶えていたのは、実際に正しかった。
  • ただ、休日夜更かししたのと、平日寝れていないのの区別が難しい。
  • 10月9日は多分単なる夜更かし。ただ、月曜のストレスで日曜ねれないとかもあるので、難しい。
まとめ
  • pandas先生便利。