J'ai aimé porter Android Wear et Apple Watch lors de leur première sortie, mais je veux toujours utiliser la montre comme je l'aime, donc je ne l'utilise plus comme indicateur d'activité. Une application qui peut enregistrer les données de santé est installée en standard sur l'iPhone que vous transportez tous les jours sans porter de jauge d'activité. Puisque les données ont été accumulées, je voudrais les exporter depuis l'iPhone et l'utiliser pour l'analyse des données.
Ouvrez Santé dans l'application iPhone et appuyez sur l'icône de profil en haut à droite.
Appuyez sur «Exporter les données de santé» sur votre page de profil. Appuyez sur «Exporter» dans la boîte de dialogue de confirmation.
Appuyez sur le service pour lequel vous souhaitez exporter des données de santé.
Si vous sélectionnez iCloud Drive, l'archive sera enregistrée dans le dossier iCloud Drive du PC synchronisé avec le nom de fichier «Exported Data.zip».
Les données de santé sont un fichier au format XML «données exportées.xml» dans le fichier «data.zip exporté». Étant donné que les données du nombre de pas sont gérées par Excel, j'ai écrit un script pour le convertir en CSV afin qu'il puisse être facilement copié et collé. Pour l'utiliser, clonez d'abord le référentiel depuis ici.
$ git clone https://github.com/masato/health-data-csv.git
$ cd health-data-csv
Copiez le fichier ʻexported data.zip` dans le répertoire cloné. Pour macOS, iCloud Drive se trouve dans le répertoire suivant. Guillemet double car il y a un espace demi-largeur dans le chemin.
$ cp "$HOME/Library/Mobile Documents/com~apple~CloudDocs/Données exportées.zip" .
convert.py
est un script Python qui extrait le XML des données de santé du fichier Zip, agrège le nombre d'étapes par jour et le produit dans un fichier CSV. Seules les données du nombre de pas sont extraites de l'élément Record
en spécifiant type
dans HKQuantityTypeIdentifierStepCount
. J'étudie Introduction à l'analyse des données avec le traitement des données Python à l'aide de NumPy et pandas, donc l'outil d'analyse de données pandas Implémentons l'agrégation et l'exportation au format CSV en utilisant (/ //pandas.pydata.org/).
Selon l'article Gestion d'un fichier zip contenant un nom de fichier japonais en Python 3, le nom de fichier japonais est comme ʻExported data.xml`. Il semble être décodé par «cp437».
convert.py
# -*- coding: utf-8 -*-
from lxml import objectify
import pandas as pd
from pandas import DataFrame
from dateutil.parser import parse
from datetime import datetime
import zipfile
import argparse
import sys, os
def main(argv):
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file',
default='Exporté.zip',
type=str,
help='nom de fichier zip(Exporté.zip)')
parser.add_argument('-s', '--start',
action='store',
default='2016-01-01',
type=str,
help='date de début(2016-12-01)')
args = parser.parse_args()
if not os.path.exists(args.file):
print('Veuillez spécifier le nom du fichier zip.')
parser.print_help()
sys.exit(1)
zipfile.ZipFile(args.file).extractall()
parsed = objectify.parse(open('apple_health_export/Données exportées.xml'
.encode('utf-8').decode('cp437')))
root = parsed.getroot()
headers = ['type', 'unit', 'startDate', 'endDate', 'value']
data = [({k: v for k, v in elt.attrib.items() if k in headers})
for elt in root.Record]
df = DataFrame(data)
df.index = pd.to_datetime(df['startDate'])
#Seul le nombre d'étapes
steps = df[df['type'] == 'HKQuantityTypeIdentifierStepCount'].copy()
steps['value'] = steps['value'].astype(float)
#Tranche si la date de début est en condition
if args.start:
steps = steps.loc[args.start:]
#Regrouper par jour et agréger
steps_sum = steps.groupby(pd.TimeGrouper(freq='D')).sum()
steps_sum.T.to_csv('./steps_{0}.csv'.format(datetime.now().strftime('%Y%m%d%H%M%S')),
index=False, float_format='%.0f')
if __name__ == '__main__':
main(sys.argv[1:])
Pour exécuter le script, utilisez continuumio / anaconda3 pour l'image Docker. Une image Docker qui utilise Anaconda pour l'analyse des données. Jupyter est également installé.
Le script Python utilise l'indicateur -f
pour spécifier le nom du fichier zip dans le répertoire actuel exporté depuis Healthcare. L'indicateur -s
vous permet de spécifier la date de début de l'enregistrement à convertir en CSV.
$ docker pull continuumio/anaconda3
$ docker run -it --rm \
-v $PWD:/app \
-w /app \
continuumio/anaconda3 \
python convert.py -f Données exportées.zip -s 2016-12-01
Un fichier CSV tel que "steps_xxx.csv" qui regroupe le nombre d'étapes par jour a été créé dans le répertoire courant.
$ cat steps_20161212013800.csv
2016-12-01,2016-12-02,2016-12-03,2016-12-04,2016-12-05,2016-12-06,2016-12-07,2016-12-08,2016-12-09,2016-12-10,2016-12-11
7217,8815,2260,1828,3711,6980,7839,5079,7197,7112,2958