diff --git a/dbdpy/apple_watch.py b/dbdpy/apple_watch.py index 75db95b3..77bd7ae6 100644 --- a/dbdpy/apple_watch.py +++ b/dbdpy/apple_watch.py @@ -90,11 +90,6 @@ def read_file(cls, filepath: str, device_name: str = "Apple Watch"): .drop(columns="type") .rename(columns={"value": "active_calories"}) ) - steps = ( - record_df[record_df["type"] == "StepCount"] - .drop(columns="type") - .rename(columns={"value": "steps"}) - ) distance = ( record_df[record_df["type"] == "DistanceWalkingRunning"] .drop(columns="type") @@ -110,12 +105,9 @@ def read_file(cls, filepath: str, device_name: str = "Apple Watch"): .drop(columns="type") .rename(columns={"value": "heart_rate"}) ) - sleep = record_df[record_df["type"] == "SleepAnalysis"].drop(columns="type") return cls( - sleep=sleep, energy=energy, - steps=steps, distance=distance, oxygen=oxygen, heart_rate=heart_rate, diff --git a/dbdpy/commercial_device.py b/dbdpy/commercial_device.py index 912bba9b..7ee42559 100644 --- a/dbdpy/commercial_device.py +++ b/dbdpy/commercial_device.py @@ -1,16 +1,12 @@ class CommercialDevice: def __init__( self, - sleep=None, energy=None, - steps=None, distance=None, oxygen=None, heart_rate=None, ) -> None: - self.sleep = sleep self.energy = energy - self.steps = steps self.distance = distance self.oxygen = oxygen self.heart_rate = heart_rate diff --git a/notebooks/workflow_example.ipynb b/notebooks/workflow_example.ipynb index 138c3a06..451defb3 100644 --- a/notebooks/workflow_example.ipynb +++ b/notebooks/workflow_example.ipynb @@ -197,9 +197,6 @@ "record_df[\"type\"] = record_df[\"type\"].str.replace(\"HKQuantityTypeIdentifier\", \"\")\n", "record_df[\"type\"] = record_df[\"type\"].str.replace(\"HKCategoryTypeIdentifier\", \"\")\n", "\n", - "# De-identify souce name? \n", - "\n", - "# Remove unnecessary columns? \n", "\n", "energy = record_df[record_df[\"type\"] == \"BasalEnergyBurned\"]\n", "steps = record_df[record_df[\"type\"] == \"StepCount\"]\n", @@ -218,6 +215,194 @@ "### Garmin" ] }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "import pandas as pd\n", + "from garmin_fit_sdk import Decoder, Stream" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "directory_path = Path(\"./data/garmin/\")\n", + "\n", + "monitoring_data = pd.DataFrame()\n", + "oxygen_data = pd.DataFrame()\n", + "for file in directory_path.rglob(\"*WELLNESS.fit\"):\n", + " stream = Stream.from_file(file)\n", + " decoder = Decoder(stream)\n", + " messages, _ = decoder.read(\n", + " apply_scale_and_offset=True,\n", + " convert_datetimes_to_dates=False,\n", + " convert_types_to_strings=True,\n", + " enable_crc_check=True,\n", + " expand_sub_fields=True,\n", + " expand_components=True,\n", + " merge_heart_rates=False,\n", + " mesg_listener=None,\n", + " )\n", + " \n", + " monitoring_df = pd.DataFrame(messages[\"monitoring_mesgs\"])[[\"timestamp\", \"distance\", \"heart_rate\", \"active_calories\"]]\n", + " try:\n", + " oxygen_df = pd.DataFrame(messages[\"spo2_data_mesgs\"])[[\"timestamp\", \"reading_spo2\"]]\n", + " except KeyError:\n", + " continue\n", + "\n", + " monitoring_data = pd.concat([monitoring_data, monitoring_df])\n", + " oxygen_data = pd.concat([oxygen_data, oxygen_df])\n", + "\n", + "# Convert the timestamp\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
timestampdistanceheart_rateactive_calories
01.064462e+09NaNNaNNaN
11.064462e+09NaNNaNNaN
21.064462e+09NaNNaNNaN
3NaNNaN74.0NaN
4NaNNaN71.0NaN
...............
550NaN533.84NaN59.0
5511.064242e+090.00NaN1.0
5521.064242e+09591.75NaN63.0
5531.064242e+09NaNNaNNaN
5541.064242e+09NaNNaNNaN
\n", + "

7847 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " timestamp distance heart_rate active_calories\n", + "0 1.064462e+09 NaN NaN NaN\n", + "1 1.064462e+09 NaN NaN NaN\n", + "2 1.064462e+09 NaN NaN NaN\n", + "3 NaN NaN 74.0 NaN\n", + "4 NaN NaN 71.0 NaN\n", + ".. ... ... ... ...\n", + "550 NaN 533.84 NaN 59.0\n", + "551 1.064242e+09 0.00 NaN 1.0\n", + "552 1.064242e+09 591.75 NaN 63.0\n", + "553 1.064242e+09 NaN NaN NaN\n", + "554 1.064242e+09 NaN NaN NaN\n", + "\n", + "[7847 rows x 4 columns]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "monitoring_data" + ] + }, { "cell_type": "markdown", "metadata": {},