[OURA APIシリーズ_2] Pythonを使ったOURA APIへのアクセス

# 概要
本稿では、OURA ringにより生成されたデータに、プログラム言語[Python](https://www.python.org)を使ってアクセスする方法を紹介します。実際の順序としては、① Pythonや実行環境として使用する[Anaconda](https://www.anaconda.com)のインストール、② 使用するライブラリのインストール、そして③ [JupyterLab](https://jupyter.org)を使ったコードの実行です。OURA ringユーザでOURA APIを知らない方、あるいは未だOURA APIを使用するためのPersonal Access Tokens(PATs)を作成していない方は[[OURA APIシリーズ_1]](https://qiita.com/physiol_hayato/items/51a5803602aada5298ab) を参照にしてPATsを作成してください。プログラム言語に親しくない方でも本稿までの内容を実行することで、少なくともOURA ringによって生成された睡眠のデータを抽出できるようにまとめました。次回以降の記事で取得可能な全てのデータを取得できるようなコード一覧表を投稿する予定ですので、本稿を参考に、まずは睡眠データを抽出してみてください。それでは、以下の手順に従って、OURA ringの未抽出データへアクセスするためのPC環境を構築していきましょう。

# Pythonのインストール
Pythonは、1991年にオランダ人プログラマーのグイド・ヴァン・ロッサムによって開発されたプログラム言語です。通常、Pythonでプログラミングを実行するときには[「ライブラリ」](https://www.geeksforgeeks.org/libraries-in-python/)という「ある目的に沿って関数や機能をまとめたパッケージ」を使用します。OURA APIから生成データをダウンロードするために、まずは、標準ライブラリを搭載した最新のPythonと、追加で必要になるライブラリをインストールします。PythonはMacOSに標準で付属している[ターミナル(Terminal)](https://support.apple.com/ja-jp/guide/terminal/apd5265185d-f365-44cb-8b09-71a064a42125/mac)を使って実行可能ですが、私は、実行したコードの記録や、実行経過の自動保存、出力データの保存・管理等が容易といった面で優れているJupyterLabという実行環境(対話型開発環境)を使用しています。Anacondaというパッケージ管理ソフトウェアをインストールすることでJupyterLabを実行できますので、こちらも併せてインストールしていきます。
#### Python.org から「Python」をインストールする
標準ライブラリを搭載した最新のPythonをPCにインストールします。ブラウザから[python.org](https://www.python.org)を検索します。トップページの「Downloads」プルダウンから使用しているPCのOSをクリックします。
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570080/95c6bd92-26de-bf52-e65c-2e99d35039cd.png">
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570080/edc12cd5-94af-e9e1-8657-c87addf8c207.png">
クリックすると最新Verが「Latest Python」として確認できます。例えば2023年10月10日現在は「Latest Pythn 3 Release - Python 3.12.0」と記載してあり、最新VerがPython 3.12.0であることがわかります。下記の「Stable Releases」より、最新のinstallerをダウンロードしてPCへのインストールを実行します。
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570080/ab9e05d3-f91c-1106-59da-a3b632102104.png">
インストールを実行します。
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570080/510abb6b-57e5-526e-8021-4f2aab8fe666.png">
インストールが完了すると、ローカルフォルダにPythonが保存されます。これでPythonのインストールは完了です。
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570080/7ee5924b-254d-6ea8-a717-c020ff4e52e7.png">
# Anacondaのインストール
次に、Pythonを実行する環境としてAnacondaをインストールします。こちらもブラウザで[anaconda.com](https://www.anaconda.com)を検索し、ダウンロードを進めていきます。トップページの「Free Download」をクリックします。
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570080/fbd8d1c6-668b-544a-d70b-d3b493977375.png">
「Download」をクリックして進みます。
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570080/5f95115f-2528-579a-5df6-8a7f2e1dac4a.png">
インストーラーが表示されますので、ローカルフォルダを指定してインストールを完了してください。完了すると、AnacondaのAppがLaunchpad内に表示されます。クリックしてAppを立ち上げます。
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570080/57c30331-6abd-fb74-fcf8-1d3552212180.png">
インターネット接続下で「JupyterLab」を起動させると、JupyterLab内のLauncherが表示されます。Python3のボタンをクリックすれば、前項でインストールしたPython3をJypyterLabのNotebookで実行することができます。
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570080/014ca274-af04-4599-cec0-775f2eb937bf.png">
# ライブラリのインストール
ここからは実際にJupyterLab上でPythonコマンドを実行してデータを抽出していきます。OURA APIから抽出するデータは、[.json(JavaScript Object Notation)](https://ja.wikipedia.org/wiki/JavaScript_Object_Notation)形式で出力されます。一方、プログラマーではない私たちにとって、この形式のデータは非常に扱いづらいです。例えば、私の睡眠データを抽出した画面を示します。
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570080/a6b46e5a-7f8d-b3f6-c968-bcedc8d193be.png">
整然としていますが、１行で示されたこのようなデータを処理するのは大変そうですよね、、、。一方、いくつかのライブラリを追加してコードを実行すると.csvなど、扱い易い形式のデータを出力することができます。
Pythonのパッケージ管理システム「pip」を使うとライブラリをインストールしたり、アップデートしたりすることができます。
まずは、ライブラリ[「oura」](https://pypi.org/project/oura/)と、PATsを使ってデータを抽出するためのライブラリ[「requests」](https://pypi.org/project/requests/)をインストールします。下記のコマンドをNotebookに入力し、Shift＋Enterで実行してください。2つのライブラリがインストールされるはずです。
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570080/ecaa72ad-8d4a-33f4-5df3-16bff5db328a.png">
```
# oura libraly
!pip install oura
# requests
!pip install requests
```
これでひとまず準備完了です。下記で認証方法と使用するAPIのバージョンを説明したのちに、データの抽出を行なっていきます。
# 認証方法とAPI version
[公式Web](https://cloud.ouraring.com/docs/authentication)では、PATsを使って2つの方法によりデータにアクセスすることができると紹介してあります。URL parameterは[[OURA APIシリーズ_1]](https://qiita.com/physiol_hayato/items/51a5803602aada5298ab) で実行した通り、URLにPATsを付与してブラウザで検索する方法です。今後は、方法1.に示されたHTTP headerという認証方法によりAPIにアクセスしていきます。
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570080/335817df-6ce3-f6f1-117b-98fec8232a5d.png">
OURA API V1は2016年に、V2は2022年にリリースされています。本稿を読んでからPATsを作成する場合、そしてGen3以降のOura ringをお持ちの場合は、V1とV2の両方のデータにアクセスできます。V2の方が豊富なデータが出力できますし、日中・睡眠時の全ての時間でHRが取得可能なことを確かめました。そこで、本稿ではV2データへのアクセスを示します。
# 睡眠時の心拍数と心拍変動データを抽出し.csvで出力する
例として、睡眠時の2つのデータ「心拍数と心拍変動」について、API V2よりデータを抽出していきます。コードはこちらです。
```
#ライブラリをimportします
import requests
import json
import pandas as pd

url = 'https://api.ouraring.com/v2/usercollection/sleep'

#日付を任意に指定してください
params={
    'start_date': '2023-XX-XX',
    'end_date': '2023-XX-XX'
}

#自分のPATsを置換してください
headers = {
  'Authorization': 'Bearer <自分のPATsを入力>'
}
response = requests.request('GET', url, headers=headers, params=params)
print(response.text)

#.csvの保存名を任意で入力してください
response_json = json.loads(response.text)
hr_list = response_json["data"][0]["heart_rate"]["items"]
hr_dict = {"heart_rate": hr_list}
df =pd.DataFrame(hr_dict)
df.to_csv('hr23XXXX.csv')

hrv_list = response_json["data"][0]["hrv"]["items"]
hrv_dict = {"hrv": hrv_list}
df = pd.DataFrame(hrv_dict)
df.to_csv('hrv23XXXX.csv')
```
実際に返ってくる画面はこちらです。また、ローカルフォルダには、心拍数(heart_rate)と心拍変動(hrv)の.csvファイルが出力されているはずです。以下で、使用するライブラリやコードの意味について少しだけ説明します。
<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570080/2b72e5c9-5c28-9acb-19e1-a1901ec3c717.png">
今回使用(import)するライブラリは、[requests](https://pypi.org/project/requests/) / [json](https://docs.python.org/3/library/json.html) / [pandas](https://pandas.pydata.org)の3つです。それぞれ、HTTPリクエストを送信するため、JSON形式のデータを操作するため、そしてデータフレームとしてデータを操作するために必要なライブラリです。url=の尾部をreadiness / sleep / activity / bedtimeと変更することで、それぞれのV2データにアクセスできます。日付の指定はparamsにて行います。bearer認証にPATsを用いることでAPIへのアクセスが承認されます。あとはリストとして「どのデータを抽出するか」を指定したり、ディクショナリーとしてキー(変数の種類)と値(変数の値)を定義して.csvに出力するコードになります。

# まとめ
本稿ではOURA APIの認証トークンPATsを使用してAPIデータにアクセスし、データを抽出、出力する方法を紹介しました。具体的には、Python / Anacondaのインストール、ライブラリのインストール、コードの実行です。それぞれのデータを抽出するコードは[API Documentation](https://cloud.ouraring.com/v2/docs)に丁寧に記してあります。抽出したいデータがあるときは、こちらのWebページから「Python」のコード参照にJupyterLabで実行してみてください。


次回以降もデータ抽出のためのコードについて、また、なるべく早く「OURA APIコード一覧」のようなチート記事を投稿したいと思っています。それではまた！