ウェアラブル的に一年を振り返る(その2)
いつものまえがき
この記事はぴょこりんクラスタ:Re Advent Calendar 2016 - Adventarのために書かれました。
サマリ
- fitbitHRに貯めこまれたデータから、記憶を蘇らせたかった。
- 前回、データをとってくるところで気力がつきたので
- 週次の睡眠時間を可視化するところをやりました
1. データの取得(続き)
- 前回は、データの時系列をとってくるところでだめでした。
- http://python-fitbit.readthedocs.io/en/latest/をみると、time_series(...)が該当しそう
- でも、resourceってなんだ?
- Sleep Logs — Fitbit Web API Docsを見ると、"sleep/minutesAsleep"でよさそう
- ということで(一部略)、
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. 眺める
- 描画部分は、コードを略します。結果はこんな感じ
- いまさらながら折れ線グラフはよくないですね。(欠損値のところに線がひかれてしまったり)
- 日別の睡眠時間
- 週別の平均睡眠時間
- 直近死に絶えていたのは、実際に正しかった。
- ただ、休日夜更かししたのと、平日寝れていないのの区別が難しい。
- 10月9日は多分単なる夜更かし。ただ、月曜のストレスで日曜ねれないとかもあるので、難しい。
まとめ
- pandas先生便利。
参考
- 上記のリンク元の文書に加え、データ処理に関し
ITエンジニアのためのデータサイエンティスト養成講座(4):ログを分析するには? XMLデータを分析するには? pandasでデータを分析できる状態にする (1/3) - @ITを参考にしました。