** Je souhaite visualiser les données Apple Watch accumulées sur Colab avec les pandas et matplotlib **
Papa, je veux être félicité par ma fille pour être si folle. .. J'ai essayé de faire de mon mieux avec le désir d'être respecté par ma fille.
La conclusion est la première. Le travail lui-même n'est pas difficile, mais les données sont de toute façon lourdes. .. La capacité de données (xml) est de ** 643 Mo grâce à l'enregistrement régulier pendant un an! ** ** Et Certaines données ne correspondent pas à la valeur de l'iphone / Apple Watch pour une raison quelconque. Mon métabolisme d'activité quotidienne était de 8792 kcal. Quoi? Ce jour-là, j'étais assis sur une chaise et je codais juste, mais ... À propos, il semble qu'il consomme à peu près la même quantité de calories que le triathlon de Gachi. (Nage: 3,8 km + Vélo: 180 km + Course: 42,195 km)
Le mystère s'approfondit s'il s'agit d'une erreur de sortie ou d'une erreur d'opération Pandas. ..
À part cela, les données semblaient utilisables, j'ai donc décidé de supprimer les données de comptage des pas et d'essayer diverses choses.
Dans les lapins comme dans les coins, cela ne démarre pas sans exporter au préalable les données. Les données de l'Apple Watch sont stockées sur l'iPhone synchronisé. Non seulement l'Apple Watch, mais également les appareils associés aux applications «Santé» et les journaux des applications tierces sont intégrés dans une seule donnée.
Maintenant, exportons depuis l'application "Santé" sur iPhone. Pour l'instant, il ne semble y avoir d'autre moyen que d'exporter à partir de cette application.
Il a fallu environ 10 minutes pour exporter sur iPhone. Le fichier est compressé et vous pouvez sélectionner la destination de sortie telle qu'iCloud ou courrier. Dans mon cas, c'était un fichier assez volumineux, je l'ai donc transféré directement sur mon macbook avec AirDrop.
Vous pouvez extraire export.xml en décompressant le zip. Ce sont les données du journal de l'Apple Watch. S'il s'agit de XML, la gestion des données est mauvaise, je vais donc le convertir en csv.
Un joli programme de conversion est publié sur GitHub Gist, alors téléchargez-le ConvertAppleHealthXMLtoCSV.py https://gist.github.com/xiantail/12784626d1c82411e0b986f71d1171ee#file-convertapplehealthxmltocsv-py
Quelques corrections
ConvertAppleHealthXMLtoCSV.py
#Moins que:Commentez les lignes 33-39
#Puisqu'il n'y a aucune valeur dont la clé est value, une erreur se produira si elle est laissée telle quelle.
try:
float(att_values['value'])
except ValueError:
#att_values['value_c'] = att_values['value']
#att_values['value'] = 0
continue
#Moins que:Ligne 56
#Changez arbitrairement le chemin en fonction de votre environnement
if __name__ == '__main__':
convert_xml_to_csv('export.xml')
Un csv avec un nom de fichier daté est généré.
export20191021214259.csv
(Comme c'est gênant, je l'appellerai export.csv)
GoogleColab Le nom officiel est "Google Colaboratory". C'est un service fourni par Google, et en un mot, c'est une version cloud de "jupyter notebook". Je vais apporter les données ici et le faire.
Il semble y avoir plusieurs façons d'obtenir des données dans Colab, mais j'ai fait ce qui suit:
J'oublierai le téléchargement sur Google Drive.
Chargez les données téléchargées sur Google Drive depuis Clob.
from google.colab import drive
drive.mount('/content/drive')
Lorsque vous le faites, vous serez invité à afficher le lien et à entrer le «code d'autorisation».
Suivez le lien, copiez et saisissez le code d'autorisation de votre compte Google,
Vous devriez voir les fichiers googleDrive dans Barre latérale> Drive
.
En passant, Google Colab est un service aimable qui peut atteindre l'endroit qui démange, bien qu'il soit en anglais. Si vous ne savez pas ce que c'est et que vous sentez qu'il semble y avoir une telle fonction, Vous pouvez effectuer une recherche à partir de «extrait de code».
Appuyez simplement sur Drive et il vous dira comment vous connecter à Google Drive. De plus, c'est pratique car il colle le code simplement en cliquant sur le bouton "Insérer".
Commencez par charger le module standard.
import pandas as pd
import matplotlib.pyplot as plt
Ensuite, chargez export.csv.
Pour le chemin de lecture, cliquez avec le bouton droit sur le fichier correspondant dans la barre latérale> pilote
qui a été importé précédemment.
Un chemin de copie
apparaîtra, il est donc pratique de copier et coller en utilisant cela.
Si le fichier est trop volumineux et ne parvient pas à être lu plusieurs fois, essayez d'utiliser l'option low_memory = False
.
df = pd.read_csv('/content/drive/My Drive/ColabNotebooks/export20191021214259.csv', low_memory=False)
df.head(3)
Le format des données Apple HealthCare est le suivant.
--type: classification des données dans Apple HealthCare --sourceName: source d'acquisition de données (dans ce cas, les données acquises à partir d'une application liée appelée "My Water") --sourceVersion: numéro de version de la source d'acquisition de données --unité: unité --creationDate: date et heure de création des données --startDate: date et heure de début de l'acquisition des données --endDate: date et heure de fin d'acquisition des données --value: value ** Je veux ceci ** --device: dispositif d'acquisition (dispositif de capteur)
Les données sont lourdes et difficiles à voir, je vais donc organiser un peu le Dataframe.
#Supprimez l'appareil car il n'a que NaN ou appleWatch, et supprimez-le car il n'est pas nécessaire de disposer d'une version.
df_apple = df.drop(["sourceVersion","device"], axis=1)
df_apple = df_apple.loc[:,['type','sourceName','value','unit', 'creationDate', 'startDate', 'endDate']]
#Définissez la date de création sur Index, saisissez la conversion en datetime car la date n'est qu'une chaîne de caractères
df_apple = df_apple.set_index('creationDate')
df_apple.index = pd.to_datetime(df_apple.index, utc=True).tz_convert('Asia/Tokyo')
#Ajustez la valeur. Supprimer les données NaN, supprimer les données non numériques, convertir en virgule flottante
df_apple = df_apple.dropna(subset=['value'])
df_apple.drop(df_apple.index[df_apple['value'].str.match('[^0-9]')], inplace=True)
df_apple['value'] = df_apple['value'].astype(float)
#Il semble que le type était long, j'ai donc supprimé les parties supplémentaires communes
df_apple['type'] = df_apple['type'].str.replace('HKQuantityTypeIdentifier','')
#Plus tard, je souhaite trier et analyser par mois, jour, etc.
df_apple = df_apple.set_index([df_apple.index.year, df_apple.index.month, df_apple.index.day, df_apple.index.hour, df_apple.index.weekday, df_apple.index])
df_apple.index.names = ['year', 'month', 'day', 'hour', 'weekday', 'date']
df_apple.head()
C'était plutôt rafraîchissant.
df_apple.info()
J'ai nettoyé NaN etc., mais le nombre de données est supérieur à 1,53 million. La date est convertie en index et la valeur est de type float. Même si vous convertissez à partir de XML et organisez les données, il reste 87 Mo ou plus. .. C'est lourd.
Voyons quelle est la ventilation des données.
print(df_apple['type'].drop_duplicates().to_string(index=False, header=False))
print(df_apple['sourceName'].drop_duplicates().to_string(index=False, header=False))
Fondamentalement, nous affinerons les données par sourceName.
Dans certains cas, un sourceName est partagé par plusieurs applications et terminaux, donc si vous souhaitez vérifier individuellement, il est préférable de restreindre les données à l'aide du type. (Exemple: si vous effectuez des comptages de pas sur AppleWatch et iPhone, mais que vous souhaitez utiliser uniquement les données mesurées par Applewatch, etc.)
Jusqu'à présent, nous avons pu organiser les données et vérifier le contenu. Regardons en fait le contenu des données.
Tout d'abord, créez un DataFrame qui restreint uniquement les données de nombre de pas
#Nombre d'étapes:StepCount
#Supprimé un car il y avait une partie qui a été acquise deux fois dans l'application
df_step = df_apple[(df_apple['type'] == 'StepCount') & ~(df_apple['sourceName'] == 'Soins de santé')]
#La raison est inconnue, mais 2018 comporte beaucoup d'erreurs, nous allons donc nous concentrer uniquement sur 2019
df_step = df_step.query("year == '2019'")
#Nombre total de pas par jour
daily_step = df_step.sum(level=['year', 'month', 'day']).sort_values('value', ascending=False)
print('Nombre de pas par jour')
daily_step.head(10)
Vous marchez beaucoup, 9/25 en 1ère place. Puisqu'il est cohérent avec les données de l'iphone, cela ne semble pas être une erreur. Quand j'ai cherché, c'était le jour où je suis allé à l'exposition Team Lab à Odaiba en utilisant des vacances payées et je me suis promené, je vois ♪
J'ai essayé de savoir quel jour était le plus marchant.
#Nombre total d'étapes pour chaque jour
#0 lundi-6 dimanche
weekly_step = df_step.sum(level=['weekday']).sort_values('weekday')
weekly_step
plt.figure(figsize=(10,6))
plt.style.use('ggplot')
plt.title("weekly steps")
label = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
# plt.xlabel("week")
# plt.ylabel("steps")
# plt.ylim(450000, 600000)
plt.bar(weekly_step.index, weekly_step.value, tick_label=label, label="steps", align="center")
plt.show()
Hmmmm, Comme je ne vais pas travailler, il y a peu de samedis et dimanches, mais je sors souvent avec ma famille le dimanche. Mercredi, je cours un peu sur une machine à courir au gymnase en rentrant du travail, alors est-ce le plus? Je vais bouger un peu plus samedi.
Regardons également la quantité de pas mensuelle.
#Nombre total d'étapes par mois
monthly_step = df_step.sum(level=['month']).sort_values('month')
monthly_step
plt.figure(figsize=(15,6))
plt.style.use('ggplot')
plt.title("monthly steps")
label = list(range(1, 11))
# plt.xlabel("month")
# plt.ylabel("steps")
plt.bar(monthly_step.index, monthly_step.value, tick_label=label, label="steps", align="center")
plt.show()
Depuis que j'ai exporté les données à la mi-octobre, il y en a peu en octobre. Je ne fais pas d'exercice à cause de la grippe en janvier et du sommeil du Nouvel An ... Il faisait chaud en août et septembre de cette année, donc je ne suis pas beaucoup sorti. Imaginons que nous puissions faire de l'exercice à l'intérieur l'année prochaine.
Combiné avec le nombre de pas par semaine Il est intéressant de comprendre mon modèle de comportement.
Enfin, je voudrais aborder les calories brûlées.
Comme je l'ai mentionné au début, la valeur est ridicule. Probablement à cause de cela, la valeur totale avec l'iPhone et la montre Apple n'est pas cohérente. Avez-vous fait une erreur en convertissant xml en csv? Ou peut-être que les spécifications ont changé dans Apple HealthCare au cours de l'année de mesure du journal.
Ichiou, j'ai calculé le métabolisme actif et publié le top 10 de la consommation quotidienne.
De toute évidence drôle ... w Même si j'étais juste assis sur une chaise et que je codais, 8972kcal !! (Triathlon Ironman) Même les forces spéciales américaines ne brûlent pas autant de calories (´ ゚ д ゚ `)
J'ai remarqué plus tard, Avec la mise à jour iOS de novembre, l'application «Healthcare» était plutôt bonne. Il est maintenant affiché de manière facile à comprendre, même dans l'application.
Il semble intéressant d'analyser non seulement les données d'activité de l'Apple Watch mais aussi l'échelle de poids, le temps de sommeil, le journal d'entraînement musculaire, etc. Merci d'avoir lu jusqu'ici et je vous souhaite une vie de programmeur saine.
Recommended Posts