notebook

都内でWEB系エンジニアやってます。

iPhoneヘルスケアの歩数データをPixelaに入れ込む

最近身の周りの数値を取って可視化する活動をコツコツ進めている

今回はiPhoneのヘルスケア(歩数)データをPixelaに投げて可視化する

前日分に関してはiPhoneのショートカットで毎朝前日分のデータを投げるようにしているが過去分のデータもせっかくなら見たいなと思い調べて試してみたのでその記録

ヘルスケアデータのCSVへの書き出しは次の記事のコードを使い日付ごとの歩数データを生成した

iOS標準アプリ「ヘルスケア」からデータを書き出しcsvに変換

  • ヘルスケアデータから歩数データをCSVへ書き出す(上記記事のスクリプトに少し足しただけ)
import pandas as pd
import xml.etree.ElementTree as ET

tree = ET.parse('apple_health_export/export.xml')
root = tree.getroot()

datetime = []
counts = []

for child in root:
    data = child.attrib

    try:
        if data['type'] == 'HKQuantityTypeIdentifierStepCount':
            datetime.append(data['startDate'])
            counts.append(data['value'])
    except:
        pass

df = pd.DataFrame({
    'datetime': datetime,
    'stepCount': counts
})

df['stepCount'] = df['stepCount'].astype(int)
df.to_csv('df.csv', index=False)
  • 歩数データから日毎の集計を行いCSVへ書き出す(上記記事のスクリプトに少し足しただけ)
import pandas as pd
df = pd.read_csv('df.csv', index_col='datetime')
df.index = pd.to_datetime(df.index, utc=True)
df['datetimeja'] = df.index.tz_convert('Asia/Tokyo')
df['date'] = df['datetimeja'].dt.date
daySummary = df.groupby(['date']).sum()
print(daySummary)
daySummary.to_csv('daily_steps.csv')

出力されたCSVは次のようになっていた

  • daily_steps.csv
date,stepCount
2014-11-02,3509
2014-11-03,1053
2014-11-04,4879
2014-11-05,7580
2014-11-06,6735
2014-11-07,11617

2014年からデータがあったので驚いたw

  • 生成した日毎CSVからPixelaへのimport

こちらは自分がRubyのほうが手になじむのでPixelaへ入れ込む用のスクリプトを雑に書いた

require 'pixela'
require 'awesome_print'
require 'csv'
require 'date'

client = Pixela::Client.new(username: 'hoge', token: ENV['PIXELA_TOKEN'])

csv = CSV.read('./daily_steps.csv', headers: true)

id = 'walk'

csv.each do |row|
  client.create_pixel(graph_id: id, date: Date.parse(row['date']), quantity: row['stepCount'].to_i)
end
  • 結果(投稿日のスクショ)

今年の話でいうとコロナによる在宅開始の影響がはっきり出ていることがわかった

  • 3月まで
    • 木曜のみリモート(他の日は保育園の送り+通勤)
  • 3月から
    • 完全在宅開始+妻育休で保育園も休み→送りなし(一歩も外でない)
  • 7月から
    • 引き続き在宅+妻復職で保育園再開→送りあり(少し外に出る)

やはりこういう可視化は気付きがあるし面白くて良い