{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"collapsed_sections": [
"BfkoT0OgID3C"
],
"toc_visible": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Guide to Extracting Data w/ APIs from the Fitbit Charge 4\n",
"Start coding now! Visit the [Colab Notebook](https://colab.research.google.com/drive/1L8AgsECQZF-CJbNP9UrEfcwJQlGZ_Enw?usp=sharing)"
],
"metadata": {
"id": "7tCPLg9TFcrG"
}
},
{
"cell_type": "markdown",
"source": [
"\n",
"\n",
"_A picture of the Fitbit Charge 4 that was used for this notebook_"
],
"metadata": {
"id": "iRAe3_9ZFez-"
}
},
{
"cell_type": "markdown",
"source": [
"The Fitbit Charge 4 is a **Sleep** and **Physical Activity** tracker consisting of 15 advanced sensors and 16 MB of storage capacity. Read more about the Fitbit Charge 4 [here](https://www.fitbit.com/global/fi/products/trackers/charge4). An updated version, the Fitbit Charge 5, is also available now.\n",
"\n",
"This is a comprehensive, clear guide to extract data from the Fitbit Charge 4 using the Fitbit Web API. Links to external resources and official Fitbit documentation are provided sporadically throughout the guide for further reference.\n",
"\n",
"If you want to know more about the Fitbit, see the [README](https://github.com/alrojo/wearipedia/tree/main/wearables/fitbit-charge-4) for a detailed analysis of performances, sensors, data privacy, and extraction pipelines.\n",
"
\n",
"A list of the most important accessible data categories is provided below, For the full list, access the api data in section 3.\n",
"\n",
"Category Name (API version)| Parameter Name (subcategory)| Frequency of Sampling \n",
":-------------------:|:----------------------:|:----------------------:\n",
"sleep | date |during the night\n",
"sleep | duration |during the night\n",
"sleep | efficiency |during the night\n",
"sleep | end time |during the night\n",
"sleep | sleep levels |during the night\n",
"steps | date and time |daily\n",
"steps | value (number of steps) |daily\n",
"minutesVeryActive | date and time |daily\n",
"minutesVeryActive | value | daily\n",
"minutesFairlyActive | date and time |daily\n",
"minutesFairlyActive | value |daily\n",
"minutesLightlyActive | date and time |daily\n",
"minutesLightlyActive | value |daily\n",
"distance moved | date and time |daily\n",
"distance moved | value |daily\n",
"minutesSedentary | date and time |daily\n",
"minutesSedentary | value |daily\n",
"heart rate | resting heart rate |daily (per minute)\n",
"heart rate | heart rate zones |daily (per minute)\n",
"heart rate | heart rate variability | during sleep (per minute)\n",
"temperature | skin temperature | daily\n",
"temperature | core temperature | daily\n",
"Spo2 | date and time | during sleep\n",
"Spo2 | value | during sleep\n",
"\n",
"\n",
"In this guide, we sequentially cover the following **five** topics to extract data from the Fitbit API:\n",
"\n",
"1. Set up\n",
"2. Authentication/Authorization\n",
"3. Data extraction\n",
"4. Data visualization\n",
"5. Data analysis\n",
"
\n",
"\n",
"\n",
"
\n",
"\n",
"*Note: Full documentation of APIs by Fitbit can be found [here](https://dev.fitbit.com/build/reference)."
],
"metadata": {
"id": "ggVLILf7cD8x"
}
},
{
"cell_type": "markdown",
"source": [
"# 1. Set up"
],
"metadata": {
"id": "nFpTwru7iPb9"
}
},
{
"cell_type": "markdown",
"source": [
"Relevant libraries are imported below."
],
"metadata": {
"id": "tYwjOqNg5tLD"
}
},
{
"cell_type": "code",
"source": [
"import base64\n",
"import hashlib\n",
"import html\n",
"import json\n",
"import os\n",
"import re\n",
"import urllib.parse\n",
"import requests\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"from sklearn.covariance import EllipticEnvelope\n",
"import seaborn as sns\n",
"from scipy import stats"
],
"metadata": {
"id": "uuVAYBKuiSNj"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"# 2. Authentication/Authorization"
],
"metadata": {
"id": "xaFsRnKrps4l"
}
},
{
"cell_type": "markdown",
"source": [
"To obtain access to the data using the Web API, authentication and authorization is required. Fitbit supports the OAuth 2.0 protocol, with three different models (read more about it [here](https://dev.fitbit.com/build/reference/web-api/authorization/)).\n",
"\n",
"Briefly, Fitbit offers three workflows for their Web APIs in order of lowest level of security to the highest:\n",
"* Implicit Grant Flow\n",
"* Authorization Code Grant Flow\n",
"* Authorization Code Grant Flow with PKCE\n",
"
\n",
"\n",
"We will discuss two authenication/authorization methods, namely the **Implicit Grant Flow** and the **Authorization Code Grant Flow with PKCE**.\n",
"\n",
"The full documentation for all workflows are provided [here](https://dev.fitbit.com/build/reference/web-api/developer-guide/authorization/)."
],
"metadata": {
"id": "UJAToucAdG5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 2.1 Implict Grant Flow"
],
"metadata": {
"id": "GI-ZPzPksmXF"
}
},
{
"cell_type": "markdown",
"source": [
"## 2.2 Authorization Code Grant Flow"
],
"metadata": {
"id": "NYV-nN6RspRt"
}
},
{
"cell_type": "code",
"source": [
"code_verifier = base64.urlsafe_b64encode(\n",
" os.urandom(43)\n",
").decode(\"utf-8\") if \"code_verifier\" not in locals() else code_verifier\n",
"code_challenge = base64.urlsafe_b64encode(\n",
" hashlib.sha256(code_verifier.encode(\"utf-8\")).digest()\n",
").decode(\"utf-8\").replace('=', '')"
],
"metadata": {
"id": "XkAZiOLb7vhp"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"### 2.2.1 Registering an application"
],
"metadata": {
"id": "GmQ8TBs5ccDI"
}
},
{
"cell_type": "markdown",
"source": [
"First, register an application on [here](https://dev.fitbit.com/apps/new) while logged in. OAuth 2.0 Application Type should be set to **Client** or **Personal** and the Callback URL is the address through which you can receive your token (https://127.0.0.1/, also known as the [localhost](https://en.wikipedia.org/wiki/Localhost), is provided as an example, but any link accessible locally should suffice; [8080](https://www.quora.com/What-is-port-8080-used-for#:~:text=Port%208080%20is%20typically%20used%20for%20a%20personally%20hosted%20web%20server) is the port). Other sections can be filled without particular specifications (e.g. https://google.com for all website links). An image with the important sections highlight are provided below for clarity."
],
"metadata": {
"id": "3re1wRU5BVwW"
}
},
{
"cell_type": "markdown",
"source": [
""
],
"metadata": {
"id": "JHg_ltmRHBpC"
}
},
{
"cell_type": "markdown",
"source": [
"The `client_id` and `client_secret` can be accessed under **Manage My Apps**.\n",
"\n",
"An image is provided below for clarity."
],
"metadata": {
"id": "nTJ45T0VHPPC"
}
},
{
"cell_type": "markdown",
"source": [
""
],
"metadata": {
"id": "vnNn-cj4Hflt"
}
},
{
"cell_type": "markdown",
"source": [
"Afterwards, we initialize a [dictionary](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) to hold all variables relevant to authenticating, authorizing, and calling the API later.\n",
"\n"
],
"metadata": {
"id": "derTID_2Suj5"
}
},
{
"cell_type": "code",
"source": [
"variables = dict()\n",
"\n",
"# user specified\n",
"variables[\"client_id\"] = \"238B5J\"\n",
"variables[\"client_secret\"] = \"0c4059cc38121dfdaafb12c02fee2a9c\"\n",
"variables[\"expires_in\"] = \"31536000\" # expiry of token in seconds\n",
"\n",
"# constants or one-time generated\n",
"variables[\"code_verifier\"] = code_verifier\n",
"variables[\"code_challenge\"] = code_challenge\n",
"variables[\"code_challenge_method\"] = \"S256\"\n",
"variables[\"response_type\"] = \"token\" # code\n",
"variables[\"scope\"] = (\n",
" \"weight%20location%20settings%20profile%20nutrition%20\" +\n",
" \"activity%20sleep%20heartrate%20social\"\n",
")\n",
"variables[\"prompt\"] = \"none\"\n",
"variables[\"redirect_uri\"] = \"https%3A%2F%2F127.0.0.1%3A8080%2F\"\n",
"variables[\"grant_type\"] = \"authorization_code\"\n",
"variables[\"authorization\"] = base64.urlsafe_b64encode(\n",
" bytes(variables[\"client_id\"] + \":\" + variables[\"client_secret\"], \"utf-8\")\n",
").decode(\"utf-8\")"
],
"metadata": {
"id": "ZCQcV79GSslI"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"for i in variables.items():\n",
" print(i)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "LRsPt9ZhT8Ri",
"outputId": "438edf92-2312-4920-d438-8697880b60ac"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"('client_id', '238B5J')\n",
"('client_secret', '0c4059cc38121dfdaafb12c02fee2a9c')\n",
"('expires_in', '31536000')\n",
"('code_verifier', 'zV1XXK_iHDBYo8ZBtDhzlsqZ7q_rZKW8tsTTpqzvpQvaKWdr_AboPjKwxw==')\n",
"('code_challenge', '8xM1zi7CR8u-Iz51MUg5D6gSyvkf3CR8GvsGSeyrOF4')\n",
"('code_challenge_method', 'S256')\n",
"('response_type', 'token')\n",
"('scope', 'weight%20location%20settings%20profile%20nutrition%20activity%20sleep%20heartrate%20social')\n",
"('prompt', 'none')\n",
"('redirect_uri', 'https%3A%2F%2F127.0.0.1%3A8080%2F')\n",
"('grant_type', 'authorization_code')\n",
"('authorization', 'MjM4QjVKOjBjNDA1OWNjMzgxMjFkZmRhYWZiMTJjMDJmZWUyYTlj')\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"### 2.2.2 Authorize the App"
],
"metadata": {
"id": "CDn7HFbrcBxV"
}
},
{
"cell_type": "markdown",
"source": [
"Next, we display Fitbit's authorization page by typing a specific URL on a web browser. A code challenge and code verifier is required to progress further. The concept is comprehensively outlined [here](https://tools.ietf.org/html/rfc7636).\n",
"\n",
"The URL should consist of the following required parameters (split into \"variable\" and \"non-variable\" parameters).\n",
"\n",
"#### Variable parameters\n",
"* `client_id`: Fitbit API application ID (under manage my apps specified in 2.1, link [here](https://dev.fitbit.com/apps))\n",
"* `code_challenge`: base64url-encoded SHA256 hash of the code verifier, can be obtained [here](https://example-app.com/pkce)\n",
"* `code_challenge_method`: S256\n",
"\n",
"#### Non-variable parameters\n",
"* `scope`: space-delimited list of data collections requested by the application\n",
"* `response_type`: code"
],
"metadata": {
"id": "yrX6Bl0Qd0WJ"
}
},
{
"cell_type": "markdown",
"source": [
"The resulting URL is demonstrated below.\n",
"\n",
"\n"
],
"metadata": {
"id": "MID6nShYSadx"
}
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "3kJdWgMtb7F1",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "9c0e1592-1c75-4758-a9b3-a58b973519da"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"https://www.fitbit.com/oauth2/authorize?client_id=238B5J&redirect_uri=https%3A%2F%2F127.0.0.1%3A8080%2F&code_challenge=8xM1zi7CR8u-Iz51MUg5D6gSyvkf3CR8GvsGSeyrOF4&code_challenge_method=S256&scope=weight%20location%20settings%20profile%20nutrition%20activity%20sleep%20heartrate%20social&response_type=token&expires_in=31536000\n"
]
}
],
"source": [
"# combine all parameters into the url string\n",
"url = \"https://www.fitbit.com/oauth2/authorize\" # authorization endpoint\n",
"for key in [\"client_id\", \"redirect_uri\", \"code_challenge\", \"code_challenge_method\", \"scope\", \"response_type\", \"expires_in\"]:\n",
" if url == \"https://www.fitbit.com/oauth2/authorize\":\n",
" url += \"?\" + key + \"=\" + variables[key]\n",
" else:\n",
" url += \"&\" + key + \"=\" + variables[key]\n",
"\n",
"print(url)"
]
},
{
"cell_type": "markdown",
"source": [
"Click the url above to access the Authorization page. Check **Allow All** and click the **Allow** button in red. An image is provided below for clarity."
],
"metadata": {
"id": "ONrzmeLmXbgI"
}
},
{
"cell_type": "markdown",
"source": [
""
],
"metadata": {
"id": "1B9XpuWSX4fv"
}
},
{
"cell_type": "markdown",
"source": [
"### 2.2.3 Retrieving the Authorization Code"
],
"metadata": {
"id": "xIjA7DQ9d4tH"
}
},
{
"cell_type": "markdown",
"source": [
"If the `response_type` is `token`, an `access_token` is provided to you as part of the url.\n",
"\n",
"> https://127.0.0.1:8080/#access_token=eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIyMzhCNUoiLCJzdWIiOiI5RkcyNkwiLCJpc3MiOiJGaXRiaXQiLCJ0eXAiOiJhY2Nlc3NfdG9rZW4iLCJzY29wZXMiOiJyc29jIHJzZXQgcmFjdCBybG9jIHJ3ZWkgcmhyIHJwcm8gcm51dCByc2xlIiwiZXhwIjoxNjgyNTIwNjI5LCJpYXQiOjE2NTMwNzE3MTZ9.JPCUw1hMstRMNHgdiHbBmmY-a7o_yX_m6Zx_KaY1J1c&user_id=9FG26L&scope=profile+social+settings+weight+nutrition+location+activity+heartrate+sleep&token_type=Bearer&expires_in=29448913\n",
"\n",
"In the example above, the `access_token` is **eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIyMzhCNUoiLCJzdWIiOiI5RkcyNkwiLCJpc3MiOiJGaXRiaXQiLCJ0eXAiOiJhY2Nlc3NfdG9rZW4iLCJzY29wZXMiOiJyc29jIHJzZXQgcmFjdCBybG9jIHJ3ZWkgcmhyIHJwcm8gcm51dCByc2xlIiwiZXhwIjoxNjgyNTIwNjI5LCJpYXQiOjE2NTMwNzE3MTZ9.JPCUw1hMstRMNHgdiHbBmmY-a7o_yX_m6Zx_KaY1J1c**.\n",
"\n",
"Store the `access_code` inside the `variables` dictionary and skip 2.2.4."
],
"metadata": {
"id": "lq1PRzsyWl34"
}
},
{
"cell_type": "code",
"source": [
"variables[\"access_token\"] = \"eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIyMzhCNUoiLCJzdWIiOiI5RkcyNkwiLCJpc3MiOiJGaXRiaXQiLCJ0eXAiOiJhY2Nlc3NfdG9rZW4iLCJzY29wZXMiOiJyc29jIHJzZXQgcmFjdCBybG9jIHJ3ZWkgcmhyIHJwcm8gcm51dCByc2xlIiwiZXhwIjoxNjgyNTIwNjI5LCJpYXQiOjE2NTMwNzE3MTZ9.JPCUw1hMstRMNHgdiHbBmmY-a7o_yX_m6Zx_KaY1J1c\""
],
"metadata": {
"id": "jknIH2DoxJsH"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"If the `response_type` is `code`, an `access_code` is provided to you as part of the url.\n",
"\n",
"> https://127.0.0.1:8080/?code=e25839197271c1d6f7dab497ff43f0e0610d1970#_=_\n",
"\n",
"In the example above, the `access_code` is **e25839197271c1d6f7dab497ff43f0e0610d1970**.\n",
"\n",
"Store the `access_code` inside the `variables` dictionary and do not skip 2.2.4."
],
"metadata": {
"id": "Pb_KAaqfxIWV"
}
},
{
"cell_type": "code",
"source": [
"# variables[\"access_code\"] = \"9e12294aa2f8405dd70ef68e3f3408bfbdc19a57\""
],
"metadata": {
"id": "TPKQUuexW1Vw"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"### 2.2.4 (OPTIONAL) Exchange the Authorization Code for an Access Token"
],
"metadata": {
"id": "IWbBLd4Qe5Fx"
}
},
{
"cell_type": "markdown",
"source": [
"We exchange the authorization cdoe for access and refresh tokens. First, define a function that makes a post request on the API with the authorization code."
],
"metadata": {
"id": "lcnXeljukU2o"
}
},
{
"cell_type": "code",
"source": [
"# # executes a POST request on the API to obtain access tokens\n",
"# def get_access_token(\n",
"# authorization: str,\n",
"# client_id: str,\n",
"# code: str,\n",
"# code_verifier: str,\n",
"# grant_type: str,\n",
"# redirect_uri: str,\n",
"# url: str = \"https://api.fitbit.com/oauth2/token\",\n",
"# call: str = \"POST\"\n",
"# ):\n",
"# headers = {\n",
"# \"Authorization\": \"Basic \" + authorization,\n",
"# \"Content-Type\": \"application/x-www-form-urlencoded\"\n",
"# }\n",
"# params = {\n",
"# \"client_id\": client_id,\n",
"# \"code\": code,\n",
"# \"code_verifier\": code_verifier,\n",
"# \"grant_type\": grant_type,\n",
"# \"redirect_uri\": redirect_uri\n",
"# }\n",
"# return requests.request(\n",
"# call, url=url, params=params, headers=headers).json()"
],
"metadata": {
"id": "9WywvGI2jHMw"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# headers = {\n",
"# \"Authorization\": \"Basic \" + variables[\"authorization\"],\n",
"# \"Content-Type\": \"application%2Fx-www-form-urlencoded\"\n",
"# }\n",
"# params = {\n",
"# \"clientId\": variables[\"client_id\"],\n",
"# \"code\": variables[\"access_code\"],\n",
"# \"grant_type\": variables[\"grant_type\"],\n",
"# \"redirect_uri\": variables[\"redirect_uri\"]\n",
"# }\n",
"# response = requests.request(\"POST\", url=\"https://api.fitbit.com/oauth2/token\", params=params, headers=headers).json()\n",
"# response"
],
"metadata": {
"id": "rAVD-iKhYyhL"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"The required parameters are again split into \"variable\" and \"non-variable\" parameters. Variable parameters, however, are specified by previous steps.\n",
"\n",
"#### Variable parameters\n",
"* `client_id`: Fitbit API application ID, already specified (under manage my apps specified in 2.1, link [here](https://dev.fitbit.com/apps.))\n",
"* `code`: authorization code\n",
"* `code_verifier`: code verifier value\n",
"\n",
"#### Non-variable parameters\n",
"* `grant_type`: authorization code"
],
"metadata": {
"id": "3C1IuNuEfBcg"
}
},
{
"cell_type": "code",
"source": [
"# get_access_token(\n",
"# authorization=variables[\"authorization\"],\n",
"# client_id=variables[\"client_id\"],\n",
"# code=variables[\"code\"],\n",
"# code_verifier=variables[\"code_verifier\"],\n",
"# grant_type=variables[\"grant_type\"],\n",
"# redirect_uri=variables[\"redirect_uri\"]\n",
"# )"
],
"metadata": {
"id": "TjO5uATnYJTX"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# variables[\"access_token\"] = \"eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIyMzhCNlMiLCJzdWIiOiI5RkcyNkwiLCJpc3MiOiJGaXRiaXQiLCJ0eXAiOiJhY2Nlc3NfdG9rZW4iLCJzY29wZXMiOiJyc29jIHJzZXQgcmFjdCBybG9jIHJ3ZWkgcmhyIHJwcm8gcm51dCByc2xlIiwiZXhwIjoxNjUwOTExMTA2LCJpYXQiOjE2NTAzMTM1NTl9.vFS3mWguPD4_8FMSpClBP9UA212KfwD2eSurYmYGuDM\""
],
"metadata": {
"id": "HJ3izdzlOYPT"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"### 2.2.5 Calling the API"
],
"metadata": {
"id": "yWIfR8SHG9cF"
}
},
{
"cell_type": "code",
"source": [
"# executes a GET request on the API\n",
"def call_API(\n",
" access_token: str,\n",
" url: str,\n",
" call: str = \"GET\"\n",
"):\n",
" headers = {\n",
" \"Authorization\": \"Bearer \" + access_token\n",
" }\n",
" return requests.request(\n",
" call, url=url, headers=headers).json()"
],
"metadata": {
"id": "E213PLuHG92U"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# calls user profile\n",
"call_API(\n",
" access_token=variables[\"access_token\"],\n",
" url=\"https://api.fitbit.com/1/user/-/profile.json\"\n",
")#[\"user\"].keys()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "_faHo9u4IgSA",
"outputId": "68ab9e39-ac08-4806-9132-63f13fb94948"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{'user': {'age': 65,\n",
" 'ambassador': False,\n",
" 'autoStrideEnabled': True,\n",
" 'avatar': 'https://static0.fitbit.com/images/profile/defaultProfile_100.png',\n",
" 'avatar150': 'https://static0.fitbit.com/images/profile/defaultProfile_150.png',\n",
" 'avatar640': 'https://static0.fitbit.com/images/profile/defaultProfile_640.png',\n",
" 'averageDailySteps': 0,\n",
" 'challengesBeta': True,\n",
" 'clockTimeDisplayFormat': '12hour',\n",
" 'corporate': False,\n",
" 'corporateAdmin': False,\n",
" 'dateOfBirth': '1956-12-14',\n",
" 'displayName': 'Peter N.',\n",
" 'displayNameSetting': 'name',\n",
" 'distanceUnit': 'en_US',\n",
" 'encodedId': '9FG26L',\n",
" 'features': {'exerciseGoal': True},\n",
" 'firstName': 'Peter',\n",
" 'foodsLocale': 'en_US',\n",
" 'fullName': 'Peter Norvig',\n",
" 'gender': 'MALE',\n",
" 'glucoseUnit': 'en_US',\n",
" 'height': 190.5,\n",
" 'heightUnit': 'en_US',\n",
" 'isBugReportEnabled': False,\n",
" 'isChild': False,\n",
" 'isCoach': False,\n",
" 'languageLocale': 'en_US',\n",
" 'lastName': 'Norvig',\n",
" 'legalTermsAcceptRequired': True,\n",
" 'locale': 'en_US',\n",
" 'memberSince': '2021-05-25',\n",
" 'mfaEnabled': False,\n",
" 'offsetFromUTCMillis': 7200000,\n",
" 'sdkDeveloper': False,\n",
" 'sleepTracking': 'Normal',\n",
" 'startDayOfWeek': 'SUNDAY',\n",
" 'strideLengthRunning': 96.2,\n",
" 'strideLengthRunningType': 'auto',\n",
" 'strideLengthWalking': 79.10000000000001,\n",
" 'strideLengthWalkingType': 'auto',\n",
" 'swimUnit': 'en_US',\n",
" 'temperatureUnit': 'en_US',\n",
" 'timezone': 'Africa/Cairo',\n",
" 'topBadges': [{'badgeGradientEndColor': 'A489E8',\n",
" 'badgeGradientStartColor': '38216E',\n",
" 'badgeType': 'DAILY_STEPS',\n",
" 'category': 'Daily Steps',\n",
" 'cheers': [],\n",
" 'dateTime': '2022-04-23',\n",
" 'description': '20,000 steps in a day',\n",
" 'earnedMessage': 'Congrats on earning your first High Tops badge!',\n",
" 'encodedId': '228TPP',\n",
" 'image100px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/100px/badge_daily_steps20k.png',\n",
" 'image125px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/125px/badge_daily_steps20k.png',\n",
" 'image300px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/300px/badge_daily_steps20k.png',\n",
" 'image50px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/badge_daily_steps20k.png',\n",
" 'image75px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/75px/badge_daily_steps20k.png',\n",
" 'marketingDescription': \"You've walked 20,000 steps And earned the High Tops badge!\",\n",
" 'mobileDescription': \"When it comes to steps, it looks like you're not playing around. This achievement was a slam dunk.\",\n",
" 'name': 'High Tops (20,000 steps in a day)',\n",
" 'shareImage640px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/386px/shareLocalized/en_US/badge_daily_steps20k.png',\n",
" 'shareText': 'I took 20,000 steps and earned the High Tops badge! #Fitbit',\n",
" 'shortDescription': '20,000 steps',\n",
" 'shortName': 'High Tops',\n",
" 'timesAchieved': 1,\n",
" 'value': 20000},\n",
" {'badgeGradientEndColor': 'FFDB01',\n",
" 'badgeGradientStartColor': 'D99123',\n",
" 'badgeType': 'LIFETIME_DISTANCE',\n",
" 'category': 'Lifetime Distance',\n",
" 'cheers': [],\n",
" 'dateTime': '2022-04-21',\n",
" 'description': '990 lifetime miles',\n",
" 'earnedMessage': \"Whoa! You've earned the New Zealand badge!\",\n",
" 'encodedId': '22B8MD',\n",
" 'image100px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/100px/badge_lifetime_miles990.png',\n",
" 'image125px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/125px/badge_lifetime_miles990.png',\n",
" 'image300px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/300px/badge_lifetime_miles990.png',\n",
" 'image50px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/badge_lifetime_miles990.png',\n",
" 'image75px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/75px/badge_lifetime_miles990.png',\n",
" 'marketingDescription': \"By reaching 990 lifetime miles, you've earned the New Zealand badge!\",\n",
" 'mobileDescription': \"You've walked the entire length of New Zealand.\",\n",
" 'name': 'New Zealand (990 lifetime miles)',\n",
" 'shareImage640px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/386px/shareLocalized/en_US/badge_lifetime_miles990.png',\n",
" 'shareText': 'I covered 990 miles with my #Fitbit and earned the New Zealand badge.',\n",
" 'shortDescription': '990 miles',\n",
" 'shortName': 'New Zealand',\n",
" 'timesAchieved': 1,\n",
" 'unit': 'MILES',\n",
" 'value': 990},\n",
" {'badgeGradientEndColor': '38D7FF',\n",
" 'badgeGradientStartColor': '2DB4D7',\n",
" 'badgeType': 'DAILY_FLOORS',\n",
" 'category': 'Daily Climb',\n",
" 'cheers': [],\n",
" 'dateTime': '2022-04-30',\n",
" 'description': '125 floors in a day',\n",
" 'earnedMessage': 'Congrats on earning your first Rollercoaster badge!',\n",
" 'encodedId': '229844',\n",
" 'image100px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/100px/badge_daily_floors125.png',\n",
" 'image125px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/125px/badge_daily_floors125.png',\n",
" 'image300px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/300px/badge_daily_floors125.png',\n",
" 'image50px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/badge_daily_floors125.png',\n",
" 'image75px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/75px/badge_daily_floors125.png',\n",
" 'marketingDescription': \"You've climbed 125 floors to earn the Rollercoaster badge!\",\n",
" 'mobileDescription': \"That's hair-raising, jaw-dropping, mind-blowing floor count!\",\n",
" 'name': 'Rollercoaster (125 floors in a day)',\n",
" 'shareImage640px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/386px/shareLocalized/en_US/badge_daily_floors125.png',\n",
" 'shareText': 'I climbed 125 flights of stairs and earned the Rollercoaster badge! #Fitbit',\n",
" 'shortDescription': '125 floors',\n",
" 'shortName': 'Rollercoaster',\n",
" 'timesAchieved': 2,\n",
" 'value': 125},\n",
" {'badgeGradientEndColor': 'FFDB01',\n",
" 'badgeGradientStartColor': 'D99123',\n",
" 'badgeType': 'LIFETIME_FLOORS',\n",
" 'category': 'Lifetime Climb',\n",
" 'cheers': [],\n",
" 'dateTime': '2022-04-30',\n",
" 'description': '4,000 lifetime floors',\n",
" 'earnedMessage': \"Yipee! You've earned the 747 badge!\",\n",
" 'encodedId': '228TKR',\n",
" 'image100px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/100px/badge_lifetime_floors4k.png',\n",
" 'image125px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/125px/badge_lifetime_floors4k.png',\n",
" 'image300px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/300px/badge_lifetime_floors4k.png',\n",
" 'image50px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/badge_lifetime_floors4k.png',\n",
" 'image75px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/75px/badge_lifetime_floors4k.png',\n",
" 'marketingDescription': \"By climbing 4000 lifetime floors, you've earned the 747 badge!\",\n",
" 'mobileDescription': 'Your lifetime badges are really taking flight, because you just jetsetted your way to another badge!',\n",
" 'name': '747 (4,000 lifetime floors)',\n",
" 'shareImage640px': 'https://www.gstatic.com/fitbit/badge/images/badges_new/386px/shareLocalized/en_US/badge_lifetime_floors4k.png',\n",
" 'shareText': 'I climbed 4,000 floors with my #Fitbit and earned the 747 badge.',\n",
" 'shortDescription': '4,000 floors',\n",
" 'shortName': '747',\n",
" 'timesAchieved': 1,\n",
" 'value': 4000}],\n",
" 'waterUnit': 'en_US',\n",
" 'waterUnitName': 'fl oz',\n",
" 'weight': 92.9,\n",
" 'weightUnit': 'en_US'}}"
]
},
"metadata": {},
"execution_count": 83
}
]
},
{
"cell_type": "markdown",
"source": [
"### 2.2.6 Refresh Tokens"
],
"metadata": {
"id": "BfkoT0OgID3C"
}
},
{
"cell_type": "markdown",
"source": [
"Tokens have a specified TTL (time to live) determined earlier by the `expires` parameter. Once that time is over, a new token must be issued."
],
"metadata": {
"id": "1hLBvQncIITZ"
}
},
{
"cell_type": "markdown",
"source": [
"# 3. Data extraction"
],
"metadata": {
"id": "ATcqnTjidMOm"
}
},
{
"cell_type": "markdown",
"source": [
"Now, we can extract data by calling the API using the `call_API()` function. A full list of data types and endpoints are available [here](https://dev.fitbit.com/build/reference/web-api/explore/).\n",
"\n",
"In brief, the categories are:\n",
"* [Activity](https://dev.fitbit.com/build/reference/web-api/activity/)\n",
"* [Activity Intraday Time Series](https://dev.fitbit.com/build/reference/web-api/activity/#get-activity-intraday-time-series)\n",
"* [Activity Time Series](https://dev.fitbit.com/build/reference/web-api/activity/#get-activity-intraday-time-series)\n",
"* [Body and Weight](https://dev.fitbit.com/build/reference/web-api/body/)\n",
"* [Body and Weight Time Series](https://dev.fitbit.com/build/reference/web-api/body/#body-time-series)\n",
"* [Devices](https://dev.fitbit.com/build/reference/web-api/devices/)\n",
"* [Food and Water](https://dev.fitbit.com/build/reference/web-api/nutrition/)\n",
"* [Food and Water Time Series](https://dev.fitbit.com/build/reference/web-api/nutrition/)\n",
"* [Friends](https://dev.fitbit.com/build/reference/web-api/friends/)\n",
"* [Heart Rate Intraday Time Series](https://dev.fitbit.com/build/reference/web-api/heartrate-timeseries/)\n",
"* [Heart Rate Time Series](https://dev.fitbit.com/build/reference/web-api/heartrate-timeseries/)\n",
"* [Sleep](https://dev.fitbit.com/build/reference/web-api/sleep/)\n",
"* [Subscriptions](https://dev.fitbit.com/build/reference/web-api/subscription/)\n",
"* [User](https://dev.fitbit.com/build/reference/web-api/user/)\n",
"\n",
"Authorization is a post only endpoint as demonstrated in previous sections (used to obtain access token).\n",
"* **POST-ONLY**: [Auth](https://dev.fitbit.com/build/reference/web-api/developer-guide/authorization/)"
],
"metadata": {
"id": "59zimQUjJzhM"
}
},
{
"cell_type": "code",
"source": [
"#@title Set up the start and end dates (YYYY-MM-DD)\n",
"start_date = \"2022-05-15\" #@param {type:\"string\"}\n",
"end_date = \"2022-05-25\" #@param {type:\"string\"}\n",
"\n",
"\n",
"# store arguments for some of the categories\n",
"categories = {\n",
" \"sleep\": {\n",
" \"url\": \"https://api.fitbit.com/1.2/user/-/sleep/date/\" + start_date + \"/\" + end_date + \".json\"},\n",
" \"steps\": {\n",
" \"url\": \"https://api.fitbit.com/1/user/-/activities/steps/date/\" + start_date + \"/\" + end_date + \".json\"},\n",
" \"minutesVeryActive\": {\n",
" \"url\": \"https://api.fitbit.com/1/user/-/activities/minutesVeryActive/date/\" + start_date + \"/\" + end_date + \".json\"},\n",
" \"minutesFairlyActive\": {\n",
" \"url\": \"https://api.fitbit.com/1/user/-/activities/minutesFairlyActive/date/\" + start_date + \"/\" + end_date + \".json\"},\n",
" \"minutesLightlyActive\": {\n",
" \"url\": \"https://api.fitbit.com/1/user/-/activities/minutesLightlyActive/date/\" + start_date + \"/\" + end_date + \".json\"},\n",
" \"distance\": {\n",
" \"url\": \"https://api.fitbit.com/1/user/-/activities/distance/date/\" + start_date + \"/\" + end_date + \".json\"},\n",
" \"minutesSedentary\": {\n",
" \"url\": \"https://api.fitbit.com/1/user/-/activities/minutesSedentary\t/date/\" + start_date + \"/\" + end_date + \".json\"},\n",
" }\n",
"\n",
"\n",
"# initialize empty dictionary to aggregate values\n",
"api_data = dict()\n",
"\n",
"# loop api calls for all categories\n",
"for category, values in categories.items():\n",
" response = call_API(\n",
" url=values[\"url\"],\n",
" access_token=variables[\"access_token\"]\n",
" )\n",
"\n",
" api_data[category] = [response]\n",
"\n",
"# initalize metadata with information for all api_data value keys\n",
"meta_api_data = {i:{j for j in api_data[i][0].keys()} for i in api_data.keys()}"
],
"metadata": {
"id": "Z4pu8EV8LyMI"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"meta_api_data"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "3i946EWsYRgC",
"outputId": "c4d11821-e529-46f3-f7d8-1c34c3b6a485"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{'sleep': {'sleep'},\n",
" 'steps': {'activities-steps'},\n",
" 'minutesVeryActive': {'activities-minutesVeryActive'},\n",
" 'minutesFairlyActive': {'activities-minutesFairlyActive'},\n",
" 'minutesLightlyActive': {'activities-minutesLightlyActive'},\n",
" 'distance': {'activities-distance'},\n",
" 'minutesSedentary': {'activities-minutesSedentary'}}"
]
},
"metadata": {},
"execution_count": 85
}
]
},
{
"cell_type": "code",
"source": [
"api_data"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "qq7WDBwxjUtA",
"outputId": "33e4d3a9-125b-43eb-d093-dd5889c0e3c0"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{'sleep': [{'sleep': [{'dateOfSleep': '2022-05-24',\n",
" 'duration': 25080000,\n",
" 'efficiency': 95,\n",
" 'endTime': '2022-05-24T07:27:00.000',\n",
" 'infoCode': 0,\n",
" 'isMainSleep': True,\n",
" 'levels': {'data': [{'dateTime': '2022-05-24T00:28:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 30},\n",
" {'dateTime': '2022-05-24T00:29:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 2400},\n",
" {'dateTime': '2022-05-24T01:09:00.000',\n",
" 'level': 'rem',\n",
" 'seconds': 1590},\n",
" {'dateTime': '2022-05-24T01:35:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 4500},\n",
" {'dateTime': '2022-05-24T02:50:30.000', 'level': 'rem', 'seconds': 540},\n",
" {'dateTime': '2022-05-24T02:59:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 420},\n",
" {'dateTime': '2022-05-24T03:06:30.000', 'level': 'rem', 'seconds': 300},\n",
" {'dateTime': '2022-05-24T03:11:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 2970},\n",
" {'dateTime': '2022-05-24T04:01:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 210},\n",
" {'dateTime': '2022-05-24T04:04:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 3930},\n",
" {'dateTime': '2022-05-24T05:10:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 1350},\n",
" {'dateTime': '2022-05-24T05:32:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 30},\n",
" {'dateTime': '2022-05-24T05:33:00.000', 'level': 'rem', 'seconds': 420},\n",
" {'dateTime': '2022-05-24T05:40:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 1110},\n",
" {'dateTime': '2022-05-24T05:58:30.000', 'level': 'rem', 'seconds': 270},\n",
" {'dateTime': '2022-05-24T06:03:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 690},\n",
" {'dateTime': '2022-05-24T06:14:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 270},\n",
" {'dateTime': '2022-05-24T06:19:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 540},\n",
" {'dateTime': '2022-05-24T06:28:00.000',\n",
" 'level': 'deep',\n",
" 'seconds': 1080},\n",
" {'dateTime': '2022-05-24T06:46:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 330},\n",
" {'dateTime': '2022-05-24T06:51:30.000', 'level': 'rem', 'seconds': 690},\n",
" {'dateTime': '2022-05-24T07:03:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 330},\n",
" {'dateTime': '2022-05-24T07:08:30.000', 'level': 'rem', 'seconds': 750},\n",
" {'dateTime': '2022-05-24T07:21:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 360}],\n",
" 'shortData': [{'dateTime': '2022-05-24T01:08:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 30},\n",
" {'dateTime': '2022-05-24T01:34:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-24T01:36:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-24T01:42:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-24T01:45:30.000', 'level': 'wake', 'seconds': 90},\n",
" {'dateTime': '2022-05-24T02:08:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 180},\n",
" {'dateTime': '2022-05-24T02:19:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 180},\n",
" {'dateTime': '2022-05-24T02:24:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-24T02:39:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-24T02:44:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 120},\n",
" {'dateTime': '2022-05-24T02:49:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-24T03:11:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150},\n",
" {'dateTime': '2022-05-24T03:38:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-24T03:40:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-24T03:43:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-24T04:08:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-24T04:19:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-24T04:26:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-24T04:36:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-24T04:48:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-24T04:56:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-24T05:00:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-24T05:40:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-24T06:44:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 120},\n",
" {'dateTime': '2022-05-24T06:47:30.000', 'level': 'wake', 'seconds': 90},\n",
" {'dateTime': '2022-05-24T07:02:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 30}],\n",
" 'summary': {'deep': {'count': 2,\n",
" 'minutes': 20,\n",
" 'thirtyDayAvgMinutes': 52},\n",
" 'light': {'count': 32, 'minutes': 261, 'thirtyDayAvgMinutes': 265},\n",
" 'rem': {'count': 8, 'minutes': 75, 'thirtyDayAvgMinutes': 56},\n",
" 'wake': {'count': 30, 'minutes': 62, 'thirtyDayAvgMinutes': 54}}},\n",
" 'logId': 37012135078,\n",
" 'logType': 'auto_detected',\n",
" 'minutesAfterWakeup': 3,\n",
" 'minutesAsleep': 356,\n",
" 'minutesAwake': 62,\n",
" 'minutesToFallAsleep': 0,\n",
" 'startTime': '2022-05-24T00:28:30.000',\n",
" 'timeInBed': 418,\n",
" 'type': 'stages'},\n",
" {'dateOfSleep': '2022-05-23',\n",
" 'duration': 23520000,\n",
" 'efficiency': 99,\n",
" 'endTime': '2022-05-23T06:33:00.000',\n",
" 'infoCode': 0,\n",
" 'isMainSleep': True,\n",
" 'levels': {'data': [{'dateTime': '2022-05-23T00:00:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 30},\n",
" {'dateTime': '2022-05-23T00:01:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 1260},\n",
" {'dateTime': '2022-05-23T00:22:00.000',\n",
" 'level': 'deep',\n",
" 'seconds': 270},\n",
" {'dateTime': '2022-05-23T00:26:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 1920},\n",
" {'dateTime': '2022-05-23T00:58:30.000', 'level': 'rem', 'seconds': 450},\n",
" {'dateTime': '2022-05-23T01:06:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 1140},\n",
" {'dateTime': '2022-05-23T01:25:00.000', 'level': 'rem', 'seconds': 840},\n",
" {'dateTime': '2022-05-23T01:39:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 1470},\n",
" {'dateTime': '2022-05-23T02:03:30.000', 'level': 'rem', 'seconds': 270},\n",
" {'dateTime': '2022-05-23T02:08:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 6510},\n",
" {'dateTime': '2022-05-23T03:56:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 540},\n",
" {'dateTime': '2022-05-23T04:05:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 210},\n",
" {'dateTime': '2022-05-23T04:09:00.000',\n",
" 'level': 'deep',\n",
" 'seconds': 2220},\n",
" {'dateTime': '2022-05-23T04:46:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 2100},\n",
" {'dateTime': '2022-05-23T05:21:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 300},\n",
" {'dateTime': '2022-05-23T05:26:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 570},\n",
" {'dateTime': '2022-05-23T05:35:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 510},\n",
" {'dateTime': '2022-05-23T05:44:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 960},\n",
" {'dateTime': '2022-05-23T06:00:00.000',\n",
" 'level': 'deep',\n",
" 'seconds': 1980}],\n",
" 'shortData': [{'dateTime': '2022-05-23T00:00:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 30},\n",
" {'dateTime': '2022-05-23T00:03:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T00:06:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T00:10:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T01:36:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150},\n",
" {'dateTime': '2022-05-23T01:41:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T01:59:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T02:08:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T02:13:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T02:20:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 120},\n",
" {'dateTime': '2022-05-23T02:29:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-23T02:37:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T02:51:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T02:53:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T03:00:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 120},\n",
" {'dateTime': '2022-05-23T03:12:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T03:20:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T03:35:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T04:45:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-23T04:48:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T04:50:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T05:13:30.000', 'level': 'wake', 'seconds': 90},\n",
" {'dateTime': '2022-05-23T05:17:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-23T05:56:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150}],\n",
" 'summary': {'deep': {'count': 3,\n",
" 'minutes': 74,\n",
" 'thirtyDayAvgMinutes': 49},\n",
" 'light': {'count': 29, 'minutes': 252, 'thirtyDayAvgMinutes': 267},\n",
" 'rem': {'count': 3, 'minutes': 23, 'thirtyDayAvgMinutes': 61},\n",
" 'wake': {'count': 27, 'minutes': 43, 'thirtyDayAvgMinutes': 55}}},\n",
" 'logId': 36997343818,\n",
" 'logType': 'auto_detected',\n",
" 'minutesAfterWakeup': 0,\n",
" 'minutesAsleep': 349,\n",
" 'minutesAwake': 43,\n",
" 'minutesToFallAsleep': 0,\n",
" 'startTime': '2022-05-23T00:00:30.000',\n",
" 'timeInBed': 392,\n",
" 'type': 'stages'},\n",
" {'dateOfSleep': '2022-05-22',\n",
" 'duration': 26520000,\n",
" 'efficiency': 96,\n",
" 'endTime': '2022-05-22T06:55:30.000',\n",
" 'infoCode': 0,\n",
" 'isMainSleep': True,\n",
" 'levels': {'data': [{'dateTime': '2022-05-21T23:33:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 270},\n",
" {'dateTime': '2022-05-21T23:38:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 720},\n",
" {'dateTime': '2022-05-21T23:50:00.000',\n",
" 'level': 'deep',\n",
" 'seconds': 1410},\n",
" {'dateTime': '2022-05-22T00:13:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 570},\n",
" {'dateTime': '2022-05-22T00:23:00.000', 'level': 'rem', 'seconds': 540},\n",
" {'dateTime': '2022-05-22T00:32:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 570},\n",
" {'dateTime': '2022-05-22T00:41:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 3390},\n",
" {'dateTime': '2022-05-22T01:38:00.000', 'level': 'rem', 'seconds': 360},\n",
" {'dateTime': '2022-05-22T01:44:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 210},\n",
" {'dateTime': '2022-05-22T01:47:30.000', 'level': 'rem', 'seconds': 450},\n",
" {'dateTime': '2022-05-22T01:55:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 270},\n",
" {'dateTime': '2022-05-22T01:59:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 1170},\n",
" {'dateTime': '2022-05-22T02:19:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 2190},\n",
" {'dateTime': '2022-05-22T02:55:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 330},\n",
" {'dateTime': '2022-05-22T03:01:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 2430},\n",
" {'dateTime': '2022-05-22T03:41:30.000', 'level': 'rem', 'seconds': 270},\n",
" {'dateTime': '2022-05-22T03:46:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 360},\n",
" {'dateTime': '2022-05-22T03:52:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 480},\n",
" {'dateTime': '2022-05-22T04:00:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 2880},\n",
" {'dateTime': '2022-05-22T04:48:00.000', 'level': 'rem', 'seconds': 300},\n",
" {'dateTime': '2022-05-22T04:53:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 480},\n",
" {'dateTime': '2022-05-22T05:01:00.000',\n",
" 'level': 'rem',\n",
" 'seconds': 1170},\n",
" {'dateTime': '2022-05-22T05:20:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 840},\n",
" {'dateTime': '2022-05-22T05:34:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 330},\n",
" {'dateTime': '2022-05-22T05:40:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 3930},\n",
" {'dateTime': '2022-05-22T06:45:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 600}],\n",
" 'shortData': [{'dateTime': '2022-05-22T00:13:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 30},\n",
" {'dateTime': '2022-05-22T00:17:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-22T00:48:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 180},\n",
" {'dateTime': '2022-05-22T00:56:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-22T01:15:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150},\n",
" {'dateTime': '2022-05-22T01:20:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-22T01:29:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-22T02:18:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-22T02:21:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-22T02:28:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-22T02:31:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-22T02:35:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-22T03:16:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-22T03:22:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-22T03:25:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-22T03:34:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-22T03:38:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-22T04:14:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-22T04:31:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-22T04:38:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-22T05:06:00.000', 'level': 'wake', 'seconds': 90},\n",
" {'dateTime': '2022-05-22T06:03:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-22T06:13:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-22T06:17:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 30}],\n",
" 'summary': {'deep': {'count': 3,\n",
" 'minutes': 48,\n",
" 'thirtyDayAvgMinutes': 49},\n",
" 'light': {'count': 33, 'minutes': 286, 'thirtyDayAvgMinutes': 264},\n",
" 'rem': {'count': 7, 'minutes': 50, 'thirtyDayAvgMinutes': 63},\n",
" 'wake': {'count': 29, 'minutes': 58, 'thirtyDayAvgMinutes': 55}}},\n",
" 'logId': 36986231531,\n",
" 'logType': 'auto_detected',\n",
" 'minutesAfterWakeup': 0,\n",
" 'minutesAsleep': 384,\n",
" 'minutesAwake': 58,\n",
" 'minutesToFallAsleep': 0,\n",
" 'startTime': '2022-05-21T23:33:30.000',\n",
" 'timeInBed': 442,\n",
" 'type': 'stages'},\n",
" {'dateOfSleep': '2022-05-21',\n",
" 'duration': 22440000,\n",
" 'efficiency': 99,\n",
" 'endTime': '2022-05-21T08:17:00.000',\n",
" 'infoCode': 3,\n",
" 'isMainSleep': True,\n",
" 'levels': {'data': [{'dateTime': '2022-05-21T02:03:00.000',\n",
" 'level': 'asleep',\n",
" 'seconds': 1200},\n",
" {'dateTime': '2022-05-21T02:23:00.000',\n",
" 'level': 'restless',\n",
" 'seconds': 180},\n",
" {'dateTime': '2022-05-21T02:26:00.000',\n",
" 'level': 'asleep',\n",
" 'seconds': 16920},\n",
" {'dateTime': '2022-05-21T07:08:00.000',\n",
" 'level': 'restless',\n",
" 'seconds': 60},\n",
" {'dateTime': '2022-05-21T07:09:00.000',\n",
" 'level': 'asleep',\n",
" 'seconds': 1440},\n",
" {'dateTime': '2022-05-21T07:33:00.000',\n",
" 'level': 'restless',\n",
" 'seconds': 60},\n",
" {'dateTime': '2022-05-21T07:34:00.000',\n",
" 'level': 'asleep',\n",
" 'seconds': 2520},\n",
" {'dateTime': '2022-05-21T08:16:00.000',\n",
" 'level': 'restless',\n",
" 'seconds': 60}],\n",
" 'summary': {'asleep': {'count': 0, 'minutes': 368},\n",
" 'awake': {'count': 0, 'minutes': 0},\n",
" 'restless': {'count': 4, 'minutes': 6}}},\n",
" 'logId': 36974957200,\n",
" 'logType': 'auto_detected',\n",
" 'minutesAfterWakeup': 1,\n",
" 'minutesAsleep': 368,\n",
" 'minutesAwake': 5,\n",
" 'minutesToFallAsleep': 0,\n",
" 'startTime': '2022-05-21T02:03:00.000',\n",
" 'timeInBed': 374,\n",
" 'type': 'classic'},\n",
" {'dateOfSleep': '2022-05-20',\n",
" 'duration': 26340000,\n",
" 'efficiency': 99,\n",
" 'endTime': '2022-05-20T06:59:00.000',\n",
" 'infoCode': 0,\n",
" 'isMainSleep': True,\n",
" 'levels': {'data': [{'dateTime': '2022-05-19T23:39:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 60},\n",
" {'dateTime': '2022-05-19T23:40:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 2700},\n",
" {'dateTime': '2022-05-20T00:25:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 330},\n",
" {'dateTime': '2022-05-20T00:31:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 2250},\n",
" {'dateTime': '2022-05-20T01:08:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 210},\n",
" {'dateTime': '2022-05-20T01:12:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 1440},\n",
" {'dateTime': '2022-05-20T01:36:00.000', 'level': 'rem', 'seconds': 300},\n",
" {'dateTime': '2022-05-20T01:41:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 1170},\n",
" {'dateTime': '2022-05-20T02:00:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 390},\n",
" {'dateTime': '2022-05-20T02:07:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 1290},\n",
" {'dateTime': '2022-05-20T02:28:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 330},\n",
" {'dateTime': '2022-05-20T02:34:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 3690},\n",
" {'dateTime': '2022-05-20T03:35:30.000', 'level': 'rem', 'seconds': 930},\n",
" {'dateTime': '2022-05-20T03:51:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 480},\n",
" {'dateTime': '2022-05-20T03:59:00.000',\n",
" 'level': 'rem',\n",
" 'seconds': 1080},\n",
" {'dateTime': '2022-05-20T04:17:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 2040},\n",
" {'dateTime': '2022-05-20T04:51:00.000',\n",
" 'level': 'deep',\n",
" 'seconds': 2010},\n",
" {'dateTime': '2022-05-20T05:24:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 270},\n",
" {'dateTime': '2022-05-20T05:29:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 1710},\n",
" {'dateTime': '2022-05-20T05:57:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 420},\n",
" {'dateTime': '2022-05-20T06:04:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 510},\n",
" {'dateTime': '2022-05-20T06:13:00.000', 'level': 'rem', 'seconds': 540},\n",
" {'dateTime': '2022-05-20T06:22:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 1320},\n",
" {'dateTime': '2022-05-20T06:44:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 510},\n",
" {'dateTime': '2022-05-20T06:52:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 180},\n",
" {'dateTime': '2022-05-20T06:55:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 210}],\n",
" 'shortData': [{'dateTime': '2022-05-19T23:39:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 60},\n",
" {'dateTime': '2022-05-19T23:59:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150},\n",
" {'dateTime': '2022-05-20T00:31:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-20T00:40:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-20T02:36:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-20T02:38:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-20T02:40:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-20T02:53:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-20T03:04:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-20T03:10:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-20T03:26:00.000', 'level': 'wake', 'seconds': 90},\n",
" {'dateTime': '2022-05-20T04:16:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-20T04:30:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-20T05:42:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-20T06:24:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-20T06:38:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 30}],\n",
" 'summary': {'deep': {'count': 3,\n",
" 'minutes': 45,\n",
" 'thirtyDayAvgMinutes': 50},\n",
" 'light': {'count': 25, 'minutes': 301, 'thirtyDayAvgMinutes': 257},\n",
" 'rem': {'count': 4, 'minutes': 46, 'thirtyDayAvgMinutes': 66},\n",
" 'wake': {'count': 22, 'minutes': 47, 'thirtyDayAvgMinutes': 57}}},\n",
" 'logId': 36962644425,\n",
" 'logType': 'auto_detected',\n",
" 'minutesAfterWakeup': 0,\n",
" 'minutesAsleep': 392,\n",
" 'minutesAwake': 47,\n",
" 'minutesToFallAsleep': 0,\n",
" 'startTime': '2022-05-19T23:39:30.000',\n",
" 'timeInBed': 439,\n",
" 'type': 'stages'},\n",
" {'dateOfSleep': '2022-05-19',\n",
" 'duration': 4500000,\n",
" 'efficiency': 90,\n",
" 'endTime': '2022-05-19T18:16:00.000',\n",
" 'infoCode': 2,\n",
" 'isMainSleep': False,\n",
" 'levels': {'data': [{'dateTime': '2022-05-19T17:01:00.000',\n",
" 'level': 'awake',\n",
" 'seconds': 60},\n",
" {'dateTime': '2022-05-19T17:02:00.000',\n",
" 'level': 'restless',\n",
" 'seconds': 60},\n",
" {'dateTime': '2022-05-19T17:03:00.000',\n",
" 'level': 'asleep',\n",
" 'seconds': 720},\n",
" {'dateTime': '2022-05-19T17:15:00.000',\n",
" 'level': 'restless',\n",
" 'seconds': 60},\n",
" {'dateTime': '2022-05-19T17:16:00.000',\n",
" 'level': 'asleep',\n",
" 'seconds': 2040},\n",
" {'dateTime': '2022-05-19T17:50:00.000',\n",
" 'level': 'restless',\n",
" 'seconds': 240},\n",
" {'dateTime': '2022-05-19T17:54:00.000',\n",
" 'level': 'asleep',\n",
" 'seconds': 840},\n",
" {'dateTime': '2022-05-19T18:08:00.000',\n",
" 'level': 'restless',\n",
" 'seconds': 480}],\n",
" 'summary': {'asleep': {'count': 0, 'minutes': 60},\n",
" 'awake': {'count': 1, 'minutes': 1},\n",
" 'restless': {'count': 4, 'minutes': 14}}},\n",
" 'logId': 36952035144,\n",
" 'logType': 'auto_detected',\n",
" 'minutesAfterWakeup': 8,\n",
" 'minutesAsleep': 60,\n",
" 'minutesAwake': 7,\n",
" 'minutesToFallAsleep': 0,\n",
" 'startTime': '2022-05-19T17:01:00.000',\n",
" 'timeInBed': 75,\n",
" 'type': 'classic'},\n",
" {'dateOfSleep': '2022-05-19',\n",
" 'duration': 20460000,\n",
" 'efficiency': 97,\n",
" 'endTime': '2022-05-19T05:50:30.000',\n",
" 'infoCode': 0,\n",
" 'isMainSleep': True,\n",
" 'levels': {'data': [{'dateTime': '2022-05-19T00:09:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 540},\n",
" {'dateTime': '2022-05-19T00:18:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 2910},\n",
" {'dateTime': '2022-05-19T01:07:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 780},\n",
" {'dateTime': '2022-05-19T01:20:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 420},\n",
" {'dateTime': '2022-05-19T01:27:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 600},\n",
" {'dateTime': '2022-05-19T01:37:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 3270},\n",
" {'dateTime': '2022-05-19T02:31:30.000', 'level': 'rem', 'seconds': 510},\n",
" {'dateTime': '2022-05-19T02:40:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 30},\n",
" {'dateTime': '2022-05-19T02:40:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 540},\n",
" {'dateTime': '2022-05-19T02:49:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 300},\n",
" {'dateTime': '2022-05-19T02:54:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 510},\n",
" {'dateTime': '2022-05-19T03:03:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 2730},\n",
" {'dateTime': '2022-05-19T03:48:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 210},\n",
" {'dateTime': '2022-05-19T03:52:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 900},\n",
" {'dateTime': '2022-05-19T04:07:00.000', 'level': 'rem', 'seconds': 330},\n",
" {'dateTime': '2022-05-19T04:12:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 1500},\n",
" {'dateTime': '2022-05-19T04:37:30.000',\n",
" 'level': 'rem',\n",
" 'seconds': 1740},\n",
" {'dateTime': '2022-05-19T05:06:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 1440},\n",
" {'dateTime': '2022-05-19T05:30:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 390},\n",
" {'dateTime': '2022-05-19T05:37:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 120},\n",
" {'dateTime': '2022-05-19T05:39:00.000', 'level': 'rem', 'seconds': 330},\n",
" {'dateTime': '2022-05-19T05:44:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 360}],\n",
" 'shortData': [{'dateTime': '2022-05-19T01:41:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 30},\n",
" {'dateTime': '2022-05-19T02:07:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-19T03:29:00.000', 'level': 'wake', 'seconds': 90},\n",
" {'dateTime': '2022-05-19T04:12:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-19T04:15:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-19T04:35:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-19T04:39:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-19T05:08:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-19T05:15:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-19T05:39:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 60}],\n",
" 'summary': {'deep': {'count': 1,\n",
" 'minutes': 48,\n",
" 'thirtyDayAvgMinutes': 50},\n",
" 'light': {'count': 17, 'minutes': 182, 'thirtyDayAvgMinutes': 276},\n",
" 'rem': {'count': 5, 'minutes': 47, 'thirtyDayAvgMinutes': 71},\n",
" 'wake': {'count': 17, 'minutes': 64, 'thirtyDayAvgMinutes': 55}}},\n",
" 'logId': 36948394201,\n",
" 'logType': 'auto_detected',\n",
" 'minutesAfterWakeup': 1,\n",
" 'minutesAsleep': 277,\n",
" 'minutesAwake': 64,\n",
" 'minutesToFallAsleep': 0,\n",
" 'startTime': '2022-05-19T00:09:30.000',\n",
" 'timeInBed': 341,\n",
" 'type': 'stages'},\n",
" {'dateOfSleep': '2022-05-18',\n",
" 'duration': 27480000,\n",
" 'efficiency': 96,\n",
" 'endTime': '2022-05-18T07:36:00.000',\n",
" 'infoCode': 0,\n",
" 'isMainSleep': True,\n",
" 'levels': {'data': [{'dateTime': '2022-05-17T23:57:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 180},\n",
" {'dateTime': '2022-05-18T00:00:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 930},\n",
" {'dateTime': '2022-05-18T00:16:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 1350},\n",
" {'dateTime': '2022-05-18T00:38:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 270},\n",
" {'dateTime': '2022-05-18T00:43:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 330},\n",
" {'dateTime': '2022-05-18T00:48:30.000', 'level': 'rem', 'seconds': 270},\n",
" {'dateTime': '2022-05-18T00:53:00.000',\n",
" 'level': 'deep',\n",
" 'seconds': 330},\n",
" {'dateTime': '2022-05-18T00:58:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 5970},\n",
" {'dateTime': '2022-05-18T02:38:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 210},\n",
" {'dateTime': '2022-05-18T02:41:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 3870},\n",
" {'dateTime': '2022-05-18T03:46:00.000', 'level': 'rem', 'seconds': 270},\n",
" {'dateTime': '2022-05-18T03:50:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 1230},\n",
" {'dateTime': '2022-05-18T04:11:00.000', 'level': 'rem', 'seconds': 330},\n",
" {'dateTime': '2022-05-18T04:16:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 4800},\n",
" {'dateTime': '2022-05-18T05:36:30.000', 'level': 'rem', 'seconds': 960},\n",
" {'dateTime': '2022-05-18T05:52:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 90},\n",
" {'dateTime': '2022-05-18T05:54:00.000',\n",
" 'level': 'deep',\n",
" 'seconds': 540},\n",
" {'dateTime': '2022-05-18T06:03:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 630},\n",
" {'dateTime': '2022-05-18T06:13:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 300},\n",
" {'dateTime': '2022-05-18T06:18:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 90},\n",
" {'dateTime': '2022-05-18T06:20:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 450},\n",
" {'dateTime': '2022-05-18T06:27:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 1320},\n",
" {'dateTime': '2022-05-18T06:49:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 1290},\n",
" {'dateTime': '2022-05-18T07:11:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 570},\n",
" {'dateTime': '2022-05-18T07:20:30.000', 'level': 'rem', 'seconds': 330},\n",
" {'dateTime': '2022-05-18T07:26:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 600}],\n",
" 'shortData': [{'dateTime': '2022-05-17T23:58:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 30},\n",
" {'dateTime': '2022-05-18T00:59:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 120},\n",
" {'dateTime': '2022-05-18T01:04:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T01:17:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T01:50:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T01:53:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150},\n",
" {'dateTime': '2022-05-18T02:12:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-18T02:20:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T02:49:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150},\n",
" {'dateTime': '2022-05-18T02:57:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-18T03:20:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T03:22:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T03:27:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T03:54:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-18T04:16:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150},\n",
" {'dateTime': '2022-05-18T04:32:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T04:38:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T04:43:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T04:58:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T05:02:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-18T05:06:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-18T05:18:00.000', 'level': 'wake', 'seconds': 90},\n",
" {'dateTime': '2022-05-18T05:23:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-18T05:32:30.000', 'level': 'wake', 'seconds': 90},\n",
" {'dateTime': '2022-05-18T05:44:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T06:07:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-18T06:37:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T07:10:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-18T07:13:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-18T07:26:00.000', 'level': 'wake', 'seconds': 90},\n",
" {'dateTime': '2022-05-18T07:35:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 30}],\n",
" 'summary': {'deep': {'count': 5,\n",
" 'minutes': 45,\n",
" 'thirtyDayAvgMinutes': 52},\n",
" 'light': {'count': 39, 'minutes': 322, 'thirtyDayAvgMinutes': 260},\n",
" 'rem': {'count': 6, 'minutes': 35, 'thirtyDayAvgMinutes': 83},\n",
" 'wake': {'count': 34, 'minutes': 56, 'thirtyDayAvgMinutes': 54}}},\n",
" 'logId': 36934687631,\n",
" 'logType': 'auto_detected',\n",
" 'minutesAfterWakeup': 0,\n",
" 'minutesAsleep': 402,\n",
" 'minutesAwake': 56,\n",
" 'minutesToFallAsleep': 0,\n",
" 'startTime': '2022-05-17T23:57:30.000',\n",
" 'timeInBed': 458,\n",
" 'type': 'stages'},\n",
" {'dateOfSleep': '2022-05-17',\n",
" 'duration': 25560000,\n",
" 'efficiency': 97,\n",
" 'endTime': '2022-05-17T07:24:30.000',\n",
" 'infoCode': 0,\n",
" 'isMainSleep': True,\n",
" 'levels': {'data': [{'dateTime': '2022-05-17T00:18:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 1470},\n",
" {'dateTime': '2022-05-17T00:43:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 810},\n",
" {'dateTime': '2022-05-17T00:56:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 1410},\n",
" {'dateTime': '2022-05-17T01:20:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 120},\n",
" {'dateTime': '2022-05-17T01:22:00.000',\n",
" 'level': 'rem',\n",
" 'seconds': 2640},\n",
" {'dateTime': '2022-05-17T02:06:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 840},\n",
" {'dateTime': '2022-05-17T02:20:00.000',\n",
" 'level': 'deep',\n",
" 'seconds': 1800},\n",
" {'dateTime': '2022-05-17T02:50:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 6750},\n",
" {'dateTime': '2022-05-17T04:42:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 240},\n",
" {'dateTime': '2022-05-17T04:46:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 30},\n",
" {'dateTime': '2022-05-17T04:47:00.000', 'level': 'rem', 'seconds': 540},\n",
" {'dateTime': '2022-05-17T04:56:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 2580},\n",
" {'dateTime': '2022-05-17T05:39:00.000', 'level': 'rem', 'seconds': 480},\n",
" {'dateTime': '2022-05-17T05:47:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 360},\n",
" {'dateTime': '2022-05-17T05:53:00.000',\n",
" 'level': 'rem',\n",
" 'seconds': 1140},\n",
" {'dateTime': '2022-05-17T06:12:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 540},\n",
" {'dateTime': '2022-05-17T06:21:00.000',\n",
" 'level': 'rem',\n",
" 'seconds': 1050},\n",
" {'dateTime': '2022-05-17T06:38:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 2160},\n",
" {'dateTime': '2022-05-17T07:14:30.000', 'level': 'rem', 'seconds': 510},\n",
" {'dateTime': '2022-05-17T07:23:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 90}],\n",
" 'shortData': [{'dateTime': '2022-05-17T01:18:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 120},\n",
" {'dateTime': '2022-05-17T02:49:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-17T03:09:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-17T03:13:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150},\n",
" {'dateTime': '2022-05-17T03:48:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-17T03:52:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-17T03:54:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150},\n",
" {'dateTime': '2022-05-17T04:14:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-17T04:24:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150},\n",
" {'dateTime': '2022-05-17T04:30:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-17T05:00:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-17T05:05:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150},\n",
" {'dateTime': '2022-05-17T05:09:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-17T05:49:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-17T06:03:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-17T06:09:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150},\n",
" {'dateTime': '2022-05-17T06:48:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-17T06:50:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-17T06:54:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-17T06:59:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 150}],\n",
" 'summary': {'deep': {'count': 2,\n",
" 'minutes': 51,\n",
" 'thirtyDayAvgMinutes': 53},\n",
" 'light': {'count': 26, 'minutes': 217, 'thirtyDayAvgMinutes': 282},\n",
" 'rem': {'count': 7, 'minutes': 103, 'thirtyDayAvgMinutes': 74},\n",
" 'wake': {'count': 22, 'minutes': 55, 'thirtyDayAvgMinutes': 54}}},\n",
" 'logId': 36920846728,\n",
" 'logType': 'auto_detected',\n",
" 'minutesAfterWakeup': 0,\n",
" 'minutesAsleep': 371,\n",
" 'minutesAwake': 55,\n",
" 'minutesToFallAsleep': 0,\n",
" 'startTime': '2022-05-17T00:18:30.000',\n",
" 'timeInBed': 426,\n",
" 'type': 'stages'},\n",
" {'dateOfSleep': '2022-05-16',\n",
" 'duration': 28560000,\n",
" 'efficiency': 99,\n",
" 'endTime': '2022-05-16T07:59:30.000',\n",
" 'infoCode': 0,\n",
" 'isMainSleep': True,\n",
" 'levels': {'data': [{'dateTime': '2022-05-16T00:03:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 1170},\n",
" {'dateTime': '2022-05-16T00:23:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 420},\n",
" {'dateTime': '2022-05-16T00:30:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 420},\n",
" {'dateTime': '2022-05-16T00:37:00.000', 'level': 'rem', 'seconds': 480},\n",
" {'dateTime': '2022-05-16T00:45:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 600},\n",
" {'dateTime': '2022-05-16T00:55:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 990},\n",
" {'dateTime': '2022-05-16T01:11:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 1020},\n",
" {'dateTime': '2022-05-16T01:28:30.000',\n",
" 'level': 'rem',\n",
" 'seconds': 1260},\n",
" {'dateTime': '2022-05-16T01:49:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 330},\n",
" {'dateTime': '2022-05-16T01:55:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 3720},\n",
" {'dateTime': '2022-05-16T02:57:00.000', 'level': 'rem', 'seconds': 420},\n",
" {'dateTime': '2022-05-16T03:04:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 210},\n",
" {'dateTime': '2022-05-16T03:07:30.000', 'level': 'rem', 'seconds': 840},\n",
" {'dateTime': '2022-05-16T03:21:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 3480},\n",
" {'dateTime': '2022-05-16T04:19:30.000',\n",
" 'level': 'rem',\n",
" 'seconds': 1800},\n",
" {'dateTime': '2022-05-16T04:49:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 1500},\n",
" {'dateTime': '2022-05-16T05:14:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 720},\n",
" {'dateTime': '2022-05-16T05:26:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 2190},\n",
" {'dateTime': '2022-05-16T06:03:00.000', 'level': 'rem', 'seconds': 450},\n",
" {'dateTime': '2022-05-16T06:10:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 450},\n",
" {'dateTime': '2022-05-16T06:18:00.000', 'level': 'rem', 'seconds': 360},\n",
" {'dateTime': '2022-05-16T06:24:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 960},\n",
" {'dateTime': '2022-05-16T06:40:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 210},\n",
" {'dateTime': '2022-05-16T06:43:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 4290},\n",
" {'dateTime': '2022-05-16T07:55:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 270}],\n",
" 'shortData': [{'dateTime': '2022-05-16T02:30:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 30},\n",
" {'dateTime': '2022-05-16T02:34:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T02:41:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T02:45:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T03:09:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T03:23:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T03:25:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T03:41:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T03:55:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T04:08:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-16T04:33:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T04:46:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T04:51:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T05:48:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T05:52:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T05:54:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-16T06:11:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T06:52:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T06:54:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-16T07:21:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 120},\n",
" {'dateTime': '2022-05-16T07:32:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 60}],\n",
" 'summary': {'deep': {'count': 2,\n",
" 'minutes': 29,\n",
" 'thirtyDayAvgMinutes': 76},\n",
" 'light': {'count': 28, 'minutes': 292, 'thirtyDayAvgMinutes': 271},\n",
" 'rem': {'count': 10, 'minutes': 92, 'thirtyDayAvgMinutes': 55},\n",
" 'wake': {'count': 27, 'minutes': 63, 'thirtyDayAvgMinutes': 45}}},\n",
" 'logId': 36908354898,\n",
" 'logType': 'auto_detected',\n",
" 'minutesAfterWakeup': 1,\n",
" 'minutesAsleep': 413,\n",
" 'minutesAwake': 63,\n",
" 'minutesToFallAsleep': 0,\n",
" 'startTime': '2022-05-16T00:03:30.000',\n",
" 'timeInBed': 476,\n",
" 'type': 'stages'},\n",
" {'dateOfSleep': '2022-05-15',\n",
" 'duration': 26820000,\n",
" 'efficiency': 96,\n",
" 'endTime': '2022-05-15T07:33:00.000',\n",
" 'infoCode': 0,\n",
" 'isMainSleep': True,\n",
" 'levels': {'data': [{'dateTime': '2022-05-15T00:05:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 30},\n",
" {'dateTime': '2022-05-15T00:06:00.000',\n",
" 'level': 'deep',\n",
" 'seconds': 1170},\n",
" {'dateTime': '2022-05-15T00:25:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 480},\n",
" {'dateTime': '2022-05-15T00:33:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 1080},\n",
" {'dateTime': '2022-05-15T00:51:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 480},\n",
" {'dateTime': '2022-05-15T00:59:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 1380},\n",
" {'dateTime': '2022-05-15T01:22:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 420},\n",
" {'dateTime': '2022-05-15T01:29:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 2460},\n",
" {'dateTime': '2022-05-15T02:10:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 270},\n",
" {'dateTime': '2022-05-15T02:15:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 5220},\n",
" {'dateTime': '2022-05-15T03:42:00.000',\n",
" 'level': 'deep',\n",
" 'seconds': 900},\n",
" {'dateTime': '2022-05-15T03:57:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 2760},\n",
" {'dateTime': '2022-05-15T04:43:00.000',\n",
" 'level': 'rem',\n",
" 'seconds': 2940},\n",
" {'dateTime': '2022-05-15T05:32:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 2340},\n",
" {'dateTime': '2022-05-15T06:11:00.000', 'level': 'rem', 'seconds': 480},\n",
" {'dateTime': '2022-05-15T06:19:00.000',\n",
" 'level': 'light',\n",
" 'seconds': 990},\n",
" {'dateTime': '2022-05-15T06:35:30.000',\n",
" 'level': 'deep',\n",
" 'seconds': 300},\n",
" {'dateTime': '2022-05-15T06:40:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 360},\n",
" {'dateTime': '2022-05-15T06:46:30.000',\n",
" 'level': 'light',\n",
" 'seconds': 2520},\n",
" {'dateTime': '2022-05-15T07:28:30.000',\n",
" 'level': 'wake',\n",
" 'seconds': 270}],\n",
" 'shortData': [{'dateTime': '2022-05-15T00:50:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 90},\n",
" {'dateTime': '2022-05-15T00:57:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T01:48:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T01:52:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T01:54:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T01:57:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-15T02:00:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T02:08:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T02:35:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T03:01:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-15T03:17:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-15T03:56:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T04:07:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-15T04:29:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T04:37:00.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-15T04:40:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 120},\n",
" {'dateTime': '2022-05-15T05:11:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T05:23:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T05:27:00.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T05:32:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T06:05:00.000', 'level': 'wake', 'seconds': 90},\n",
" {'dateTime': '2022-05-15T07:00:30.000', 'level': 'wake', 'seconds': 60},\n",
" {'dateTime': '2022-05-15T07:04:30.000', 'level': 'wake', 'seconds': 30},\n",
" {'dateTime': '2022-05-15T07:15:00.000',\n",
" 'level': 'wake',\n",
" 'seconds': 90}],\n",
" 'summary': {'deep': {'count': 5,\n",
" 'minutes': 76,\n",
" 'thirtyDayAvgMinutes': 0},\n",
" 'light': {'count': 27, 'minutes': 271, 'thirtyDayAvgMinutes': 0},\n",
" 'rem': {'count': 5, 'minutes': 55, 'thirtyDayAvgMinutes': 0},\n",
" 'wake': {'count': 29, 'minutes': 45, 'thirtyDayAvgMinutes': 0}}},\n",
" 'logId': 36894637024,\n",
" 'logType': 'auto_detected',\n",
" 'minutesAfterWakeup': 0,\n",
" 'minutesAsleep': 402,\n",
" 'minutesAwake': 45,\n",
" 'minutesToFallAsleep': 0,\n",
" 'startTime': '2022-05-15T00:05:30.000',\n",
" 'timeInBed': 447,\n",
" 'type': 'stages'}]}],\n",
" 'steps': [{'activities-steps': [{'dateTime': '2022-05-15', 'value': '11046'},\n",
" {'dateTime': '2022-05-16', 'value': '5001'},\n",
" {'dateTime': '2022-05-17', 'value': '7698'},\n",
" {'dateTime': '2022-05-18', 'value': '9509'},\n",
" {'dateTime': '2022-05-19', 'value': '6070'},\n",
" {'dateTime': '2022-05-20', 'value': '3250'},\n",
" {'dateTime': '2022-05-21', 'value': '8640'},\n",
" {'dateTime': '2022-05-22', 'value': '11846'},\n",
" {'dateTime': '2022-05-23', 'value': '7513'},\n",
" {'dateTime': '2022-05-24', 'value': '8833'},\n",
" {'dateTime': '2022-05-25', 'value': '0'}]}],\n",
" 'minutesVeryActive': [{'activities-minutesVeryActive': [{'dateTime': '2022-05-15',\n",
" 'value': '39'},\n",
" {'dateTime': '2022-05-16', 'value': '42'},\n",
" {'dateTime': '2022-05-17', 'value': '76'},\n",
" {'dateTime': '2022-05-18', 'value': '17'},\n",
" {'dateTime': '2022-05-19', 'value': '5'},\n",
" {'dateTime': '2022-05-20', 'value': '20'},\n",
" {'dateTime': '2022-05-21', 'value': '3'},\n",
" {'dateTime': '2022-05-22', 'value': '6'},\n",
" {'dateTime': '2022-05-23', 'value': '52'},\n",
" {'dateTime': '2022-05-24', 'value': '26'},\n",
" {'dateTime': '2022-05-25', 'value': '0'}]}],\n",
" 'minutesFairlyActive': [{'activities-minutesFairlyActive': [{'dateTime': '2022-05-15',\n",
" 'value': '234'},\n",
" {'dateTime': '2022-05-16', 'value': '20'},\n",
" {'dateTime': '2022-05-17', 'value': '31'},\n",
" {'dateTime': '2022-05-18', 'value': '226'},\n",
" {'dateTime': '2022-05-19', 'value': '187'},\n",
" {'dateTime': '2022-05-20', 'value': '311'},\n",
" {'dateTime': '2022-05-21', 'value': '255'},\n",
" {'dateTime': '2022-05-22', 'value': '235'},\n",
" {'dateTime': '2022-05-23', 'value': '39'},\n",
" {'dateTime': '2022-05-24', 'value': '57'},\n",
" {'dateTime': '2022-05-25', 'value': '0'}]}],\n",
" 'minutesLightlyActive': [{'activities-minutesLightlyActive': [{'dateTime': '2022-05-15',\n",
" 'value': '156'},\n",
" {'dateTime': '2022-05-16', 'value': '148'},\n",
" {'dateTime': '2022-05-17', 'value': '185'},\n",
" {'dateTime': '2022-05-18', 'value': '129'},\n",
" {'dateTime': '2022-05-19', 'value': '134'},\n",
" {'dateTime': '2022-05-20', 'value': '119'},\n",
" {'dateTime': '2022-05-21', 'value': '136'},\n",
" {'dateTime': '2022-05-22', 'value': '185'},\n",
" {'dateTime': '2022-05-23', 'value': '210'},\n",
" {'dateTime': '2022-05-24', 'value': '245'},\n",
" {'dateTime': '2022-05-25', 'value': '0'}]}],\n",
" 'distance': [{'activities-distance': [{'dateTime': '2022-05-15',\n",
" 'value': '7.59607'},\n",
" {'dateTime': '2022-05-16', 'value': '3.90482'},\n",
" {'dateTime': '2022-05-17', 'value': '6.077109999999999'},\n",
" {'dateTime': '2022-05-18', 'value': '5.67516'},\n",
" {'dateTime': '2022-05-19', 'value': '4.71543'},\n",
" {'dateTime': '2022-05-20', 'value': '2.5508599999999997'},\n",
" {'dateTime': '2022-05-21', 'value': '6.79878'},\n",
" {'dateTime': '2022-05-22', 'value': '8.044559999999999'},\n",
" {'dateTime': '2022-05-23', 'value': '5.9309899999999995'},\n",
" {'dateTime': '2022-05-24', 'value': '5.96207'},\n",
" {'dateTime': '2022-05-25', 'value': '0.0'}]}],\n",
" 'minutesSedentary': [{'activities-minutesSedentary': [{'dateTime': '2022-05-15',\n",
" 'value': '564'},\n",
" {'dateTime': '2022-05-16', 'value': '754'},\n",
" {'dateTime': '2022-05-17', 'value': '722'},\n",
" {'dateTime': '2022-05-18', 'value': '610'},\n",
" {'dateTime': '2022-05-19', 'value': '698'},\n",
" {'dateTime': '2022-05-20', 'value': '551'},\n",
" {'dateTime': '2022-05-21', 'value': '672'},\n",
" {'dateTime': '2022-05-22', 'value': '572'},\n",
" {'dateTime': '2022-05-23', 'value': '747'},\n",
" {'dateTime': '2022-05-24', 'value': '694'},\n",
" {'dateTime': '2022-05-25', 'value': '1440'}]}]}"
]
},
"metadata": {},
"execution_count": 86
}
]
},
{
"cell_type": "markdown",
"source": [
"# 4. Data visualization"
],
"metadata": {
"id": "lxnVVZvBy1pl"
}
},
{
"cell_type": "markdown",
"source": [
"## 4.1 Visualizing Non-Wear Days and Filtering The Data"
],
"metadata": {
"id": "-zKWQNaug2a_"
}
},
{
"cell_type": "markdown",
"source": [
"Here we are going to visualize what days data wasn't collected. Since the days in which data wasn't collected show \"zero\" values for the data, then filter this out to increase the accuracy of the analysis. This is because zero values will be consided data points in the analysis which will alter the results."
],
"metadata": {
"id": "Zqr9FMZJia94"
}
},
{
"cell_type": "code",
"source": [
"# First we are going to aggregate the data in arrays. We are taking distance as an example here\n",
"dates = []\n",
"distances = []\n",
"\n",
"for datapoint in api_data['distance'][0]['activities-distance']:\n",
" dates.append(datapoint['dateTime'])\n",
" distances.append(float(datapoint['value']))\n",
"\n",
"#Using a pandas dataframe to aggregate the data\n",
"d = {'Distance (km)': distances, 'Date': dates}\n",
"df = pd.DataFrame(data=d)\n",
"\n",
"#Creating the plot \n",
"sns.set_theme(style=\"dark\")\n",
"ax = sns.barplot(x=\"Distance (km)\", y=\"Date\", data=df, palette = 'Dark2_r' )\n"
],
"metadata": {
"id": "Hn4A5B66x2jd",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 339
},
"outputId": "08aa98fd-14ab-4cc1-caaf-b64bb8cd6a06"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": [
"From the graph you can see the day(s) which have the distance as zero. These are the non-wear days and now we are creating a simple function to filter them out. "
],
"metadata": {
"id": "zn2P56nRrBcb"
}
},
{
"cell_type": "code",
"source": [
"#since the data will consist of multiple arrays carrying multiple data points, \n",
"# we will create the function such that it gets the list of arrays as a parameter \n",
"# and the refrence index for the array to examine the data from\n",
"\n",
"def remove_non_wear(lst, refrence_index):\n",
" newlst = []\n",
" for i in range(len(lst)):\n",
" newlst.append([])\n",
"\n",
" for index in range(len(lst[refrence_index])):\n",
" if lst[refrence_index][index] != 0:\n",
" for array in lst:\n",
" newlst[lst.index(array)].append(array[index])\n",
" return newlst\n"
],
"metadata": {
"id": "1twxqWXLrSxZ"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"#Now let's test this\n",
"new_arrays = remove_non_wear([dates, distances], 1)\n",
"\n",
"#creating a new plot with the new data\n",
"dates = new_arrays[0]\n",
"distances = new_arrays[1]\n",
"\n",
"#Using a pandas dataframe to aggregate the data\n",
"d = {'Distance (km)': distances, 'Date': dates}\n",
"df = pd.DataFrame(data=d)\n",
"\n",
"#Creating the plot \n",
"sns.set_theme(style=\"dark\")\n",
"ax = sns.barplot(x=\"Distance (km)\", y=\"Date\", data=df, palette = 'Dark2')"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 339
},
"id": "GKXiwOPL9BJe",
"outputId": "46a54fe3-a5e2-4aca-d511-1bcbe0a3ff9f"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": [
"Looked like we could filter out the non-wear days!"
],
"metadata": {
"id": "ekLln_nH9FOS"
}
},
{
"cell_type": "markdown",
"source": [
"## 4.2 Visualizing Steps"
],
"metadata": {
"id": "UY2wE_vRm8u4"
}
},
{
"cell_type": "markdown",
"source": [
"Here we are going to try replicating this plot from the fitbit app. First, we gather the data in arrays, select the data for the desired days then we create a bar plot. Afterwards, we format the bar graph to like the original graph and place the labels.\n",
"\n",
""
],
"metadata": {
"id": "RN2aLJqlnB8Y"
}
},
{
"cell_type": "code",
"source": [
"# First gather the data in arrays\n",
"dates = []\n",
"steps = []\n",
"for datapoint in api_data['steps'][0]['activities-steps']:\n",
" dates.append(datapoint['dateTime'])\n",
" steps.append(float(datapoint['value']))\n",
"\n",
"# We need only 7 days' worth of data so we slice the arrays\n",
"dates = dates[0:7]\n",
"steps = steps[0:7]\n",
"\n",
"with plt.style.context('dark_background'):\n",
" #Creating the plot \n",
" fig,ax = plt.subplots()\n",
" fig.set_size_inches(3,5.5)\n",
" plt.bar(dates, steps, color = '#80a9ab', edgecolor = '#80a9ab')\n",
"\n",
" fig.patch.set_facecolor('#02575c')\n",
" plt.gca().set_facecolor('#02575c')\n",
"\n",
" #Adjusting the labels\n",
" thesteps = [0, 5000, 10000, 15000, 20000]\n",
" plt.yticks(ticks=thesteps, labels=['0', '5k', '10k','15k', '20k'])\n",
" plt.xticks(ticks=dates, labels=['S', 'M', 'T','W','T', 'F', 'S'])\n",
"\n",
" # removing the borders from four sides\n",
" plt.gca().spines['left'].set_visible(False)\n",
" plt.gca().spines['right'].set_visible(False)\n",
" plt.gca().spines['top'].set_visible(False)\n",
" plt.gca().spines['bottom'].set_visible(False)\n",
"\n",
" # adjust tick sizes\n",
" plt.tick_params(axis='x', labelsize=8)\n",
" plt.tick_params(axis='y', labelsize=8)\n",
"\n",
" #adding labels\n",
" average_steps = sum(steps) / len(steps)\n",
" plt.figtext(0.5,1.0, str(int(average_steps))[0] + ',' + str(int(average_steps))[1:4] + \" steps\", fontsize=14, ha='center', color ='w', fontweight = 'bold')\n",
" plt.figtext(0.5,0.96, 'Average May 15 - 21', fontsize=10, ha='center', color ='w', fontweight = 'light')\n",
"\n",
" # Creating a horizontal line at 10k steps\n",
" plt.axhline(y=10000, linewidth = 0.5)\n"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 407
},
"id": "u6mEoA6EqDor",
"outputId": "2ebdda69-2463-4480-a288-5817690f1148"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": [
"Now, it looks very similar to the original Plot!"
],
"metadata": {
"id": "4nAAuAnG7lSD"
}
},
{
"cell_type": "markdown",
"source": [
"## 4.3 Visualizing Sleep Stages"
],
"metadata": {
"id": "krXDlYEe7lBR"
}
},
{
"cell_type": "markdown",
"source": [
"Here we are trying to replicate the sleep stages visual from the fitbit app. It's very similar to the previous plot but with some extra edits, and adding the legend. Like the previous one, we are collecting 7 days' sleep data and plotting them in a bar graph.\n",
"\n",
""
],
"metadata": {
"id": "5mqGOT_w763K"
}
},
{
"cell_type": "code",
"source": [
"# first we collect the data in arrays\n",
"\n",
"asleep = []\n",
"dates_sleep = []\n",
"light = []\n",
"rem = []\n",
"deep = []\n",
"no_stages = []\n",
"\n",
"for datapoint in api_data['sleep'][0]['sleep']:\n",
" asleep.append(float(datapoint['minutesAsleep']))\n",
" dates_sleep.append(datapoint['dateOfSleep'])\n",
" if \"rem\" in datapoint['levels']['summary']:\n",
" rem.append(float(datapoint['levels']['summary']['rem']['minutes']))\n",
" else:\n",
" rem.append(0)\n",
" if \"light\" in datapoint['levels']['summary']:\n",
" light.append(float(datapoint['levels']['summary']['light']['minutes']))\n",
" else:\n",
" light.append(0)\n",
" if \"deep\" in datapoint['levels']['summary']:\n",
" deep.append(float(datapoint['levels']['summary']['deep']['minutes']))\n",
" else:\n",
" deep.append(0)\n",
"#fill the no_stages data\n",
"for i in range(len(asleep)):\n",
" no_stages.append(asleep[i]-(rem[i]+deep[i]+light[i]))\n",
"\n",
"#get the ordered dates from the steps data\n",
"dates = []\n",
"for datapoint in api_data['steps'][0]['activities-steps']:\n",
" dates.append(datapoint['dateTime'])\n",
"dates = dates[0:7]\n",
"\n",
"\n",
"#adjust the order of the dates and take the needed 7 days\n",
"# also we are adding major and minor sleep values which appear as different\n",
"#entries with the same date\n",
"\n",
"light_new = [0]*len(dates)\n",
"rem_new = [0]*len(dates)\n",
"deep_new = [0]*len(dates)\n",
"no_stages_new = [0]*len(dates)\n",
"asleep_new = [0]*len(dates)\n",
"\n",
"for i,entry in enumerate(dates):\n",
" for j, date in enumerate(dates_sleep):\n",
" if date == entry:\n",
" light_new[i] += light[j]\n",
" rem_new[i] += rem[j]\n",
" deep_new[i]+= deep[j]\n",
" no_stages_new[i] += no_stages[j]\n",
" asleep_new[i] += asleep[j]\n",
"\n",
"#Now plot the graph\n",
"colors = ['#81c4f9', '#418cff', '#184ba5', '#505071']\n",
"\n",
"bottom1 = []\n",
"for i in range(len(deep_new)):\n",
" bottom1.append(deep_new[i]+light_new[i])\n",
"\n",
"bottom2 = []\n",
"for i in range(len(deep_new)):\n",
" bottom2.append(rem_new[i]+bottom1[i])\n",
"\n",
"with plt.style.context('dark_background'):\n",
"\n",
" #adjust size\n",
" fig,ax = plt.subplots()\n",
" fig.set_size_inches(4,7)\n",
"\n",
"\n",
" plt.bar(dates, deep_new, color=colors[2], edgecolor = colors[2], width = 0.5)\n",
" plt.bar(dates, light_new, bottom = deep_new, color=colors[1], edgecolor = colors[1], width = 0.5)\n",
" plt.bar(dates, rem_new, bottom = bottom1, color=colors[0], edgecolor = colors[0], width = 0.5)\n",
" plt.bar(dates, no_stages_new, bottom = bottom2, color=colors[3], edgecolor = colors[3], width = 0.5)\n",
"\n",
"\n",
" #adjust colors\n",
" fig.patch.set_facecolor('#22204e')\n",
" plt.gca().set_facecolor('#22204e')\n",
"\n",
" #Adjusting the labels\n",
" thesteps = [0, 60, 2*60, 3*60, 4*60, 5*60, 6*60, 7*60, 8*60]\n",
" plt.yticks(ticks=thesteps, labels=['0m', '1h', '2h','3h', '4h', '5h', '6h', '7h', '8h'])\n",
" plt.xticks(ticks=dates, labels=['S', 'M', 'T','W','T', 'F', 'S'])\n",
"\n",
" # removing the borders from four sides\n",
" plt.gca().spines['left'].set_visible(False)\n",
" plt.gca().spines['right'].set_visible(False)\n",
" plt.gca().spines['top'].set_visible(False)\n",
" plt.gca().spines['bottom'].set_visible(False)\n",
"\n",
" # adjust tick sizes\n",
" plt.tick_params(axis='x', labelsize=8)\n",
" plt.tick_params(axis='y', labelsize=8)\n",
"\n",
" # Creating a horizontal line at 8h steps\n",
" plt.axhline(y=8*60, linewidth = 0.5)\n",
" \n",
" #add labels\n",
" average_sleep_time = sum(asleep_new) / len(asleep_new)\n",
" hours = int((average_sleep_time//60))\n",
" mins = int(int(average_sleep_time) - hours*60)\n",
" plt.figtext(0.5,1.0, str(hours) + ' hr ' + str(mins) + \" mins asleep\", fontsize=15, ha='center', color ='w', fontweight = 'bold')\n",
" plt.figtext(0.5,0.96, 'Average May 15 - 21', fontsize=10, ha='center', color ='w', fontweight = 'light')\n",
"\n",
"\n",
" # set legend below plot\n",
" plt.legend([\"\", \"REM\", \"Light\",\"Deep\",\"No Stages\"], loc='upper center', bbox_to_anchor=(0.4, 1.1),\n",
" fancybox=True, shadow=True, ncol=5, fontsize= 8, frameon=False, handlelength=0.9)\n",
" #set legen colors\n",
" ax = plt.gca()\n",
" leg = ax.get_legend()\n",
" leg.legendHandles[0].set_color('#22204e')\n",
" leg.legendHandles[1].set_color('#81c4f9')\n",
" leg.legendHandles[2].set_color('#418cff')\n",
" leg.legendHandles[3].set_color('#184ba5')\n",
" leg.legendHandles[4].set_color('#505071')\n",
"\n",
" #adding legend labels\n",
" length_rem = len(rem_new) - rem_new.count(0)\n",
" length_deep = len(deep_new) - deep_new.count(0)\n",
" length_light = len(light_new) - light_new.count(0)\n",
" length_nostages = len(no_stages_new) - no_stages_new.count(0)\n",
"\n",
" hours_rem = int((sum(rem_new)/length_rem) // 60)\n",
" hours_deep = int(sum(deep_new)/length_deep //60)\n",
" hours_light = int(sum(light_new)/length_light //60)\n",
" hours_nostages = int(sum(no_stages_new)/length_nostages //60)\n",
"\n",
" mins_rem = int((sum(rem_new)/length_rem) - hours_rem*60)\n",
" mins_deep = int(sum(deep_new)/length_deep - hours_deep*60)\n",
" mins_light = int(sum(light_new)/length_light - hours_light*60)\n",
" mins_nostages = int(sum(no_stages_new)/length_nostages - hours_nostages*60)\n",
"\n",
" plt.figtext(0.25,0.9, str(hours_rem) + ' hr ' + str(mins_rem) + \" min\", fontsize=7.5, ha='center', color ='w', fontweight = 'light')\n",
" plt.figtext(0.42,0.9, str(hours_light) + ' hr ' + str(mins_light) + \" min\", fontsize=7.5, ha='center', color ='w', fontweight = 'light')\n",
" plt.figtext(0.59,0.9, str(hours_deep) + ' hr ' + str(mins_deep) + \" min\", fontsize=7.5, ha='center', color ='w', fontweight = 'light')\n",
" plt.figtext(0.76,0.9, str(hours_nostages) + ' hr ' + str(mins_nostages) + \" min\", fontsize=7.5, ha='center', color ='w', fontweight = 'light')\n",
"\n"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 502
},
"id": "qtGXzWYZ8yAs",
"outputId": "756f87e0-04f5-413b-eb43-8bf28b8c981a"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": [
"Now this looks very similar to the original graph!"
],
"metadata": {
"id": "0lxHiQcqqBjR"
}
},
{
"cell_type": "markdown",
"source": [
"# 5. Data analysis"
],
"metadata": {
"id": "kitR-nsOpTAC"
}
},
{
"cell_type": "markdown",
"source": [
"## 5.1 Finding Abnormalities (Outliers) in the Data"
],
"metadata": {
"id": "2StFSfSJNdM_"
}
},
{
"cell_type": "markdown",
"source": [
"We find outliers and remove them in order to get better analysis accuracy by removing the possibility of measurement errors, but at the same time it can affect the result's accuracy since some outliers are true outliers: outliers that is important in the data itelf. Check [this](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7485938) out to learn more about the effects of removing outliers.\n",
"\n",
"Here we are going to find abnormalities in the data using the Elliptic Envelope algorithm, which is a machine learning algorith that creates a hypothetical ellipse around the set of data and points outside of this envelope are considered outliers. Check [this](https://towardsdatascience.com/machine-learning-for-anomaly-detection-elliptic-envelope-2c90528df0a6) to learn more about the algorithm.\n",
"\n",
"We can implement this algorithm by utilizing sklearn library which has the built in Elliptic Envelope function."
],
"metadata": {
"id": "hZCYrbjSNdjY"
}
},
{
"cell_type": "code",
"source": [
"#creating a function that detects outliers\n",
"def find_outliers(arr):\n",
" list_of_outliers = []\n",
" # Create a dataframe\n",
" d = {'arr': arr}\n",
" df = pd.DataFrame(data=d)\n",
"\n",
" # here we return the a list where the indexies with -1 values are where the\n",
" # outliers are at. learn more about the implementation here: \n",
" # https://www.datatechnotes.com/2020/04/anomaly-detection-with-elliptical-envelope-in-python.html\n",
" pred = EllipticEnvelope(assume_centered=False, contamination=0.02, random_state=None,\n",
" store_precision=True, support_fraction=None).fit_predict(df['arr'].array.reshape(-1, 1))\n",
" for i in range(len(pred)):\n",
" if pred[i] == -1:\n",
" list_of_outliers.append(arr[i])\n",
" return list_of_outliers"
],
"metadata": {
"id": "0zcGMgpEMvpw"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"Now lets put this to test"
],
"metadata": {
"id": "a8QEg4eDM3xG"
}
},
{
"cell_type": "code",
"source": [
"#Here we are going to take the steps as an example\n",
"#First aggregate the needed data in arrays. \n",
"\n",
"dates = []\n",
"steps = []\n",
"for datapoint in api_data['steps'][0]['activities-steps']:\n",
" dates.append(datapoint['dateTime'])\n",
" steps.append(float(datapoint['value']))\n",
"\n",
"# After this lets filter out the non-wear days\n",
"new_arrays = remove_non_wear([dates, steps], 1)\n",
"dates = new_arrays[0]\n",
"steps = new_arrays[1]\n",
"\n",
"#inject an outlier value\n",
"steps[-1] = 2\n",
"\n",
"\n",
"outliers = find_outliers(steps)\n",
"print(outliers)"
],
"metadata": {
"id": "yomm-_YaM78x",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "fda2eadb-19c8-4be7-81da-abbbeda837e4"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[2]\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"So this worked! Now lets try to plot the outliers!"
],
"metadata": {
"id": "tX5u6R9ENItP"
}
},
{
"cell_type": "code",
"source": [
"#creting a list of dates that correspond to the outlier values in sleep\n",
"outlier_dates = []\n",
"for i in range(len(steps)):\n",
" if steps[i] in outliers:\n",
" outlier_dates.append(dates[i])\n",
"\n",
"#creating the plot without highlighting outliers\n",
"plt.xlabel('steps')\n",
"plt.ylabel('dates')\n",
"plt.scatter(x = steps, y = dates, color = 'g')\n",
"plt.rcParams[\"figure.figsize\"] = (5,5)\n",
"plt.show(block=True)\n",
"\n",
"#recreating the plot with highlighting outliers\n",
"plt.xlabel('steps')\n",
"plt.ylabel('dates')\n",
"plt.scatter(x = steps, y = dates, color = 'g')\n",
"plt.rcParams[\"figure.figsize\"] = (5,5)\n",
"plt.scatter(x = outliers, y = outlier_dates, color='r')\n",
"plt.show(block=True)\n"
],
"metadata": {
"id": "n8Mja7sVNTBT",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 661
},
"outputId": "eace911b-2341-4360-bb0c-82be6ba5d762"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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\n"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": [
"The outlier now appears in a different color!"
],
"metadata": {
"id": "keo2kRCFSeDr"
}
},
{
"cell_type": "markdown",
"source": [
"## 5.2 Checking for Correlation Between Amount Of Sedentary Activity and The Time In Bed"
],
"metadata": {
"id": "bVHMss_NAzZd"
}
},
{
"cell_type": "markdown",
"source": [
"Here we are trying to see if there is a correlation between the amount of very low activity (Sedentary Activity) and the time in bed. The hypothesis is that very low intensity activity may correlate somehow with the time in bed, and we are checking for the validity of this hyposthesis."
],
"metadata": {
"id": "1j0PY8_pW38d"
}
},
{
"cell_type": "code",
"source": [
"#First aggregate the data in arrays\n",
"dates_activity = []\n",
"minutes = []\n",
"sleep = []\n",
"dates_sleep = []\n",
"for datapoint in api_data['minutesSedentary'][0]['activities-minutesSedentary']:\n",
" dates.append(datapoint['dateTime'])\n",
" minutes.append(float(datapoint['value']))\n",
"for datapoint in api_data['sleep'][0]['sleep']:\n",
" try:\n",
" sleep.append(float(datapoint['timeInBed'])/60)\n",
" dates_sleep.append(datapoint['dateOfSleep'])\n",
" except:\n",
" continue\n",
"\n",
"# then filter the data from non-wear days\n",
"new_arrays = remove_non_wear([dates, minutes], 1)\n",
"dates_activity = new_arrays[0]\n",
"minutes = new_arrays[1]\n",
"\n",
"#now adjust the arrays so that the dates match.\n",
"dates_activity_new = []\n",
"minutes_new = []\n",
"sleep_new = []\n",
"\n",
"for i in dates_activity:\n",
" if i in dates_sleep:\n",
" dates_activity_new.append(i)\n",
" minutes_new.append(minutes[dates_activity.index(i)])\n",
" sleep_new.append(sleep[dates_sleep.index(i)])\n",
"\n",
"#remove the outliers\n",
"outliers1 = find_outliers(minutes_new)\n",
"outliers2 = find_outliers(sleep_new)\n",
"for item in outliers1:\n",
" index = minutes_new.index(item)\n",
" minutes_new.remove(item)\n",
" sleep_new.pop(index)\n",
"for item in outliers2:\n",
" index = sleep_new.index(item)\n",
" sleep_new.remove(item)\n",
" minutes_new.pop(index)\n",
"\n",
"# create a dataframex \n",
"d = {'Very Low Activity (mins)': minutes_new, 'Time in bed (Hours)': sleep_new}\n",
"df = pd.DataFrame(data=d)\n",
"\n",
"#plot the data\n",
"graph = sns.lmplot(data=df, y=\"Very Low Activity (mins)\", x=\"Time in bed (Hours)\")\n",
"plt.show(block=True)\n"
],
"metadata": {
"id": "kFPgs-rfXosD",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 365
},
"outputId": "dcff6bc5-62d4-43e1-a74f-73f5fb5c2579"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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ARQUFLB582Y0TcPpdPLll1+Sk5MT0ppGjhzJpk2bAM+43BdffMEZZ5wRkJq6e++995g9ezYpKSknPT9v3jzeeecd3G439fX1fPjhh8ydOzekNQXzOvelpmBf577UBEG4zrUoVllZqV1//fVaQUGBtmjRIu2TTz7RNE3Tfv7zn2slJSWapmnalVdeqeXn52sLFizw/ldeXh7Smrp77rnntKeeeipg9fhak6qq2hNPPKHNmzdPmz9/vvbEE09oqqqGtKb9+/drN954o1ZQUKB9//vf1x566CHN6XQGrKYul156qbZx48Yex7rX5XK5tAceeEC76KKLtIsuukh76623Ql5TsK9zX2rqLhjXuS81Bfo6lx0fhBAiSKJ2SEEIIcKNBK4QQgSJBK4QQgSJBK4QQgSJBK4QQgSJBK7wi8suuywoiw5efvll7rvvvgG9d+nSpTz77LN+qeMf//gHP/zhD/t8zeLFiyktLfXL5/lTeXk5ixcvDnUZQ1LUNq8R/jVlyhTvjzs6OjCZTN4lmQ8//DDvv/9+UOq45ZZbgvI5g/XRRx8RFxfHxIkTAXj++efZv38/f/jDH3q8Ljs7mw0bNpywqCOQcnJySEhI4KOPPmLOnDlB+1whgSt8tH37du+P58yZw2OPPcZ5550XworC21tvvcXChQtD9vmqqvbZo+Dyyy/n7bfflsANMhlSEH4xZ84cPv/8c8BzN7dkyRLuvvtupkyZwuWXX05FRQV/+tOfOPfcc5k9ezabN2/2vrelpYV7772XmTNnMmvWLJ599tle+6c+//zz3H333YCnqXR2djbvvfceF154Ifn5+axYsaLPOhsaGvjpT3/KlClTuP766zl48KD33J49e/jpT39KXl4ec+fOZd26dT3ed8sttzB16lR+8IMfUFlZ2etnOBwOvvzyS/Ly8k79jTvufY8//ri389njjz+Ow+EATj6EkZ2dzf79+wHPcMmDDz7IL37xC84++2yKiorYuHEj8+fPZ8qUKcyaNatHO8L8/Hy++OIL79cXwSGBKwLi448/ZuHChWzZsoXc3Fx+9rOf4Xa72bRpE7fddhsPPPCA97VLly7FYDCwYcMGVq1axWeffcY777zj82d99dVXrF+/ntdff50XX3yRPXv29PraNWvWcOutt1JUVEROTo43vNvb27npppsoKCjg888/59lnn+Xhhx9m9+7dADzyyCOYzWY2b97ME088wcqVK3v9jP3796PT6frdsGbFihV8/fXXFBYWsnr1ar755hteeukln9+/du1abrnlFrZt28a0adO47777eOSRR9i+fTtr167lnHPO8b7WarViMBjYu3dvv2oUgyOBKwJi+vTpzJo1C4PBwLx582hoaODmm2/GaDQyf/58Dh48SHNzM7W1tWzcuJF7772X2NhY0tLSuPHGG/s1Jnz77bdjsVjIyckhJyeH8vLyXl974YUXMmPGDEwmE3fddRc7duygurqaTz75hBEjRnDVVVdhMBiYOHEic+fOZf369aiqyoYNG1iyZAmxsbFMmDCBK664otfPaG5uJi4u7oTj69evZ/r06T3+627NmjXcdtttpKWlkZqaym233cbq1at9/j5cdNFFTJs2DZ1Oh9lsxmAwsHv3blpbW0lKSjqhaU1cXBwtLS0+gbwDsgAAAu5JREFUf30xeDKGKwIiLS3N+2OLxUJKSop3TLFrW5f29nZsNhsul4uZM2d6X+92u8nKyvL5s7rvBhETE9PnzgHd7zrj4uJISkrCZrNx8OBBSkpKeoSgqqosWLCA+vp6XC5Xj5q6Nxg/XlJSEm1tbSccnzdv3kkfmnWx2Ww9vu7w4cOx2Wy9fs7xjv+ePffcc6xYsYI//vGPZGdn86tf/arHw8+2traA7twhTiSBK0Jq2LBhmEwmvvzyy4Bt/thd950X2traaGpqIjMzk6ysLGbMmMFrr712wntUVcVgMFBdXc348eMBT4/b3owaNQpN06ipqenXlj+ZmZkcOnTI22KyurqazMxMwPMXSWdnp/e1R44cOeXXmzRpEitWrMDpdPLmm29y5513snHjRsDTF9bpdAalL644RoYUREhlZmZy/vnn89RTT9Ha2orb7aaysrLXHV4Ha+PGjWzduhWHw8Hy5cuZPHkyWVlZXHjhhezbt49Vq1bhdDpxOp2UlJSwZ88e9Ho9l1xyCS+88AIdHR3s3r2b9957r9fPMJlMnHvuuf3+NVx22WWsWLGC+vp66uvrefHFF72NsnNycti1axdlZWXY7Xaef/75Pr+Ww+Fg9erVtLS0YDQaiYuLQ6c79se9uLiYc845J6AbgYoTSeCKkPv973+P0+lk/vz5zJgxgyVLlvh0BzcQBQUFvPjii+Tn5/Ptt9/y9NNPAxAfH8+rr77KunXrmDVrFjNnzuQPf/iD9yn+Aw88QHt7O+effz5Lly7lyiuv7PNzFi9e3O+tWW699VbOOussFixYwIIFCzjzzDO59dZbARg7diy33XYbN954I5deeqlPe7cVFhYyZ84cpk6dyltvveX9tYJnvFgWPwSf9MMVIkAWL17MAw884F38EC7Ky8t58MEHefvtt0NdypAjgSuEEEEiQwpCCBEkErhCCBEkErhCCBEkErhCCBEkErhCCBEkErhCCBEkErhCCBEkErhCCBEk/z9dGOgu8DKHCAAAAABJRU5ErkJggg==\n"
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": [
"Lets calculate the resulting p-value. The p-value basically indicates the probability that the numbers are generated at random. A correlation is considered significant at a p-value < 0.05 which means that there is less than a 5% possibility the numbers were generated at random."
],
"metadata": {
"id": "6nntXJKDLPuh"
}
},
{
"cell_type": "code",
"source": [
"slope, intercept, r_value, p_value, std_err = stats.linregress(sleep_new,minutes_new)\n",
"print(p_value)"
],
"metadata": {
"id": "GfEM7jNUr4dR",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "8419af48-e811-49b3-ed8c-caa97a904717"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0.0332248586370972\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"The p-value is clearly less than 0.05 which indicates that the correlation is significant!"
],
"metadata": {
"id": "uwMI9UsOL_Di"
}
}
]
}