Pythonでfitbit APIから心拍数を取得してみよう！

# 多機能ウエアラブル端末fitbit charge2!

![FullSizeRender.jpg のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/135663/fcfc621d-d016-9338-e24a-7567770a2f13.jpeg)

ひょんなことから最近話題のウエアラブル端末fitbit charge2をゲットしたので、これで遊んでみたいと思います。
fitbitは公式でAPIがあるので、これを活用して、心拍数をPythonで取得してグラフにするところまでやります。

【環境】
・ OS X EI Capitan
・ Python 3.5.2

# APIの準備
APIに必要なIDなどを取得します
## アプリケーションの作成

https://dev.fitbit.com/login に自身のfitbitアカウントでログインし、**REGISTER AN APP* タブから新しくアプリケーションを作ります。

| 項目名 | 内容 |
|:-----------:|:------------:|
| Application Name      |  アプリケーションの名前(適当)|
|  Description  |  アプリケーションの説明(適当) |
| Application Website       |  アプリケーションのURL(適当) |
| Organization  |  所属組織 |
|   Organization Website    |   所属組織のURL | 
| OAuth 2.0 Application Type    |  アプリのタイプ(ClientかPersonalを選択) |   
| Callback URL   |  http://127.0.0.1:8080/ と入力 |   
| Default Access Type   | ここではデータの変更は行わないのでRead-Onlyを選択 |   ]]

## Client IDとClient Secretを取得

アプリケーションを作成すると、**MANAGE MY APPS** から(OAuth 2.0)Client IDとClient Secretを取得できるのでこれをメモする。
<img width="400" alt="スクリーンショット 2017-02-01 23.33.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/135663/973ecfdb-b21d-4f3d-0594-7fbad2fcc8e9.png">

## OAuth 2.0 Application TypeをPersonalに設定

*MANAGE MY APPS*　から **Edit Application Settings** のページを開き、OAuth 2.0 Application TypeをPersonalに設定
<img width="208" alt="スクリーンショット 2018-01-16 0.10.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/135663/386ac875-4656-cdbd-3fca-613bbc7a0e7b.png">
分単位などの時系列データを取得する場合はPersonalに設定する必要があります。
（参考： https://dev.fitbit.com/build/reference/web-api/activity/ ）

## Access TokenとRefresh Tokenを取得
ここから少し面倒。
ターミナルを起動。適当なディレクトリに移動し、下記コマンドをターミナルにコピペして実行。

```python:ターミナル
git clone https://github.com/orcasgit/python-fitbit.git 
```
ターミナルの使い方は[こちら](http://qiita.com/kenju/items/77a2dc1b6a60697b1133)
gitコマンドでエラーが出る方は[こちら](http://qiita.com/furusin_oriver/items/974a7b7fb8c56ad88d6e)

次に、下記コマンドをターミナルにコピペして実行。
【OAuth 2.0 Client ID】と 【Client Secret】は先程取得した値で置き換え。
```python-fitbit/gather_keys_oauth2.py 【OAuth 2.0 Client ID】 【Client Secret】
```
すると、ブラウザが起動し、
<img width="446" alt="スクリーンショット 2017-02-01 12.12.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/135663/e4deb2a8-9e18-7992-114d-e4bec3a9adff.png">
こんな認証画面が表示されるので、必要なものにチェックを入れて【許可】（とりあえず全部チェックした）。

ターミナルに戻ると、

```python:ターミナル
access_token = XXXXXXXXXXXXXXXXXXXXXX
refresh_token == YYYYYYYYYYYYYYYYYYYYYYYYY
```
と表示されているのでこれをメモ。
取得した
・Client ID
・Client Secret
・Access Token
・Refresh Token
の値はメモして保存しておこう。

# Pythonを使ってデータの取得
Pythonのコーディングは[Jupyter](http://qiita.com/y__sama/items/17aedf0c05187edd61c3)で行いました。

python-fitbit ライブラリを使うので

```python:ターミナル
pip install fitbit
```
しておく。
[python-fitbit GitHub](https://github.com/orcasgit/python-fitbit)
[python-fitbit 解説](http://python-fitbit.readthedocs.io/en/latest/)

```python:データ取得
import fitbit
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

# メモしたID等
CLIENT_ID =  "XXXXXXXXXXXXXXXXXXXXXXX"
CLIENT_SECRET  = "XXXXXXXXXXXXXXXXXXXXXXX"
ACCESS_TOKEN =  "XXXXXXXXXXXXXXXXXXXXXXX"
REFRESH_TOKEN =  "XXXXXXXXXXXXXXXXXXXXXXX"

# 取得したい日付
DATE = "2017-01-31"

# ID等の設定
authd_client = fitbit.Fitbit(CLIENT_ID, CLIENT_SECRET
                             ,access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN)
# 心拍数を取得（1秒単位）
data_sec = authd_client.intraday_time_series('activities/heart', DATE, detail_level='1sec') #'1sec', '1min', or '15min'
heart_sec = data_sec["activities-heart-intraday"]["dataset"]
heart_sec[:10]
```

```python:出力結果
[{'time': '00:00:02', 'value': 56},
 {'time': '00:00:07', 'value': 55},
 {'time': '00:00:12', 'value': 54},
 {'time': '00:00:17', 'value': 54},
 {'time': '00:00:32', 'value': 54},
 {'time': '00:00:37', 'value': 56},
 {'time': '00:00:42', 'value': 55},
 {'time': '00:00:52', 'value': 58},
 {'time': '00:01:07', 'value': 58},
 {'time': '00:01:09', 'value': 57}]
```
心拍数が取れてる！
深夜0時から24時間分のデータを取得しているが、全てをもらさずに毎秒データを取れているわけではない、むしろ取れている秒の方が少ないことに注意。

detail_level という引数を"1min","15min"にすることで、１分単位、15分単位で取得できます。

# データを加工して、プロット
```python:dict型のデータをデータフレーム化
heart_df = pd.DataFrame.from_dict(heart_sec)
print(heart_df.shape)
heart_df.head()
```
<img width="132" alt="スクリーンショット 2017-02-02 0.30.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/135663/e594f74a-3773-5c99-9aad-70df4113d374.png">

dict型のデータを一発でdataframeに変換してくれる、from_dictはとても便利。

```python:indexを時系列データに
heart_df.index = pd.to_datetime([DATE + " " + t for t in heart_df.time])
heart_df.head()
```
<img width="241" alt="スクリーンショット 2017-02-02 0.34.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/135663/0f465b61-460e-9439-5168-b56a89af2c89.png">
plotするときに楽なので、indexを時系列データに変換。
１．リスト内包表記で、日付と時間をつなげた文字列を作成
２．to_datetime で文字列リストをdatetimeIndexに変換。
３．dataframeのindexを変更する。

## pandasのplot
```python:plot
heart_df.plot(y="value", figsize=(20,5))
heart_df.head()
```
![0JblsRxM2NAAAAAAElFTkSuQmCC.png](https://qiita-image-store.s3.amazonaws.com/0/135663/7965a930-041a-03bf-0d7a-f6fc5b8480e5.png)

1時半から8時の睡眠中は心拍数が低いですねー
まあ分析はまた今度！

# おすすめ
『1日に必要とされる野菜1/2が摂れるキムチ鍋』 @セブンイレブン

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-86820859-2', 'auto');
  ga('send', 'pageview');

</script>