Fitbitで心拍数データを時系列で取得・可視化する方法

チュートリアル

Fitbitは、ウェアラブルデバイスやアプリを通じて健康管理をサポートするプラットフォームです。本記事では、Fitbit APIを使用して心拍数データを取得し、時系列グラフで可視化する方法を初心者向けに解説します。


こちらの記事もおすすめ

PythonとGoogle Colabを使ってFitbitの睡眠データを可視化しよう
Fitbitは人気のフィットネストラッカーで、毎日の活動量や睡眠の質を記録してくれます。このデータを分析・可視化することで、自分の睡眠パターンを把握し、生活習慣の改善に役立てることができます。この記事では、PythonとGoogle Col...
Fitbit APIの認可フロー
Fitbit APIを使用してユーザーデータにアクセスするには、OAuth 2.0認可フレームワークに従って安全に認可を行う必要があります。この記事では、Fitbitが推奨するPKCEを使用した認可コード付与フローについて詳しく解説します。...

前提条件

  • Fitbitのアカウントを持っていること
  • Fitbit APIのアクセストークンを取得済みであること
  • Pythonの基本的な知識があること

手順

1. 必要なライブラリをインストールする

以下のコマンドを実行して、必要なライブラリをインストールします。

pip install requests seaborn matplotlib pandas

2. 設定ファイルを準備する

token.jsonという名前のファイルを作成し、以下の内容を記述します。XXXXXXXXXXXXXXXXXXXXXXXXXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYは、実際のアクセストークン、リフレッシュトークン、ユーザーIDに置き換えてください。

{
    "access_token": "XXXXXXXXXXXXXXXXXXXXXXXXX",
    "expires_in": 28800,
    "refresh_token": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
    "scope": "respiratory_rate electrocardiogram location cardio_fitness social activity settings sleep temperature oxygen_saturation nutrition heartrate profile weight",
    "token_type": "Bearer",
    "user_id": "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
}

3. 心拍数データを取得するスクリプトを作成する

以下のPythonスクリプトを作成します。このスクリプトは、Fitbit APIを使用して心拍数データを取得し、取得したデータを表示します。

import requests
import json

# 設定ファイルのパス
CONFIG_FILE = "token.json"

def load_config():
    """設定ファイルを読み込む"""
    try:
        with open(CONFIG_FILE, "r", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        print(f"設定ファイル {CONFIG_FILE} が見つかりません。")
        exit(1)

def save_config(config):
    """設定ファイルを保存する"""
    with open(CONFIG_FILE, "w", encoding="utf-8") as f:
        json.dump(config, f, indent=2)

def create_auth_header(access_token):
    """認証用のヘッダを作成する"""
    return {"Authorization": "Bearer " + access_token}

def refresh_access_token(config):
    """アクセストークンを更新する"""
    url = "https://api.fitbit.com/oauth2/token"
    params = {
        "grant_type": "refresh_token",
        "refresh_token": config["refresh_token"],
        "client_id": config["client_id"],
    }

    response = requests.post(url, data=params)
    data = response.json()

    if "errors" in data:
        print(f"アクセストークンの更新に失敗しました: {data['errors'][0]['message']}")
        return False

    config["access_token"] = data["access_token"]
    config["refresh_token"] = data["refresh_token"]
    save_config(config)
    return True

def is_token_expired(response_data):
    """アクセストークンの有効期限が切れているかチェックする"""
    if "errors" in response_data:
        for error in response_data["errors"]:
            if error.get("errorType") == "expired_token":
                print("アクセストークンの有効期限が切れています。")
                return True
    return False

def make_api_request(url, headers):
    """APIリクエストを実行する"""
    response = requests.get(url, headers=headers)
    data = response.json()

    if is_token_expired(data):
        config = load_config()
        if refresh_access_token(config):
            headers = create_auth_header(config["access_token"])
            response = requests.get(url, headers=headers)
        else:
            print("アクセストークンの更新に失敗したため、リクエストを中止します。")
            exit(1)

    return response

def get_heart_rate(date="today", period="1d"):
    """心拍数データを取得する"""
    url = f"https://api.fitbit.com/1/user/-/activities/heart/date/{date}/{period}.json"
    config = load_config()
    headers = create_auth_header(config["access_token"])
    return make_api_request(url, headers)

if __name__ == "__main__":
    response = get_heart_rate(date="2024-03-09")
    data = response.json()
    print(data["activities-heart-intraday"]["dataset"][0])

4. 心拍数データを可視化するスクリプトを作成する

以下のPythonスクリプトを作成します。このスクリプトは、取得した心拍数データを時系列グラフで可視化します。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# データをDataFrameに変換
heart_data = data["activities-heart-intraday"]["dataset"]
df = pd.DataFrame(heart_data)

# 'time'列をdatetime型に変換
df['time'] = pd.to_datetime(df['time'])

# グラフのスタイルを設定
sns.set_style("whitegrid")

# パステルカラーのカラーパレットを作成
pastel_colors = sns.color_palette("pastel")

# グラフを描画
plt.figure(figsize=(12, 6))
sns.lineplot(x='time', y='value', data=df, color=pastel_colors[0])

# グラフのタイトルと軸ラベルを設定
plt.title("Heart Rate Time Series", color='black')
plt.xlabel("Time", color='black')
plt.ylabel("Heart Rate", color='black')

# x軸の目盛りを設定
plt.xticks(rotation=45, color='black')
plt.yticks(color='black')

# グラフの背景色を設定
fig = plt.gcf()
fig.set_facecolor('#F0F0F0')

# グラフを表示
plt.tight_layout()
plt.show()

5. スクリプトを実行する

最初に作成したスクリプトを実行して、心拍数データを取得します。次に、2つ目のスクリプトを実行して、取得したデータを時系列グラフで可視化します。

file

まとめ

本記事では、Fitbit APIを使用して心拍数データを取得し、時系列グラフで可視化する方法を解説しました。APIの認証、データの取得、データの可視化の流れを理解することで、自分の健康管理に役立てることができます。今後は、他の健康データを取得・可視化したり、データ分析を行ったりすることで、さらに健康管理の幅を広げていくことができるでしょう。

ノートブック

Google Colaboratory

参考サイト

Fitbit Development: Web API
You'll fit in here. Using JavaScript, CSS, and SVG, developers now have a fast, easy way to build apps and clock faces for Fitbit OS.

リポジトリ

GitHub - Sunwood-ai-labs/fitbit-python-analyzer
Contribute to Sunwood-ai-labs/fitbit-python-analyzer development by creating an account on GitHub.

コメント

タイトルとURLをコピーしました