[PYTHON] Regroupez le nombre d'étapes par jour à partir des données de santé iPhone pour créer un fichier CSV

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.

Exporter des données de santé depuis l'iPhone

Ouvrez Santé dans l'application iPhone et appuyez sur l'icône de profil en haut à droite.   health-1.png

Appuyez sur «Exporter les données de santé» sur votre page de profil.   health-2.png   Appuyez sur «Exporter» dans la boîte de dialogue de confirmation.   health-3.png

Appuyez sur le service pour lequel vous souhaitez exporter des données de santé.   health-4.png

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».

Convertisseur CSV

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:])

Exécuter le script Python

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

Recommended Posts

Regroupez le nombre d'étapes par jour à partir des données de santé iPhone pour créer un fichier CSV
Script Python qui crée un fichier JSON à partir d'un fichier CSV
Créer un fichier de données factice
Comment créer un fichier de configuration
[Python] Comment stocker un fichier csv en tant que données de tableau à une dimension
Comment créer un fichier factice CSV contenant du japonais à l'aide de Faker
Comment créer un clone depuis Github
Créer un fichier deb à partir d'un package python
Comment créer un référentiel à partir d'un média
Script pour créer un fichier de dictionnaire Mac
Let Code Day6 commençant à zéro "1342. Nombre d'étapes pour réduire un nombre à zéro"
J'ai créé un package pour créer un fichier exécutable à partir du code source Hy
Comment créer des exemples de données CSV avec hypothèse
Modifier Excel à partir de Python pour créer un tableau croisé dynamique
Comment lire un fichier CSV avec Python 2/3
Comment créer un objet fonction à partir d'une chaîne
Créer un ensemble de données en échantillonnant au hasard les données MNIST
Comment créer un fichier JSON en Python
Étapes pour créer un bot Twitter avec Python
Lire ligne par ligne à partir d'un fichier avec Python
Essayez de créer une table d'enregistrement de bataille avec matplotlib à partir des données de "Schedule-kun"
Comment utiliser NUITKA-Utilities hinted-compilation pour créer facilement un fichier exécutable à partir d'un script Python
Python --Lire les données d'un fichier de données numériques et calculer la covariance
Étapes de l'installation de Python 3 à la création d'une application Django
Comment enregistrer une table récupérée par python en csv
J'ai essayé de lire les données d'un fichier en utilisant Node.js.
Python --Lisez des données à partir d'un fichier de données numériques pour trouver des matrices, des valeurs propres et des vecteurs propres distribués co-distribués
Convertir les données de maillage exportées de SpriteUV2 dans un format pouvant être importé par Spine
Créer un bloc de données à partir des données textuelles de course de bateaux acquises
J'ai créé un outil pour créer un nuage de mots à partir de wikipedia
Créez une IA qui identifie le visage de Zuckerberg grâce à l'apprentissage en profondeur ③ (Apprentissage des données)
Un script python qui convertit les données Oracle Database en csv
Traiter les données extraites d'un certain système de point de vente pour créer un tableau récapitulatif par produit et par heure
J'ai essayé de créer un rapport Power BI en traitant les journaux CSV / JSON à l'aide d'Azure Databricks