Apple Watchのヘルスケアデータをエクスポート
以前の記事でApple Watchについて書きました。会社の景品でいただいてから、毎日装着してデータを取る生活が2週目に入りました。
最近はようやくApple Watchのデータを色々と可視化したり相関取ったり、ということができるようになってきたので少しずつ記事にまとめていきたいと思います。
まずはヘルスケアデータをエクスポートするところから始めましょう。
こちらは、iPhone側で「ヘルスケア」アプリを起動し、右上のユーザーアイコンをタップします。
次に、一番下にある「すべてのヘルスケアデータを書き出す」をタップします。
これにより、iPhoneやApple Watch(あるいはiCloud)に溜まったヘルスケアデータがzipファイルとしてエクスポートできます。
このzipファイルをAirDropでmacOSに送るも良し、OutlookやGmailのアプリに添付してメールで送るも良し、ファイルとしてiCloudに保存するも良し、です。
参考:【Apple】iPhoneユーザーガイド iPhoneの「ヘルスケア」でヘルスケアおよびフィットネスのデータを共有する
中身はxml形式
zipファイルを開くと、export.xml、export_cda.xml、そしてApple Watchで心電図を取っていればelectrocardiogramsフォルダ、ワークアウトアプリを使ったことがあれば、workout-routesフォルダが含まれます。
electrocardiogramsフォルダには、心電図を取った日のcsvファイルがあります。
そしてワークアウトアプリを起動して測定したエクササイズ時のデータはworkout-routesフォルダにgpxファイル形式で保存されています。gpxは位置情報を格納したXML形式のファイルです。
XMLデータの読み込み
それではexport.xmlを読み取って心拍数のデータをプロットしてみましょう。
MATLABを使った場合の読み込み例です。バージョンはR2021aです。
XMLファイルを読み込むのはreadstructを使います。
str = readstruct('export.xml');
% Convert to table
t = struct2table(str.Record);
% Convert typeAttribute to categorical
t.typeAttribute = categorical(t.typeAttribute);
% Extract only heart rate data
idx = t.typeAttribute == "HKQuantityTypeIdentifierHeartRate";
t(~idx, :) = [];
% Convert character to double
t.valueAttribute = str2double(t.valueAttribute);
% Convert timestamp to datetime
t.startDateAttribute = datetime(t.startDateAttribute, 'InputFormat', 'yyyy-MM-dd HH:mm:ss Z', 'TimeZone', 'Asia/Tokyo');
% Extract only 2021/08/24
idx = t.startDateAttribute >= '2021/08/24 00:00:00' & t.startDateAttribute <= '2021/08/24 23:59:59';
t(~idx, :) = [];
% Plot
plot(t.startDateAttribute, t.valueAttribute)
xlabel('Time')
ylabel('Heart rate [count / min]')
Code language: Matlab (matlab)
これで心拍数がプロットできます。赤文字のテキストは手動で入れました。
心拍数は空腹になっていくに連れて下がっていき、食事を摂ると少し上がっていることが分かりました。在宅ワークなので日中の変動は少ないほうですが、夕方18時の心拍数の低さ(50前半)には驚きました。ランニングに行ってペースが上がると心拍数も増えていき、最高は170くらい。そして寝るまでに緩やかに下っていますが、運動後元の心拍数に戻るまで数時間掛かっています。
ワークアウトデータの読み込み
ワークアウトのgpxファイルを読み込む一例として、MATLABのコード例を書きます。
MATLABにはMapping Toolboxにgpxread関数がありますが、位置情報だけしか取得できず、ワークアウトのエクササイズデータで重要なspeed(速度)などのデータを拾えません。
なので、XML形式を読み込むreadstructを使います。バージョンはR2021aを使っています。
xmlObj = readstruct(fullfile('workout-routes', 'route_2021-08-24_6.45pm.gpx'), 'FileType', 'xml');
% Convert to table
tbl = struct2table(xmlObj.trk.trkseg.trkpt);
% Expand extensions column
tbl2 = struct2table(tbl.extensions);
for n=1:length(tbl2.Properties.VariableNames)
varname = tbl2.Properties.VariableNames{n};
tbl.(varname) = tbl2.(varname);
end
tbl.extensions = [];
% Convert timestamp to datetime
tbl.time = datetime(tbl.time, 'InputFormat', 'yyyy-MM-dd''T''HH:mm:ssZ', 'TimeZone', 'Asia/Tokyo');
clear tbl2 xmlObj
% Plot in a map
geobubble(tbl.latAttribute, tbl.lonAttribute, tbl.speed)
Code language: Matlab (matlab)
これで地図にプロットするところまでできます。
Apple Watchで取得したヘルスケアデータを、iPhoneからエクスポートして読み取り、可視化までこれでできましたね。
No responses yet