LoginSignup
140
130

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-02-01

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

FullSizeRender.jpg のコピー.jpg

ひょんなことから最近話題のウエアラブル端末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を取得できるのでこれをメモする。
スクリーンショット 2017-02-01 23.33.24.png

OAuth 2.0 Application TypeをPersonalに設定

MANAGE MY APPS から Edit Application Settings のページを開き、OAuth 2.0 Application TypeをPersonalに設定
スクリーンショット 2018-01-16 0.10.01.png
分単位などの時系列データを取得する場合はPersonalに設定する必要があります。
(参考: https://dev.fitbit.com/build/reference/web-api/activity/

Access TokenとRefresh Tokenを取得

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

ターミナル
git clone https://github.com/orcasgit/python-fitbit.git 

ターミナルの使い方はこちら
gitコマンドでエラーが出る方はこちら

次に、下記コマンドをターミナルにコピペして実行。
【OAuth 2.0 Client ID】と 【Client Secret】は先程取得した値で置き換え。
python-fitbit/gather_keys_oauth2.py 【OAuth 2.0 Client ID】 【Client Secret】

すると、ブラウザが起動し、
スクリーンショット 2017-02-01 12.12.52.png
こんな認証画面が表示されるので、必要なものにチェックを入れて【許可】(とりあえず全部チェックした)。

ターミナルに戻ると、

ターミナル
access_token = XXXXXXXXXXXXXXXXXXXXXX
refresh_token == YYYYYYYYYYYYYYYYYYYYYYYYY

と表示されているのでこれをメモ。
取得した
・Client ID
・Client Secret
・Access Token
・Refresh Token
の値はメモして保存しておこう。

Pythonを使ってデータの取得

PythonのコーディングはJupyterで行いました。

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

ターミナル
pip install fitbit

しておく。
python-fitbit GitHub
python-fitbit 解説

データ取得
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]
出力結果
[{'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"にすることで、1分単位、15分単位で取得できます。

データを加工して、プロット

dict型のデータをデータフレーム化
heart_df = pd.DataFrame.from_dict(heart_sec)
print(heart_df.shape)
heart_df.head()

スクリーンショット 2017-02-02 0.30.25.png

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

indexを時系列データに
heart_df.index = pd.to_datetime([DATE + " " + t for t in heart_df.time])
heart_df.head()

スクリーンショット 2017-02-02 0.34.26.png
plotするときに楽なので、indexを時系列データに変換。
1.リスト内包表記で、日付と時間をつなげた文字列を作成
2.to_datetime で文字列リストをdatetimeIndexに変換。
3.dataframeのindexを変更する。

pandasのplot

plot
heart_df.plot(y="value", figsize=(20,5))
heart_df.head()

0JblsRxM2NAAAAAAElFTkSuQmCC.png

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

おすすめ

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

140
130
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
140
130