** Ich möchte die gesammelten Apple Watch-Daten auf Colab mit Pandas und Matplotlib visualisieren **
Papa, ich möchte von meiner Tochter dafür gelobt werden, dass sie so verrückt ist. .. Ich versuchte mein Bestes zu geben mit dem Wunsch, von meiner Tochter respektiert zu werden.
Die Schlussfolgerung ist zuerst. Die Arbeit selbst ist nicht schwierig, aber die Daten sind trotzdem schwer. .. Die Datenkapazität (xml) beträgt ** 643 MB dank der kontinuierlichen Aufzeichnung für ein Jahr! ** **. Und Einige Daten stimmen aus irgendeinem Grund nicht mit dem Wert von iPhone / Apple Watch überein. Mein täglicher aktiver Stoffwechsel betrug 8792 kcal. Was? An diesem Tag saß ich auf einem Stuhl und programmierte nur, aber ... Übrigens scheint es ungefähr die gleiche Menge an Kalorien zu verbrauchen wie Gachis Triathlon. (Schwimmen: 3,8 km + Fahrrad: 180 km + Laufen: 42,195 km)
Das Rätsel vertieft sich, ob es sich um einen Ausgabefehler oder einen Pandas-Betriebsfehler handelt. ..
Davon abgesehen schienen die Daten verwendbar zu sein, also beschloss ich, die Schrittzählungsdaten herauszunehmen und verschiedene Dinge auszuprobieren.
Sowohl bei Kaninchen als auch bei Ecken beginnt es nicht, ohne zuerst die Daten zu exportieren. Apple Watch-Daten werden auf dem synchronisierten iPhone gespeichert. Nicht nur die Apple Watch, sondern auch Geräte, die mit "Healthcare" -Apps und Protokollen von Apps von Drittanbietern verknüpft sind, sind in einem Datenelement integriert.
Jetzt exportieren wir aus der App "Healthcare" auf dem iPhone. Im Moment scheint es keinen anderen Weg zu geben, als aus dieser App zu exportieren.
Der Export auf das iPhone dauerte ungefähr 10 Minuten. Die Datei wird komprimiert und Sie können das Ausgabeziel wie iCloud oder Mail auswählen. In meinem Fall war es eine ziemlich große Datei, daher habe ich sie mit AirDrop direkt auf mein MacBook übertragen.
Sie können export.xml extrahieren, indem Sie die Zip-Datei entpacken. Dies sind die Protokolldaten der Apple Watch. Wenn es sich um XML handelt, ist die Datenverarbeitung schlecht, daher werde ich sie in CSV konvertieren.
Ein schönes Konvertierungsprogramm wird auf GitHub Gist veröffentlicht. Laden Sie es herunter ConvertAppleHealthXMLtoCSV.py https://gist.github.com/xiantail/12784626d1c82411e0b986f71d1171ee#file-convertapplehealthxmltocsv-py
Einige Korrekturen
ConvertAppleHealthXMLtoCSV.py
#Weniger als:Kommentieren Sie die Zeilen 33-39 aus
#Da es keinen Wert gibt, dessen Schlüssel Wert ist, tritt ein Fehler auf, wenn er unverändert bleibt.
try:
float(att_values['value'])
except ValueError:
#att_values['value_c'] = att_values['value']
#att_values['value'] = 0
continue
#Weniger als:Zeile 56
#Ändern Sie den Pfad willkürlich entsprechend Ihrer Umgebung
if __name__ == '__main__':
convert_xml_to_csv('export.xml')
Eine CSV mit einem datierten Dateinamen wird generiert.
export20191021214259.csv
(Da es problematisch ist, werde ich es export.csv nennen)
GoogleColab Der offizielle Name lautet "Google Colaboratory". Es ist ein Dienst von Google und mit einem Wort, es ist eine Cloud-Version von "jupyter notebook". Ich werde die Daten hierher bringen und es tun.
Es scheint verschiedene Möglichkeiten zu geben, Daten in Colab zu übertragen, aber ich habe Folgendes getan:
Ich werde das Hochladen auf Google Drive unterlassen.
Laden Sie die von Clob auf Google Drive hochgeladenen Daten.
from google.colab import drive
drive.mount('/content/drive')
Wenn Sie dies tun, werden Sie aufgefordert, den Link anzuzeigen und den "Autorisierungscode" einzugeben. Folgen Sie dem Link, kopieren Sie den Autorisierungscode für Ihr Google-Konto und geben Sie ihn ein. Sie sollten die googleDrive-Dateien in "Seitenleiste> Laufwerk" sehen.
Abgesehen davon ist Google Colab ein freundlicher Dienst, der den juckenden Ort erreichen kann, obwohl er auf Englisch ist. Wenn Sie nicht wissen, was es ist, und Sie das Gefühl haben, dass es wahrscheinlich eine solche Funktion gibt, Sie können nach "Code-Snippet" suchen.
Klicken Sie einfach auf "Laufwerk" und Sie erfahren, wie Sie eine Verbindung zu Google Drive herstellen. Außerdem wird der Code durch einfaches Klicken auf die Schaltfläche "Einfügen" eingefügt, was praktisch ist.
Laden Sie zunächst das Standardmodul.
import pandas as pd
import matplotlib.pyplot as plt
Laden Sie dann export.csv. Klicken Sie für den Lesepfad mit der rechten Maustaste auf die entsprechende Datei in der Seitenleiste> Treiber, die zuvor importiert wurde. Ein "Kopierpfad" wird angezeigt, daher ist es bequem, damit zu kopieren und einzufügen. Wenn die Datei zu groß ist, um sie mehrmals zu laden, verwenden Sie die Option "low_memory = False".
df = pd.read_csv('/content/drive/My Drive/ColabNotebooks/export20191021214259.csv', low_memory=False)
df.head(3)
Das Format der Apple HealthCare-Daten lautet wie folgt.
--type: Datenklassifizierung innerhalb von Apple HealthCare --sourceName: Datenerfassungsquelle (in diesem Fall Daten, die von einer verknüpften App namens "My Water" erfasst wurden) --sourceVersion: Versionsnummer der Datenerfassungsquelle
Die Daten sind schwer und schwer zu sehen, daher werde ich den Datenrahmen ein wenig organisieren.
#Das Gerät ist nur NaN oder appleWatch. Löschen Sie es. Eine Version ist nicht erforderlich. Löschen Sie es
df_apple = df.drop(["sourceVersion","device"], axis=1)
df_apple = df_apple.loc[:,['type','sourceName','value','unit', 'creationDate', 'startDate', 'endDate']]
#Setzen Sie das Erstellungsdatum auf Index und geben Sie die Konvertierung in datetime ein, da das Datum nur eine Zeichenfolge ist
df_apple = df_apple.set_index('creationDate')
df_apple.index = pd.to_datetime(df_apple.index, utc=True).tz_convert('Asia/Tokyo')
#Passen Sie den Wert an. NaN-Daten löschen, nicht numerische Daten löschen, in Gleitkomma konvertieren
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)
#Es scheint, dass der Typ lang war, also habe ich die üblichen zusätzlichen Teile entfernt
df_apple['type'] = df_apple['type'].str.replace('HKQuantityTypeIdentifier','')
#Später möchte ich nach Monat, Tag usw. sortieren und analysieren, also Jahr, Monat, Tag, Uhrzeit, Tag zum Index hinzufügen
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()
Es war ziemlich erfrischend.
df_apple.info()
Ich habe NaN usw. gereinigt, aber die Anzahl der Daten beträgt mehr als 1,53 Millionen. Das Datum wird in Index konvertiert und der Wert ist vom Typ float. Selbst wenn Sie aus XML konvertieren und die Daten organisieren, hat es immer noch 87 MB oder mehr. .. Es ist schwer.
Mal sehen, wie die Daten aufgeschlüsselt sind.
print(df_apple['type'].drop_duplicates().to_string(index=False, header=False))
print(df_apple['sourceName'].drop_duplicates().to_string(index=False, header=False))
Grundsätzlich werden wir die Daten nach Quellennamen eingrenzen.
In einigen Fällen wird ein Quellenname von mehreren Apps und Terminals gemeinsam genutzt. Wenn Sie also einzeln prüfen möchten, ist es besser, die Daten mithilfe des Typs einzugrenzen. (Beispiel: Wenn Sie sowohl auf AppleWatch als auch auf dem iPhone Schrittzählungen durchführen, aber nur die von Applewatch usw. gemessenen Daten verwenden möchten.)
Bis zu diesem Punkt konnten wir die Daten organisieren und den Inhalt überprüfen. Schauen wir uns den Inhalt der Daten an.
Erstellen Sie zunächst einen DataFrame, der nur die Schrittzählungsdaten eingrenzt
#Anzahl der Schritte:StepCount
#Einer wurde gelöscht, weil ein Teil in der Anwendung zweimal erworben wurde
df_step = df_apple[(df_apple['type'] == 'StepCount') & ~(df_apple['sourceName'] == 'Gesundheitswesen')]
#Der Grund ist unbekannt, aber 2018 weist viele Fehler auf, sodass wir uns nur auf 2019 konzentrieren werden
df_step = df_step.query("year == '2019'")
#Gesamtzahl der Schritte pro Tag
daily_step = df_step.sum(level=['year', 'month', 'day']).sort_values('value', ascending=False)
print('Anzahl der Schritte pro Tag')
daily_step.head(10)
Du gehst viel, 9/25 auf dem 1. Platz. Da es mit den iPhone-Daten übereinstimmt, scheint es kein Fehler zu sein. Als ich es nachgeschlagen habe, war es der Tag, an dem ich mit bezahlten Ferien zur Team Lab-Ausstellung in Odaiba ging und herumlief, verstehe ich ♪
Ich versuchte herauszufinden, an welchem Tag am meisten gelaufen wurde.
#Gesamtzahl der Schritte pro Tag
#0 Montag-6 Sonntag
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, Da ich nicht zur Arbeit gehe, gibt es nur wenige Samstage und Sonntage, aber ich gehe oft sonntags mit meiner Familie aus. Am Mittwoch laufe ich auf dem Heimweg von der Arbeit ein wenig auf einem Laufgerät im Fitnessstudio. Ist es das Beste? Ich werde am Samstag etwas mehr umziehen.
Schauen wir uns auch die monatliche Schrittmenge an.
#Gesamtzahl der Schritte pro Monat
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()
Da ich die Daten Mitte Oktober exportiert habe, gibt es im Oktober nur wenige. Ich trainiere nicht wegen Influenza im Januar und Neujahrsschlaf ... Es war heiß im August und September dieses Jahres, also ging ich nicht viel aus. Lassen Sie uns überlegen, ob wir nächstes Jahr drinnen trainieren können.
Kombiniert mit der Anzahl der Schritte pro Woche Es ist interessant, mein Verhaltensmuster zu verstehen.
Abschließend möchte ich auf die verbrannten Kalorien eingehen.
Wie ich eingangs erwähnt habe, ist der Wert lächerlich. Wahrscheinlich aus diesem Grund ist der Gesamtwert mit iPhone und Apple Watch nicht konsistent. Haben Sie bei der Konvertierung von XML in CSV einen Fehler gemacht? Oder vielleicht haben sich die Spezifikationen in Apple HealthCare während der einjährigen Protokollmessung geändert.
Ichiou, ich habe den aktiven Stoffwechsel berechnet und versucht, die Top 10 des täglichen Verbrauchs zu ermitteln.
Offensichtlich lustig ... w Obwohl ich nur auf einem Stuhl saß und programmierte, 8972kcal !! (Triathlon Ironman) Selbst die US-Spezialeinheiten verbrennen nicht so viele Kalorien (´ ゚ д ゚ `)
Ich bemerkte später, Mit dem iOS-Update vom November war die App "Healthcare" ziemlich gut. Es wird jetzt auch innerhalb der App leicht verständlich angezeigt.
Es erscheint interessant, nicht nur die Aktivitätsdaten der Apple Watch zu analysieren, sondern auch die Gewichtsskala, die Schlafzeit, das Muskeltrainingsprotokoll usw. Vielen Dank für das Lesen und wünschen Ihnen ein gesundes Programmiererleben.
Recommended Posts