Apple Watchで取得したバイタルデータをCSVで出力する

# なにこれ
apple watchやiOSデバイスで取得したバイタルデータを出力することができると言う噂を聞いたので，試してみました．
#### 使用したもの
Apple Watch series3
iPhone11 (iOS14.0.1)

# バイタルデータの出力
出力は簡単です．iPhoneの「ヘルスケア」から出力します．
まず「ヘルスケア」アプリを開き，概要ページの右上部分にある自信のAppleIDのアイコンをタップします．
![IMG_8984.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682975/a599b74b-9597-2f3d-f814-725a9b90c34c.png)
タップ後表示されるメニューの一番下にある「すべてのヘルスケアデータを書き出す」をタップします．
![IMG_8985.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682975/4ae351cc-b2b5-e4d7-bd18-db58567f6680.png)

処理が走るのでしばらく待ちます．完了すると共有メニューが表示されるので，Airdropなど好きな方法でPCへデータを持っていきます．

出力されたバイタルデータは`書き出したデータ.zip`としてZIP圧縮されています．これを解凍してやるとxml形式のファイル`export.xml`と`export_cda.xml`が出てきます．`export.xml`にデバイスが取得したバイタルデータがすべて記録されています．しかし，これはxml形式のデータであることや，歩数や心拍数など複数の情報がまとめて1つのファイルに記されているため，このままだとちょっと扱いにくいです．

# CSVへ変換
今回はこの[Githubリポジトリ](https://github.com/tdda/applehealthdata)で提供されているPythonのプログラムを使ってcsvに変換してやりました．

#### 準備

この[Githubリポジトリ](https://github.com/tdda/applehealthdata)のソースコードをクローンするなりダウンロードするなりして自身のPC上に持ってきます．
クローンしたリポジトリの`applehealthdata-master`内にバイタルデータのxmlファイル`export.xml`を入れます．
#### 実行
`applehealthdata.py`を実行することで`export.xml`をcsv形式に変換してくれます．引数に変換対象のxmlファイルのパスを指定する必要があります．つまり以下のような感じで実行します．

```bash
python applehealthdata.py ./export.xml
```

#### 変換
カレントディレクトリ内にcsv形式のバイタルデータが出力されます．さらに嬉しいことに，バイタルデータの種類ごとにファイルを分けて出力されます．

# 中身の確認
どの様な感じで出力されているか確認してみました．今回は~~わざわざ~~pandasを使って心拍数に関するcsvファイル`HeartRate.csv`の上位5件を出力してみます．

```py
import pandas as pd

data = pd.read_csv("HeartRate.csv")
print(data.head())
```

出力は以下の通り...

```
         sourceName sourceVersion                                             device  ...                  startDate                    endDate    value
0  〇〇のApple Watch         6.2.8  <<HKDevice: 0x000000000>, name:Apple Watch, ma...  ...  2020-08-08 00:14:42 +0900  2020-08-08 00:14:42 +0900  67.0000
1  〇〇のApple Watch         6.2.8  <<HKDevice: 0x000000000>, name:Apple Watch, ma...  ...  2020-08-08 00:26:27 +0900  2020-08-08 00:26:27 +0900  67.2445
2  〇〇のApple Watch         6.2.8  <<HKDevice: 0x000000000>, name:Apple Watch, ma...  ...  2020-08-08 00:31:20 +0900  2020-08-08 00:31:20 +0900  60.0000
3  〇〇のApple Watch         6.2.8  <<HKDevice: 0x000000000>, name:Apple Watch, ma...  ...  2020-08-08 00:38:25 +0900  2020-08-08 00:38:25 +0900  57.0000
4  〇〇のApple Watch         6.2.8  <<HKDevice: 0x000000000>, name:Apple Watch, ma...  ...  2020-08-08 00:42:25 +0900  2020-08-08 00:42:25 +0900  62.0000
```

行が長すぎて途中で省略されていますが，取得したデバイスに関する情報，記録日時，計測日時，計測値が記録されています．
今回の場合，計測値は心拍数を示しています．

余談ですが，記録した心拍数の最大値を見てみます．

```py
import pandas as pd

data = pd.read_csv("HeartRate.csv")
max_value = data['value'].idxmax()
print(data.loc[max_value])
```

```
sourceName                                        〇〇のApple Watch
sourceVersion                                                6.2.8
device           <<HKDevice: 0x０００００００００>, name:Apple Watch, ma...
type                                                     HeartRate
unit                                                     count/min
creationDate                             2020-09-25 12:20:29 +0900
startDate                                2020-09-25 12:15:04 +0900
endDate                                  2020-09-25 12:15:04 +0900
value                                                          153
Name: 2169, dtype: object
```

# まとめ
今回はAppleWatchが取得したバイタルデータを出力してみました．