From 35a5fcc1bb6e7697df60d33f9fe70204da72ac88 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Thu, 1 Feb 2024 18:12:44 -0500 Subject: [PATCH 01/26] seed --- wearipedia/devices/oura/oura_ring3.py | 2 + wearipedia/devices/oura/oura_ring3_gen.py | 196 +++++++++++----------- 2 files changed, 103 insertions(+), 95 deletions(-) diff --git a/wearipedia/devices/oura/oura_ring3.py b/wearipedia/devices/oura/oura_ring3.py index 1e73cbb9..9e139887 100644 --- a/wearipedia/devices/oura/oura_ring3.py +++ b/wearipedia/devices/oura/oura_ring3.py @@ -60,6 +60,7 @@ def __init__( def _default_params(self): params = { + "seed": 0, "start_date": "2022-04-24", "end_date": "2022-04-28", } @@ -96,6 +97,7 @@ def _get_real(self, data_type, params): def _gen_synthetic(self): syn_data = create_syn_data( + self.init_params["seed"], self.init_params["synthetic_start_date"], self.init_params["synthetic_end_date"], ) diff --git a/wearipedia/devices/oura/oura_ring3_gen.py b/wearipedia/devices/oura/oura_ring3_gen.py index 62db255e..002cc93c 100644 --- a/wearipedia/devices/oura/oura_ring3_gen.py +++ b/wearipedia/devices/oura/oura_ring3_gen.py @@ -21,44 +21,44 @@ def convert_string_to_datetime(date_str): formatted_date_str = f"{date_object.strftime('%Y-%m-%dT%H:%M:%S.%f')} -00:00" return formatted_date_str - random_number = random.randint(100, 999) + random_number = np.random.randint(100, 999) daily_activity = { "id": f"fd54d467-4c71-450e-a3ce-7a3951f3d{random_number}", - "class_5_min": "".join(str(random.randint(0, 9)) for _ in range(300)), - "score": random.randint(50, 100), - "active_calories": random.randint(300, 1500), - "average_met_minutes": random.randint(500, 2000) / 1000, + "class_5_min": "".join(str(np.random.randint(0, 9)) for _ in range(300)), + "score": np.random.randint(50, 100), + "active_calories": np.random.randint(300, 1500), + "average_met_minutes": np.random.randint(500, 2000) / 1000, "contributors": { - "meet_daily_targets": random.randint(50, 100), - "move_every_hour": random.randint(50, 100), - "recovery_time": random.randint(50, 100), - "stay_active": random.randint(50, 100), - "training_frequency": random.randint(50, 100), - "training_volume": random.randint(50, 100), + "meet_daily_targets": np.random.randint(50, 100), + "move_every_hour": np.random.randint(50, 100), + "recovery_time": np.random.randint(50, 100), + "stay_active": np.random.randint(50, 100), + "training_frequency": np.random.randint(50, 100), + "training_volume": np.random.randint(50, 100), }, - "equivalent_walking_distance": random.randint(500, 10000), - "high_activity_met_minutes": random.randint(500, 2000) / 1000, - "high_activity_time": random.randint(500, 2000) / 1000 * 60, - "inactivity_alerts": random.randint(0, 10), - "low_activity_met_minutes": random.randint(500, 2000) / 1000 * 60, - "low_activity_time": random.randint(500, 2000) / 1000 * 60, - "medium_activity_met_minutes": random.randint(500, 2000) / 1000 * 60, - "medium_activity_time": random.randint(500, 2000) / 1000 * 60, + "equivalent_walking_distance": np.random.randint(500, 10000), + "high_activity_met_minutes": np.random.randint(500, 2000) / 1000, + "high_activity_time": np.random.randint(500, 2000) / 1000 * 60, + "inactivity_alerts": np.random.randint(0, 10), + "low_activity_met_minutes": np.random.randint(500, 2000) / 1000 * 60, + "low_activity_time": np.random.randint(500, 2000) / 1000 * 60, + "medium_activity_met_minutes": np.random.randint(500, 2000) / 1000 * 60, + "medium_activity_time": np.random.randint(500, 2000) / 1000 * 60, "met": { "interval": 60.0, "timestamp": convert_string_to_datetime(date), - "items": [round(random.uniform(0.9, 5.0), 1) for _ in range(300)], + "items": [round(np.random.uniform(0.9, 5.0), 1) for _ in range(300)], }, - "meters_to_target": random.randint(50, 2000), - "non_wear_time": random.randint(50, 18000), - "resting_time": random.randint(50, 18000), - "sedentary_met_minutes": random.randint(500, 2000) / 1000 * 60, - "sedentary_time": random.randint(500, 2000) / 1000 * 60, - "steps": random.randint(500, 10000), + "meters_to_target": np.random.randint(50, 2000), + "non_wear_time": np.random.randint(50, 18000), + "resting_time": np.random.randint(50, 18000), + "sedentary_met_minutes": np.random.randint(500, 2000) / 1000 * 60, + "sedentary_time": np.random.randint(500, 2000) / 1000 * 60, + "steps": np.random.randint(500, 10000), "target_calories": 500, "target_meters": 10000, - "total_calories": random.randint(1500, 4000), + "total_calories": np.random.randint(1500, 4000), "day": date, "timestamp": convert_string_to_datetime(date), } @@ -77,54 +77,54 @@ def get_sleep(date): period_id = 1 is_longest = 1 - timezone = random.randint(-600, 600) + timezone = np.random.randint(-600, 600) bedtime_end = ( - summary_date + timedelta(minutes=random.randint(0, 1440)) + summary_date + timedelta(minutes=np.random.randint(0, 1440)) ).isoformat() bedtime_start = ( - summary_date + timedelta(minutes=random.randint(0, 1440)) + summary_date + timedelta(minutes=np.random.randint(0, 1440)) ).isoformat() - sleep_type = random.choice(["long_sleep", "short_sleep"]) - breath_average = round(random.uniform(10, 20), 3) - average_breath_variation = round(random.uniform(0, 5), 3) - duration = random.randint(18000, 43200) - total = random.randint(int(duration * 0.9), duration) - awake = random.randint(0, int(duration * 0.1)) - rem = random.randint(int(duration * 0.2), int(duration * 0.3)) - deep = random.randint(int(duration * 0.4), int(duration * 0.6)) + sleep_type = np.random.choice(["long_sleep", "short_sleep"]) + breath_average = round(np.random.uniform(10, 20), 3) + average_breath_variation = round(np.random.uniform(0, 5), 3) + duration = np.random.randint(18000, 43200) + total = np.random.randint(int(duration * 0.9), duration) + awake = np.random.randint(0, int(duration * 0.1)) + rem = np.random.randint(int(duration * 0.2), int(duration * 0.3)) + deep = np.random.randint(int(duration * 0.4), int(duration * 0.6)) light = total - rem - deep - awake - midpoint_time = random.randint(int(duration * 0.4), int(duration * 0.6)) - efficiency = random.randint(80, 100) - restless = random.randint(0, 10) - onset_latency = random.randint(600, 1800) + midpoint_time = np.random.randint(int(duration * 0.4), int(duration * 0.6)) + efficiency = np.random.randint(80, 100) + restless = np.random.randint(0, 10) + onset_latency = np.random.randint(600, 1800) got_up_count = 0 - wake_up_count = random.randint(0, 10) - hr_5min = [random.randint(50, 60) for _ in range(96)] + [0] + wake_up_count = np.random.randint(0, 10) + hr_5min = [np.random.randint(50, 60) for _ in range(96)] + [0] hr_average = round(sum(hr_5min) / len(hr_5min), 3) hr_lowest = min(hr_5min) lowest_heart_rate_time_offset = hr_5min.index(hr_lowest) * 300 - hypnogram_5min = "".join([str(random.randint(1, 4)) for _ in range(96)]) + hypnogram_5min = "".join([str(np.random.randint(1, 4)) for _ in range(96)]) - rmssd_5min = [random.randint(20, 120) for _ in range(96)] + [0] + rmssd_5min = [np.random.randint(20, 120) for _ in range(96)] + [0] rmssd = round(sum(rmssd_5min) / len(rmssd_5min)) - score = random.randint(60, 90) - score_alignment = random.randint(40, 80) - score_deep = random.randint(80, 100) - score_disturbances = random.randint(60, 90) - score_efficiency = random.randint(80, 100) - score_latency = random.randint(60, 90) - score_rem = random.randint(40, 70) - score_total = random.randint(50, 80) - - temperature_deviation = round(random.uniform(-1, 1), 2) - temperature_trend_deviation = round(random.uniform(-0.1, 0.1), 2) - bedtime_start_delta = random.randint(3000, 4000) - bedtime_end_delta = random.randint(18000, 43200) - midpoint_at_delta = random.randint(7200, 21600) - temperature_delta = round(random.uniform(-1, 1), 2) + score = np.random.randint(60, 90) + score_alignment = np.random.randint(40, 80) + score_deep = np.random.randint(80, 100) + score_disturbances = np.random.randint(60, 90) + score_efficiency = np.random.randint(80, 100) + score_latency = np.random.randint(60, 90) + score_rem = np.random.randint(40, 70) + score_total = np.random.randint(50, 80) + + temperature_deviation = round(np.random.uniform(-1, 1), 2) + temperature_trend_deviation = round(np.random.uniform(-0.1, 0.1), 2) + bedtime_start_delta = np.random.randint(3000, 4000) + bedtime_end_delta = np.random.randint(18000, 43200) + midpoint_at_delta = np.random.randint(7200, 21600) + temperature_delta = round(np.random.uniform(-1, 1), 2) sleep_data = { "summary_date": summary_date.strftime("%Y-%m-%d"), @@ -186,21 +186,21 @@ def get_activity(date): end_time = start_time + timedelta(days=1) - timedelta(seconds=1) timezone_offset = -420 - cal_active = random.randint(300, 800) - cal_total = cal_active + random.randint(1500, 2000) - steps = random.randint(8000, 15000) - daily_movement = random.randint(7000, 12000) + cal_active = np.random.randint(300, 800) + cal_total = cal_active + np.random.randint(1500, 2000) + steps = np.random.randint(8000, 15000) + daily_movement = np.random.randint(7000, 12000) - non_wear = random.randint(0, 120) - rest = random.randint(400, 600) - inactive = random.randint(500, 800) - low = random.randint(200, 400) - medium = random.randint(50, 150) - high = random.randint(0, 20) - inactivity_alerts = random.randint(0, 3) - average_met = round(random.uniform(1.0, 1.8), 2) + non_wear = np.random.randint(0, 120) + rest = np.random.randint(400, 600) + inactive = np.random.randint(500, 800) + low = np.random.randint(200, 400) + medium = np.random.randint(50, 150) + high = np.random.randint(0, 20) + inactivity_alerts = np.random.randint(0, 3) + average_met = round(np.random.uniform(1.0, 1.8), 2) - met_1min = [round(random.uniform(0.9, 5.0), 1) for _ in range(1440)] + met_1min = [round(np.random.uniform(0.9, 5.0), 1) for _ in range(1440)] activity_data = { "summary_date": summary_date.strftime("%Y-%m-%d"), @@ -209,7 +209,7 @@ def get_activity(date): "day_end": end_time.isoformat(), "cal_active": cal_active, "cal_total": cal_total, - "class_5min": "".join(str(random.randint(0, 5)) for _ in range(288)), + "class_5min": "".join(str(np.random.randint(0, 5)) for _ in range(288)), "steps": steps, "daily_movement": daily_movement, "non_wear": non_wear, @@ -236,18 +236,18 @@ def get_readiness(date): """ summary_date = datetime.strptime(date, "%Y-%m-%d") - score = random.randint(70, 100) - score_activity_balance = random.randint(70, 100) - score_hrv_balance = random.randint(70, 100) - score_previous_day = random.randint(70, 100) - score_previous_night = random.randint(70, 100) - score_recovery_index = random.randint(70, 100) - score_resting_hr = random.randint(70, 100) - score_sleep_balance = random.randint(70, 100) - score_temperature = random.randint(70, 99) - - rest_mode_state = random.randint(0, 1) - period_id = random.randint(1, 4) + score = np.random.randint(70, 100) + score_activity_balance = np.random.randint(70, 100) + score_hrv_balance = np.random.randint(70, 100) + score_previous_day = np.random.randint(70, 100) + score_previous_night = np.random.randint(70, 100) + score_recovery_index = np.random.randint(70, 100) + score_resting_hr = np.random.randint(70, 100) + score_sleep_balance = np.random.randint(70, 100) + score_temperature = np.random.randint(70, 99) + + rest_mode_state = np.random.randint(0, 1) + period_id = np.random.randint(1, 4) readiness_data = { "summary_date": summary_date.strftime("%Y-%m-%d"), @@ -277,8 +277,8 @@ def get_ideal_bedtime(date): """ date = datetime.strptime(date, "%Y-%m-%d") - start_time = random.randint(0, 86400) - end_time = random.randint(start_time, 86400) + start_time = np.random.randint(0, 86400) + end_time = np.random.randint(start_time, 86400) ideal_bedtime_data = { "date": date.strftime("%Y-%m-%d"), @@ -305,7 +305,7 @@ def get_heart_rate(date): number_of_minues_in_a_day = 1440 - bpm = random.randint(50, 120) + bpm = np.random.randint(50, 120) for i in range(0, number_of_minues_in_a_day, 5): # Calculate the current hour based on the timestamp @@ -318,15 +318,15 @@ def get_heart_rate(date): # Gradually change the heart rate within a realistic range if is_awake: # Simulate an increase in heart rate during awake hours - bpm += random.randint(-3, 5) + bpm += np.random.randint(-3, 5) bpm = min( - random.randint(100, 120), bpm + np.random.randint(100, 120), bpm ) # Ensure heart rate doesn't exceed 120 bpm else: # Simulate a decrease in heart rate during asleep hours - bpm -= random.randint(-3, 5) + bpm -= np.random.randint(-3, 5) bpm = max( - random.randint(50, 70), bpm + np.random.randint(50, 70), bpm ) # Ensure heart rate doesn't go below 50 bpm formatted_timestamp = (date + timedelta(minutes=i)).strftime( @@ -344,7 +344,7 @@ def get_heart_rate(date): return heart_rate_data -def create_syn_data(start_date, end_date): +def create_syn_data(seed, start_date, end_date): """Returns a dict of daily activity data, sleep data, ideal bedtime, readiness, and activity :param start_date: the start date (inclusive) as a string in the format "YYYY-MM-DD" @@ -354,6 +354,7 @@ def create_syn_data(start_date, end_date): :return: a defaultdict of daily activity data, sleep data, ideal bedtime, readiness, and activity :rtype: defaultdict """ + np.random.seed(seed) num_days = ( datetime.strptime(end_date, "%Y-%m-%d") @@ -381,3 +382,8 @@ def create_syn_data(start_date, end_date): full_dict["heart_rate"].extend(get_heart_rate(date)) return full_dict + + +x = create_syn_data(122, "2022-12-12", "2022-12-13") + +print(x) From 6d4f4cf3558e1d8f6c9aaef6f913718e8abdcda6 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sat, 3 Feb 2024 15:39:08 -0500 Subject: [PATCH 02/26] delete some debugging comments --- wearipedia/devices/oura/oura_ring3_gen.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/wearipedia/devices/oura/oura_ring3_gen.py b/wearipedia/devices/oura/oura_ring3_gen.py index 002cc93c..619ba38e 100644 --- a/wearipedia/devices/oura/oura_ring3_gen.py +++ b/wearipedia/devices/oura/oura_ring3_gen.py @@ -382,8 +382,3 @@ def create_syn_data(seed, start_date, end_date): full_dict["heart_rate"].extend(get_heart_rate(date)) return full_dict - - -x = create_syn_data(122, "2022-12-12", "2022-12-13") - -print(x) From cba45bcd0009a34ce08c559ac71ba8b0cdc39454 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sat, 17 Feb 2024 15:33:46 -0500 Subject: [PATCH 03/26] Update oura_ring3_gen.py --- wearipedia/devices/oura/oura_ring3_gen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wearipedia/devices/oura/oura_ring3_gen.py b/wearipedia/devices/oura/oura_ring3_gen.py index 619ba38e..4dbefa71 100644 --- a/wearipedia/devices/oura/oura_ring3_gen.py +++ b/wearipedia/devices/oura/oura_ring3_gen.py @@ -95,7 +95,7 @@ def get_sleep(date): light = total - rem - deep - awake midpoint_time = np.random.randint(int(duration * 0.4), int(duration * 0.6)) efficiency = np.random.randint(80, 100) - restless = np.random.randint(0, 10) + restless = np.random.randint(20, 90) onset_latency = np.random.randint(600, 1800) got_up_count = 0 wake_up_count = np.random.randint(0, 10) From 2cf23b45de5b796f8657e9962ed209c1ce977a46 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sat, 17 Feb 2024 15:42:37 -0500 Subject: [PATCH 04/26] Update oura_ring3_gen.py --- wearipedia/devices/oura/oura_ring3_gen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wearipedia/devices/oura/oura_ring3_gen.py b/wearipedia/devices/oura/oura_ring3_gen.py index 4dbefa71..a896f298 100644 --- a/wearipedia/devices/oura/oura_ring3_gen.py +++ b/wearipedia/devices/oura/oura_ring3_gen.py @@ -95,7 +95,7 @@ def get_sleep(date): light = total - rem - deep - awake midpoint_time = np.random.randint(int(duration * 0.4), int(duration * 0.6)) efficiency = np.random.randint(80, 100) - restless = np.random.randint(20, 90) + restless = np.random.randint(5 * 60, 30 * 60) onset_latency = np.random.randint(600, 1800) got_up_count = 0 wake_up_count = np.random.randint(0, 10) From 9703edc44f20361470d6c05e517453346f939c78 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 07:59:04 -0500 Subject: [PATCH 05/26] Update fitbit_charge_4.py --- wearipedia/devices/fitbit/fitbit_charge_4.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_charge_4.py b/wearipedia/devices/fitbit/fitbit_charge_4.py index 93b15bf4..8c2bcaca 100644 --- a/wearipedia/devices/fitbit/fitbit_charge_4.py +++ b/wearipedia/devices/fitbit/fitbit_charge_4.py @@ -32,8 +32,8 @@ class Fitbit_charge_4(BaseDevice): def __init__( self, seed=0, - synthetic_start_date="2022-03-01", - synthetic_end_date="2022-06-17", + synthetic_start_date="2022-12-01", + synthetic_end_date="2023-01-01", ): params = { @@ -62,6 +62,7 @@ def __init__( def _default_params(self): params = { + "seed": 0, "start_date": "2022-04-24", "end_date": "2022-04-28", } From a49dea90ab8204f91349d65c3d680b2c6968c557 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 08:04:31 -0500 Subject: [PATCH 06/26] Update fitbit_sense.py --- wearipedia/devices/fitbit/fitbit_sense.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_sense.py b/wearipedia/devices/fitbit/fitbit_sense.py index 6c91fa69..858acc9a 100644 --- a/wearipedia/devices/fitbit/fitbit_sense.py +++ b/wearipedia/devices/fitbit/fitbit_sense.py @@ -68,8 +68,8 @@ def __init__( def _default_params(self): params = { - "start_date": "2022-04-24", - "end_date": "2022-04-28", + "start_date": "2022-08-30", + "end_date": "2023-01-01", } return params From 4a8c240a20bb3f0226845f710165ec97ab623ff4 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 08:11:33 -0500 Subject: [PATCH 07/26] Update fitbit_sense.py --- wearipedia/devices/fitbit/fitbit_sense.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wearipedia/devices/fitbit/fitbit_sense.py b/wearipedia/devices/fitbit/fitbit_sense.py index 858acc9a..c8a5f642 100644 --- a/wearipedia/devices/fitbit/fitbit_sense.py +++ b/wearipedia/devices/fitbit/fitbit_sense.py @@ -68,7 +68,7 @@ def __init__( def _default_params(self): params = { - "start_date": "2022-08-30", + "start_date": "2022-06-30", "end_date": "2023-01-01", } From bda232c920deca9df104bc20dc2d5f97d040e5a4 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 08:22:59 -0500 Subject: [PATCH 08/26] Update fitbit_sense.py --- wearipedia/devices/fitbit/fitbit_sense.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_sense.py b/wearipedia/devices/fitbit/fitbit_sense.py index c8a5f642..68463d3c 100644 --- a/wearipedia/devices/fitbit/fitbit_sense.py +++ b/wearipedia/devices/fitbit/fitbit_sense.py @@ -61,8 +61,8 @@ def __init__( params, { "seed": 0, - "synthetic_start_date": "2022-03-01", - "synthetic_end_date": "2022-06-17", + "synthetic_start_date": "2022-06-30", + "synthetic_end_date": "2023-01-01", }, ) From d24cce182e9f1841eaf11cd3e7b0cb98348fef8a Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 08:25:03 -0500 Subject: [PATCH 09/26] Update fitbit_sense.py --- wearipedia/devices/fitbit/fitbit_sense.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_sense.py b/wearipedia/devices/fitbit/fitbit_sense.py index 68463d3c..253a74ce 100644 --- a/wearipedia/devices/fitbit/fitbit_sense.py +++ b/wearipedia/devices/fitbit/fitbit_sense.py @@ -35,8 +35,8 @@ class Fitbit_sense(BaseDevice): def __init__( self, seed=0, - synthetic_start_date="2022-03-01", - synthetic_end_date="2022-06-17", + synthetic_start_date="2022-06-30", + synthetic_end_date="2023-01-01", ): params = { From 45eedccae107b83ea7867b9e4731307262ffe65c Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 09:08:49 -0500 Subject: [PATCH 10/26] token update --- .../devices/fitbit/fitbit_authenticate.py | 121 +----------------- wearipedia/devices/fitbit/fitbit_charge_4.py | 9 +- wearipedia/devices/fitbit/fitbit_sense.py | 11 +- 3 files changed, 16 insertions(+), 125 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_authenticate.py b/wearipedia/devices/fitbit/fitbit_authenticate.py index f41a8e42..d3216baa 100644 --- a/wearipedia/devices/fitbit/fitbit_authenticate.py +++ b/wearipedia/devices/fitbit/fitbit_authenticate.py @@ -7,122 +7,13 @@ __all__ = ["login", "fitbit_application", "fitbit_token"] -def login(email, password): - if len(email) == 0: # fake the login - token = "" - user_id = "" - else: - login = requests.post( - "https://accounts.fitbit.com/login", - json={ - "grant_type": "password", - "issueRefresh": False, - "password": password, - "username": email, - }, - ) +def fitbit_token(): + """gives us access token given the login info + :return: access token + :rtype: str + """ -def fitbit_application(): - """gives us access token given the auth_creds + going through the process, it's interactive - Returns the client id and client secret""" - - params = { - "Description": "Any thing here should suffice", - "Application Website URL": "Place any url here, even google.com", - "Organization": "type the name of the organization", - "Organization Website URL": " type organization webiste", - "Terms of Service URL": "Any Url should suffice", - "Privacy Policy URL": "Any Url should suffice", - "OAuth 2.0 Application Type": "choose the appropriate type", - "Redirect URL": "https://127.0.0.1/8080", - } - - print( - "fill the following parameters in this url then input the resulting client id and secret: ", - "https://dev.fitbit.com/apps/new", - "\n", - ) - for key, value in params.items(): - print(key, ":", value) - - client_id = input("Enter the client id: ") - client_secret = input("Enter the client secret: ") - - return client_id, client_secret - - -def fitbit_token(client_id, client_secret): - """generates an access token""" - - code_verifier = ( - base64.urlsafe_b64encode(os.urandom(43)).decode("utf-8") - if "code_verifier" not in locals() - else code_verifier - ) - code_challenge = ( - base64.urlsafe_b64encode(hashlib.sha256(code_verifier.encode("utf-8")).digest()) - .decode("utf-8") - .replace("=", "") - ) - - variables = dict() - - # user specified - variables["client_id"] = client_id - variables["client_secret"] = client_secret - variables["expires_in"] = "31536000" # expiry of token in seconds - - # constants or one-time generated - variables["code_verifier"] = code_verifier - variables["code_challenge"] = code_challenge - variables["code_challenge_method"] = "S256" - variables["response_type"] = "token" # code - variables["scope"] = ( - "weight%20location%20settings%20profile%20nutrition%20" - + "activity%20sleep%20heartrate%20social" - ) - variables["prompt"] = "none" - variables["redirect_uri"] = "https://127.0.0.1/8080" - variables["grant_type"] = "authorization_code" - variables["authorization"] = base64.urlsafe_b64encode( - bytes(variables["client_id"] + ":" + variables["client_secret"], "utf-8") - ).decode("utf-8") - - # combine all parameters into the url string - url = "https://www.fitbit.com/oauth2/authorize" # authorization endpoint - for key in [ - "client_id", - "redirect_uri", - "code_challenge", - "code_challenge_method", - "scope", - "response_type", - "expires_in", - ]: - if url == "https://www.fitbit.com/oauth2/authorize": - url += "?" + key + "=" + variables[key] - else: - url += "&" + key + "=" + variables[key] - - print( - "Click the URL above to access the Authorization page. Check Allow All and click the Allow button in red then input the resulting url", - url, - ) - - authurl = input("Enter the resulting url: ") - - lst_of_token = [] - append = False - for i in authurl: - if i == "=": - append = True - continue - elif i == "&": - break - if append == True: - lst_of_token.append(i) - - access_token = "".join(lst_of_token) + access_token = input("Enter your access token: ") return access_token diff --git a/wearipedia/devices/fitbit/fitbit_charge_4.py b/wearipedia/devices/fitbit/fitbit_charge_4.py index 8c2bcaca..1287e4a5 100644 --- a/wearipedia/devices/fitbit/fitbit_charge_4.py +++ b/wearipedia/devices/fitbit/fitbit_charge_4.py @@ -110,8 +110,9 @@ def _gen_synthetic(self): self.distance = syn_data["distance"] self.minutesSedentary = syn_data["minutesSedentary"] - def _authenticate(self, client_id): + def _authenticate(self, token=""): # authenticate this device against API - fitbit_application() - client_secret = input("enter client secret: ") - self.user = fitbit_token(client_id, client_secret) + if token == "": + self.user = fitbit_token() + else: + self.user = token diff --git a/wearipedia/devices/fitbit/fitbit_sense.py b/wearipedia/devices/fitbit/fitbit_sense.py index 253a74ce..a86c269c 100644 --- a/wearipedia/devices/fitbit/fitbit_sense.py +++ b/wearipedia/devices/fitbit/fitbit_sense.py @@ -119,10 +119,9 @@ def _gen_synthetic(self): self.hrv = syn_data["hrv"] self.distance_day = syn_data["distance_day"] - def _authenticate(self, client_id="", client_secret=""): + def _authenticate(self, token=""): # authenticate this device against API - fitbit_application() - if client_id == "": - client_id = input("enter client id: ") - client_secret = input("enter client secret: ") - self.user = fitbit_token(client_id, client_secret) + if token == "": + self.user = fitbit_token() + else: + self.user = token From b82c190fb6b7df5246bc730cf801329678c7b144 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 09:12:47 -0500 Subject: [PATCH 11/26] Update fitbit_authenticate.py --- wearipedia/devices/fitbit/fitbit_authenticate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wearipedia/devices/fitbit/fitbit_authenticate.py b/wearipedia/devices/fitbit/fitbit_authenticate.py index d3216baa..c94df710 100644 --- a/wearipedia/devices/fitbit/fitbit_authenticate.py +++ b/wearipedia/devices/fitbit/fitbit_authenticate.py @@ -4,7 +4,7 @@ import requests -__all__ = ["login", "fitbit_application", "fitbit_token"] +__all__ = ["fitbit_token"] def fitbit_token(): From d48fab2724e5a0b781c2d48e4b101d20ba03d4d5 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 09:17:05 -0500 Subject: [PATCH 12/26] fixes to params in fitbits --- wearipedia/devices/fitbit/fitbit_charge_4.py | 4 ++-- wearipedia/devices/fitbit/fitbit_sense.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_charge_4.py b/wearipedia/devices/fitbit/fitbit_charge_4.py index 1287e4a5..b57541b0 100644 --- a/wearipedia/devices/fitbit/fitbit_charge_4.py +++ b/wearipedia/devices/fitbit/fitbit_charge_4.py @@ -91,8 +91,8 @@ def _get_real(self, data_type, params): data = fetch_real_data( data_type, self.user, - start_date=self.init_params["start_date"], - end_date=self.init_params["end_date"], + start_date=params["start_date"], + end_date=params["end_date"], ) return data diff --git a/wearipedia/devices/fitbit/fitbit_sense.py b/wearipedia/devices/fitbit/fitbit_sense.py index a86c269c..6f392a00 100644 --- a/wearipedia/devices/fitbit/fitbit_sense.py +++ b/wearipedia/devices/fitbit/fitbit_sense.py @@ -96,8 +96,8 @@ def _get_real(self, data_type, params): data = fetch_real_data( data_type, self.user, - start_date=self.init_params["start_date"], - end_date=self.init_params["end_date"], + start_date=params["start_date"], + end_date=params["end_date"], ) return data From 3833712b029292be8c0d199981e437b031664256 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 09:20:24 -0500 Subject: [PATCH 13/26] Update fitbit_sense.py --- wearipedia/devices/fitbit/fitbit_sense.py | 1 + 1 file changed, 1 insertion(+) diff --git a/wearipedia/devices/fitbit/fitbit_sense.py b/wearipedia/devices/fitbit/fitbit_sense.py index 6f392a00..6eac682b 100644 --- a/wearipedia/devices/fitbit/fitbit_sense.py +++ b/wearipedia/devices/fitbit/fitbit_sense.py @@ -98,6 +98,7 @@ def _get_real(self, data_type, params): self.user, start_date=params["start_date"], end_date=params["end_date"], + single_date=params["single_date"], ) return data From 0be6a22f44636189beb13c1be54d81090f5704b0 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 09:33:23 -0500 Subject: [PATCH 14/26] Update fitbit_sense_fetch.py --- wearipedia/devices/fitbit/fitbit_sense_fetch.py | 1 - 1 file changed, 1 deletion(-) diff --git a/wearipedia/devices/fitbit/fitbit_sense_fetch.py b/wearipedia/devices/fitbit/fitbit_sense_fetch.py index a713f89f..a6932010 100644 --- a/wearipedia/devices/fitbit/fitbit_sense_fetch.py +++ b/wearipedia/devices/fitbit/fitbit_sense_fetch.py @@ -24,7 +24,6 @@ def fetch_real_data(data_type, access_token, start_date, end_date, single_date): :return: the data fetched from the API according to the inputs :rtype: List """ - single_date = start_date categories = { "sleep": { "url": f"https://api.fitbit.com/1.2/user/-/sleep/date/{start_date}/{end_date}.json" From a6504c02080ba005c199c4a74d5ab74a1043ad54 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 09:42:25 -0500 Subject: [PATCH 15/26] Update fitbit_charge_4.py --- wearipedia/devices/fitbit/fitbit_charge_4.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_charge_4.py b/wearipedia/devices/fitbit/fitbit_charge_4.py index b57541b0..270d3dfc 100644 --- a/wearipedia/devices/fitbit/fitbit_charge_4.py +++ b/wearipedia/devices/fitbit/fitbit_charge_4.py @@ -3,8 +3,8 @@ from ...utils import bin_search, seed_everything from ..device import BaseDevice from .fitbit_authenticate import * -from .fitbit_sense_fetch import * -from .fitbit_sense_gen import * +from .fitbit_charge4_fetch import * +from .fitbit_charge_4_gen import * class_name = "Fitbit_charge_4" From 55f3ba71d24282b1e498c91c62bd53ac3870abf7 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 10:44:12 -0500 Subject: [PATCH 16/26] fix synthetic data format --- tests/devices/fitbit/test_fitbit_charge_4.py | 14 ++++---- .../devices/fitbit/fitbit_charge_4_gen.py | 36 +++++++++++++++++++ 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/tests/devices/fitbit/test_fitbit_charge_4.py b/tests/devices/fitbit/test_fitbit_charge_4.py index 7c11b86c..6e538563 100644 --- a/tests/devices/fitbit/test_fitbit_charge_4.py +++ b/tests/devices/fitbit/test_fitbit_charge_4.py @@ -76,7 +76,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): }, ) minutesAsleep = [] - for datapoint in sleep: + for datapoint in sleep[0]["sleep"]: minutesAsleep.append(datapoint["minutesAsleep"]) assert len(minutesAsleep) >= 1, "Number of sleep data points should be at least 1" assert ( @@ -84,7 +84,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): ), f"Average minutes asleep should be less than 800 but was {sum(minutesAsleep) / len(minutesAsleep)}" steps_arr = [] - for datapoint in steps: + for datapoint in steps[0]["activities-steps"]: steps_arr.append(datapoint["value"]) assert len(steps_arr) >= 1, "Number of steps data points should be at least 1" assert ( @@ -92,7 +92,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): ), f"Average steps should be less than 20000 but was {sum(steps_arr) / len(steps_arr)}" light = [] - for datapoint in minutesLightlyActive: + for datapoint in minutesLightlyActive[0]["activities-minutesLightlyActive"]: light.append(datapoint["value"]) assert ( datapoint["value"] < 1440 @@ -100,7 +100,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): assert len(light) >= 1, "Number of light activity data points should be at least 1" fair = [] - for datapoint in minutesFairlyActive: + for datapoint in minutesFairlyActive[0]["activities-minutesFairlyActive"]: fair.append(datapoint["value"]) assert ( datapoint["value"] < 1440 @@ -110,7 +110,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): ), "Number of fairly active minutes data points should be at least 1" very = [] - for datapoint in minutesVeryActive: + for datapoint in minutesVeryActive[0]["activities-minutesVeryActive"]: very.append(datapoint["value"]) assert ( datapoint["value"] < 1440 @@ -120,7 +120,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): ), "Number of very active minutes data points should be at least 1" sedentary = [] - for datapoint in minutesSedentary: + for datapoint in minutesSedentary[0]["activities-minutesSedentary"]: sedentary.append(datapoint["value"]) assert ( datapoint["value"] < 1440 @@ -130,7 +130,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): ), "Number of sedentary minutes data points should be at least 1" distance_arr = [] - for datapoint in distance: + for datapoint in distance[0]["activities-distance"]: distance_arr.append(datapoint["value"]) assert ( sum(distance_arr) / len(distance_arr) < 30 diff --git a/wearipedia/devices/fitbit/fitbit_charge_4_gen.py b/wearipedia/devices/fitbit/fitbit_charge_4_gen.py index 1549b0d6..e76415bb 100644 --- a/wearipedia/devices/fitbit/fitbit_charge_4_gen.py +++ b/wearipedia/devices/fitbit/fitbit_charge_4_gen.py @@ -207,4 +207,40 @@ def create_syn_data(start_date, end_date): full_dict["distance"].append(activity[4]) full_dict["minutesSedentary"].append(activity[5]) + # encapsulate to match original data shape + data = [] + for ele in full_dict["sleep"]: + data.append(ele) + full_dict["sleep"] = [{"sleep": data}] + + data = [] + for ele in full_dict["steps"]: + data.append(ele) + full_dict["steps"] = [{"activities-steps": data}] + + data = [] + for ele in full_dict["minutesVeryActive"]: + data.append(ele) + full_dict["minutesVeryActive"] = [{"activities-minutesVeryActive": data}] + + data = [] + for ele in full_dict["minutesFairlyActive"]: + data.append(ele) + full_dict["minutesFairlyActive"] = [{"activities-minutesFairlyActive": data}] + + data = [] + for ele in full_dict["minutesLightlyActive"]: + data.append(ele) + full_dict["minutesLightlyActive"] = [{"activities-minutesLightlyActive": data}] + + data = [] + for ele in full_dict["distance"]: + data.append(ele) + full_dict["distance"] = [{"activities-distance": data}] + + data = [] + for ele in full_dict["minutesSedentary"]: + data.append(ele) + full_dict["minutesSedentary"] = [{"activities-minutesSedentary": data}] + return full_dict From a3234d07d4ad224088215b65fe1d49003c0e003e Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 10:55:11 -0500 Subject: [PATCH 17/26] test filter synthetic --- wearipedia/devices/fitbit/fitbit_charge_4.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_charge_4.py b/wearipedia/devices/fitbit/fitbit_charge_4.py index 270d3dfc..bf68b455 100644 --- a/wearipedia/devices/fitbit/fitbit_charge_4.py +++ b/wearipedia/devices/fitbit/fitbit_charge_4.py @@ -71,20 +71,20 @@ def _default_params(self): def _filter_synthetic(self, data, data_type, params): - date_format = "%Y-%m-%d" - date1 = datetime.strptime(self.init_params["synthetic_start_date"], date_format) - date2 = datetime.strptime(params["start_date"], date_format) + # date_format = "%Y-%m-%d" + # date1 = datetime.strptime(self.init_params["synthetic_start_date"], date_format) + # date2 = datetime.strptime(params["start_date"], date_format) - date3 = datetime.strptime(self.init_params["synthetic_end_date"], date_format) - date4 = datetime.strptime(params["end_date"], date_format) + # date3 = datetime.strptime(self.init_params["synthetic_end_date"], date_format) + # date4 = datetime.strptime(params["end_date"], date_format) - delta1 = date2 - date1 - delta2 = date3 - date4 + # delta1 = date2 - date1 + # delta2 = date3 - date4 - num_days_start = delta1.days - num_days_end = delta2.days + # num_days_start = delta1.days + # num_days_end = delta2.days - return data[num_days_start : -num_days_end + 1] + return data def _get_real(self, data_type, params): From fa563e9ed86059e74c97f81d8d79d339aee1b618 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 11:13:38 -0500 Subject: [PATCH 18/26] Update fitbit_charge_4.py --- wearipedia/devices/fitbit/fitbit_charge_4.py | 70 ++++++++++++++++---- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_charge_4.py b/wearipedia/devices/fitbit/fitbit_charge_4.py index bf68b455..0192ffc4 100644 --- a/wearipedia/devices/fitbit/fitbit_charge_4.py +++ b/wearipedia/devices/fitbit/fitbit_charge_4.py @@ -71,20 +71,62 @@ def _default_params(self): def _filter_synthetic(self, data, data_type, params): - # date_format = "%Y-%m-%d" - # date1 = datetime.strptime(self.init_params["synthetic_start_date"], date_format) - # date2 = datetime.strptime(params["start_date"], date_format) - - # date3 = datetime.strptime(self.init_params["synthetic_end_date"], date_format) - # date4 = datetime.strptime(params["end_date"], date_format) - - # delta1 = date2 - date1 - # delta2 = date3 - date4 - - # num_days_start = delta1.days - # num_days_end = delta2.days - - return data + date_format = "%Y-%m-%d" + date1 = datetime.strptime(self.init_params["synthetic_start_date"], date_format) + date2 = datetime.strptime(params["start_date"], date_format) + + date3 = datetime.strptime(self.init_params["synthetic_end_date"], date_format) + date4 = datetime.strptime(params["end_date"], date_format) + + delta1 = date2 - date1 + delta2 = date3 - date4 + + num_days_start = delta1.days + num_days_end = delta2.days + + if data_type == "sleep": + intermediary = data[0]["sleep"][num_days_start : -num_days_end + 1] + return [{"sleep": intermediary}] + + if data_type == "steps": + intermediary = data[0]["activities-steps"][ + num_days_start : -num_days_end + 1 + ] + return [{"activities-steps": intermediary}] + + if data_type == "sleep": + intermediary = data[0]["sleep"][num_days_start : -num_days_end + 1] + return [{"steps": intermediary}] + + if data_type == "minutesVeryActive": + intermediary = data[0]["activities-minutesVeryActive"][ + num_days_start : -num_days_end + 1 + ] + return [{"activities-minutesVeryActive": intermediary}] + + if data_type == "minutesLightlyActive": + intermediary = data[0]["activities-minutesLightlyActive"][ + num_days_start : -num_days_end + 1 + ] + return [{"activities-minutesLightlyActive": intermediary}] + + if data_type == "minutesFairlyActive": + intermediary = data[0]["activities-minutesFairlyActive"][ + num_days_start : -num_days_end + 1 + ] + return [{"activities-minutesFairlyActive": intermediary}] + + if data_type == "distance": + intermediary = data[0]["activities-distance"][ + num_days_start : -num_days_end + 1 + ] + return [{"activities-distance": intermediary}] + + if data_type == "minutesSedentary": + intermediary = data[0]["activities-minutesSedentary"][ + num_days_start : -num_days_end + 1 + ] + return [{"activities-minutesSedentary": intermediary}] def _get_real(self, data_type, params): From 143abe0d8cf73369a170dbf73964731d86ab5eca Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 11:34:52 -0500 Subject: [PATCH 19/26] fitbit sense data fix --- tests/devices/fitbit/test_fitbit_sense.py | 14 ++--- wearipedia/devices/fitbit/fitbit_sense.py | 54 ++++++++++++++++++- wearipedia/devices/fitbit/fitbit_sense_gen.py | 46 +++++++++++++++- 3 files changed, 105 insertions(+), 9 deletions(-) diff --git a/tests/devices/fitbit/test_fitbit_sense.py b/tests/devices/fitbit/test_fitbit_sense.py index 727650ff..537effa2 100644 --- a/tests/devices/fitbit/test_fitbit_sense.py +++ b/tests/devices/fitbit/test_fitbit_sense.py @@ -76,7 +76,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): }, ) minutesAsleep = [] - for datapoint in sleep: + for datapoint in sleep[0]["sleep"]: minutesAsleep.append(datapoint["minutesAsleep"]) assert len(minutesAsleep) >= 1, "Number of sleep data points should be at least 1" assert ( @@ -84,7 +84,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): ), f"Average minutes asleep should be less than 800 but was {sum(minutesAsleep) / len(minutesAsleep)}" steps_arr = [] - for datapoint in steps: + for datapoint in steps[0]["activities-steps"]: steps_arr.append(datapoint["value"]) assert len(steps_arr) >= 1, "Number of steps data points should be at least 1" assert ( @@ -92,7 +92,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): ), f"Average steps should be less than 20000 but was {sum(steps_arr) / len(steps_arr)}" light = [] - for datapoint in minutesLightlyActive: + for datapoint in minutesLightlyActive[0]["activities-minutesLightlyActive"]: light.append(datapoint["value"]) assert ( datapoint["value"] < 1440 @@ -100,7 +100,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): assert len(light) >= 1, "Number of light activity data points should be at least 1" fair = [] - for datapoint in minutesFairlyActive: + for datapoint in minutesFairlyActive[0]["activities-minutesFairlyActive"]: fair.append(datapoint["value"]) assert ( datapoint["value"] < 1440 @@ -110,7 +110,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): ), "Number of fairly active minutes data points should be at least 1" very = [] - for datapoint in minutesVeryActive: + for datapoint in minutesVeryActive[0]["activities-minutesVeryActive"]: very.append(datapoint["value"]) assert ( datapoint["value"] < 1440 @@ -120,7 +120,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): ), "Number of very active minutes data points should be at least 1" sedentary = [] - for datapoint in minutesSedentary: + for datapoint in minutesSedentary[0]["activities-minutesSedentary"]: sedentary.append(datapoint["value"]) assert ( datapoint["value"] < 1440 @@ -130,7 +130,7 @@ def helper_test(device, start_synthetic, end_synthetic, real): ), "Number of sedentary minutes data points should be at least 1" distance_arr = [] - for datapoint in distance: + for datapoint in distance[0]["activities-distance"]: distance_arr.append(datapoint["value"]) assert ( sum(distance_arr) / len(distance_arr) < 30 diff --git a/wearipedia/devices/fitbit/fitbit_sense.py b/wearipedia/devices/fitbit/fitbit_sense.py index 6eac682b..347550f9 100644 --- a/wearipedia/devices/fitbit/fitbit_sense.py +++ b/wearipedia/devices/fitbit/fitbit_sense.py @@ -89,7 +89,59 @@ def _filter_synthetic(self, data, data_type, params): num_days_start = delta1.days num_days_end = delta2.days - return data[num_days_start : -num_days_end + 1] + if data_type == "sleep": + intermediary = data[0]["sleep"][num_days_start : -num_days_end + 1] + return [{"sleep": intermediary}] + + if data_type == "steps": + intermediary = data[0]["activities-steps"][ + num_days_start : -num_days_end + 1 + ] + return [{"activities-steps": intermediary}] + + if data_type == "sleep": + intermediary = data[0]["sleep"][num_days_start : -num_days_end + 1] + return [{"steps": intermediary}] + + if data_type == "minutesVeryActive": + intermediary = data[0]["activities-minutesVeryActive"][ + num_days_start : -num_days_end + 1 + ] + return [{"activities-minutesVeryActive": intermediary}] + + if data_type == "minutesLightlyActive": + intermediary = data[0]["activities-minutesLightlyActive"][ + num_days_start : -num_days_end + 1 + ] + return [{"activities-minutesLightlyActive": intermediary}] + + if data_type == "minutesFairlyActive": + intermediary = data[0]["activities-minutesFairlyActive"][ + num_days_start : -num_days_end + 1 + ] + return [{"activities-minutesFairlyActive": intermediary}] + + if data_type == "distance": + intermediary = data[0]["activities-distance"][ + num_days_start : -num_days_end + 1 + ] + return [{"activities-distance": intermediary}] + + if data_type == "minutesSedentary": + intermediary = data[0]["activities-minutesSedentary"][ + num_days_start : -num_days_end + 1 + ] + return [{"activities-minutesSedentary": intermediary}] + + if data_type == "hrv": + intermediary = data[0]["hrv"][num_days_start : -num_days_end + 1] + return [{"hrv": intermediary}] + + if data_type == "distance_day": + return data + + if data_type == "heart_rate_day": + return data def _get_real(self, data_type, params): diff --git a/wearipedia/devices/fitbit/fitbit_sense_gen.py b/wearipedia/devices/fitbit/fitbit_sense_gen.py index d1b6fb56..4533234c 100644 --- a/wearipedia/devices/fitbit/fitbit_sense_gen.py +++ b/wearipedia/devices/fitbit/fitbit_sense_gen.py @@ -389,8 +389,52 @@ def create_syn_data(start_date, end_date): full_dict["minutesLightlyActive"].append(activity[3]) full_dict["distance"].append(activity[4]) full_dict["minutesSedentary"].append(activity[5]) - full_dict["heart_rate"].append(get_heart_rate(date)) + full_dict["heart_rate_day"].append(get_heart_rate(date)) full_dict["hrv"].append(get_hrv(date)) full_dict["distance_day"].append(get_distance_day(date)) + # encapsulate to match original data shape + data = [] + for ele in full_dict["sleep"]: + data.append(ele) + full_dict["sleep"] = [{"sleep": data}] + + data = [] + for ele in full_dict["steps"]: + data.append(ele) + full_dict["steps"] = [{"activities-steps": data}] + + data = [] + for ele in full_dict["minutesVeryActive"]: + data.append(ele) + full_dict["minutesVeryActive"] = [{"activities-minutesVeryActive": data}] + + data = [] + for ele in full_dict["minutesFairlyActive"]: + data.append(ele) + full_dict["minutesFairlyActive"] = [{"activities-minutesFairlyActive": data}] + + data = [] + for ele in full_dict["minutesLightlyActive"]: + data.append(ele) + full_dict["minutesLightlyActive"] = [{"activities-minutesLightlyActive": data}] + + data = [] + for ele in full_dict["distance"]: + data.append(ele) + full_dict["distance"] = [{"activities-distance": data}] + + data = [] + for ele in full_dict["minutesSedentary"]: + data.append(ele) + full_dict["minutesSedentary"] = [{"activities-minutesSedentary": data}] + + data = [] + for ele in full_dict["hrv"]: + data.append(ele) + full_dict["hrv"] = [{"hrv": data}] + + full_dict["distance_day"] = full_dict["distance_day"][0]["distance_day"] + full_dict["heart_rate_day"] = full_dict["heart_rate_day"][0]["heart_rate_day"] + return full_dict From 93a7f84374dfb145298d1ac11b99337bb4021033 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 18 Feb 2024 12:22:33 -0500 Subject: [PATCH 20/26] seed added to fitbits --- wearipedia/devices/fitbit/fitbit_charge_4.py | 1 + .../devices/fitbit/fitbit_charge_4_gen.py | 31 ++++++++++--------- wearipedia/devices/fitbit/fitbit_sense.py | 2 ++ wearipedia/devices/fitbit/fitbit_sense_gen.py | 30 +++++++++--------- wearipedia/devices/oura/oura_ring3_gen.py | 1 - 5 files changed, 36 insertions(+), 29 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_charge_4.py b/wearipedia/devices/fitbit/fitbit_charge_4.py index 0192ffc4..e8cffae4 100644 --- a/wearipedia/devices/fitbit/fitbit_charge_4.py +++ b/wearipedia/devices/fitbit/fitbit_charge_4.py @@ -141,6 +141,7 @@ def _get_real(self, data_type, params): def _gen_synthetic(self): syn_data = create_syn_data( + self.init_params["seed"], self.init_params["synthetic_start_date"], self.init_params["synthetic_end_date"], ) diff --git a/wearipedia/devices/fitbit/fitbit_charge_4_gen.py b/wearipedia/devices/fitbit/fitbit_charge_4_gen.py index e76415bb..fd2af743 100644 --- a/wearipedia/devices/fitbit/fitbit_charge_4_gen.py +++ b/wearipedia/devices/fitbit/fitbit_charge_4_gen.py @@ -1,4 +1,5 @@ import collections +import random from datetime import datetime, timedelta from random import choice, randrange @@ -16,11 +17,11 @@ def get_sleep(date): :rtype: dictionary """ - duration = np.random.randint(14400, 36000) + duration = random.randint(14400, 36000) - awake = np.random.randint(2, 9) - afterwake = np.random.randint(0, 200) / 100 - tofall = np.random.randint(0, 200) / 100 + awake = random.randint(2, 9) + afterwake = random.randint(0, 200) / 100 + tofall = random.randint(0, 200) / 100 percents = (100 - awake - afterwake - tofall, awake, afterwake, tofall) start = datetime.strptime(f"{date} 9:00 PM", "%Y-%m-%d %I:%M %p") @@ -29,7 +30,7 @@ def get_sleep(date): # generate random date delta = end - start int_delta = (delta.days * 24 * 60 * 60) + delta.seconds - random_second = randrange(int_delta) + random_second = random.randrange(int_delta) start_time = start + timedelta(seconds=random_second) end_time = start_time + timedelta(seconds=duration) @@ -37,11 +38,11 @@ def get_sleep(date): sleep_dict = { "dateOfSleep": date, "duration": duration * 1000, - "efficiency": np.random.randint(90, 99), + "efficiency": random.randint(90, 99), "endTime": str(end_time.isoformat()), "infoCode": 0, "isMainSleep": True, - "logId": np.random.randint(0, 1000000000), + "logId": random.randint(0, 1000000000), "logType": "auto_detected", "minutesAfterWakeup": round(duration / 60 * percents[2] / 100), "minutesAsleep": round(duration / 60 * percents[0] / 100), @@ -72,7 +73,7 @@ def get_sleep(date): def split_the_duration(duration): saver_of_duration = duration while duration > 1: - n = np.random.randint(1, round(saver_of_duration / 12)) + n = random.randint(1, round(saver_of_duration / 12)) if duration - n >= 0: yield n else: @@ -104,7 +105,7 @@ def split_the_duration(duration): if i != 0: start_phases += timedelta(seconds=arr_of_durations[i - 1]) - type = choice(["deep", "rem", "light"]) + type = random.choice(["deep", "rem", "light"]) sleep_dict["levels"]["summary"][type]["count"] += 1 sleep_dict["levels"]["summary"][type]["minutes"] += round(item / 60) @@ -118,7 +119,7 @@ def split_the_duration(duration): # generate random date delta = end_time - start_time int_delta = (delta.days * 24 * 60 * 60) + delta.seconds - random_second = randrange(int_delta) + random_second = random.randrange(int_delta) randtime = start_time + timedelta(seconds=random_second) start_time = start_time + timedelta(seconds=arr_of_durations[i - 1]) @@ -138,9 +139,9 @@ def get_activity(date): :rtype: dictionary """ - very_active = np.random.randint(0, 240) - fairly_active = np.random.randint(0, 240) - lightly_active = np.random.randint(0, 240) + very_active = random.randint(0, 240) + fairly_active = random.randint(0, 240) + lightly_active = random.randint(0, 240) steps = { "dateTime": date, @@ -168,7 +169,7 @@ def get_activity(date): ) -def create_syn_data(start_date, end_date): +def create_syn_data(seed, start_date, end_date): """Returns a defaultdict of heart_rate data, activity data, "sleep", "steps","minutesVeryActive", "minutesLightlyActive", "minutesFairlyActive", "distance", "minutesSedentary" :param start_date: the start date (inclusive) as a string in the format "YYYY-MM-DD" @@ -179,6 +180,8 @@ def create_syn_data(start_date, end_date): :rtype: defaultdict """ + random.seed(seed) + num_days = ( datetime.strptime(end_date, "%Y-%m-%d") - datetime.strptime(start_date, "%Y-%m-%d") diff --git a/wearipedia/devices/fitbit/fitbit_sense.py b/wearipedia/devices/fitbit/fitbit_sense.py index 347550f9..543d393b 100644 --- a/wearipedia/devices/fitbit/fitbit_sense.py +++ b/wearipedia/devices/fitbit/fitbit_sense.py @@ -68,6 +68,7 @@ def __init__( def _default_params(self): params = { + "seed": 0, "start_date": "2022-06-30", "end_date": "2023-01-01", } @@ -157,6 +158,7 @@ def _get_real(self, data_type, params): def _gen_synthetic(self): syn_data = create_syn_data( + self.init_params["seed"], self.init_params["synthetic_start_date"], self.init_params["synthetic_end_date"], ) diff --git a/wearipedia/devices/fitbit/fitbit_sense_gen.py b/wearipedia/devices/fitbit/fitbit_sense_gen.py index 4533234c..c49b0a26 100644 --- a/wearipedia/devices/fitbit/fitbit_sense_gen.py +++ b/wearipedia/devices/fitbit/fitbit_sense_gen.py @@ -18,11 +18,11 @@ def get_sleep(date): :rtype: dictionary """ - duration = np.random.randint(14400, 36000) + duration = random.randint(14400, 36000) - awake = np.random.randint(2, 9) - afterwake = np.random.randint(0, 200) / 100 - tofall = np.random.randint(0, 200) / 100 + awake = random.randint(2, 9) + afterwake = random.randint(0, 200) / 100 + tofall = random.randint(0, 200) / 100 percents = (100 - awake - afterwake - tofall, awake, afterwake, tofall) start = datetime.strptime(date + " 9:00 PM", "%Y-%m-%d %I:%M %p") @@ -39,11 +39,11 @@ def get_sleep(date): sleep_dict = { "dateOfSleep": date, "duration": duration * 1000, - "efficiency": np.random.randint(90, 99), + "efficiency": random.randint(90, 99), "endTime": str(end_time.isoformat()), "infoCode": 0, "isMainSleep": True, - "logId": np.random.randint(0, 1000000000), + "logId": random.randint(0, 1000000000), "logType": "auto_detected", "minutesAfterWakeup": round(duration / 60 * percents[2] / 100), "minutesAsleep": round(duration / 60 * percents[0] / 100), @@ -74,7 +74,7 @@ def get_sleep(date): def split_the_duration(duration): saver_of_duration = duration while duration > 1: - n = np.random.randint(1, round(saver_of_duration / 12)) + n = random.randint(1, round(saver_of_duration / 12)) if duration - n >= 0: yield n else: @@ -142,9 +142,9 @@ def get_activity(date): :rtype: dictionary """ - very_active = np.random.randint(0, 240) - fairly_active = np.random.randint(0, 240) - lightly_active = np.random.randint(0, 240) + very_active = random.randint(0, 240) + fairly_active = random.randint(0, 240) + lightly_active = random.randint(0, 240) minutes_in_a_day = 1440 @@ -293,8 +293,8 @@ def get_hrv(date): "hrv": [ { "value": { - "dailyRmssd": np.random.randint(13, 48), - "deepRmssd": np.random.randint(13, 48), + "dailyRmssd": random.randint(13, 48), + "deepRmssd": random.randint(13, 48), }, "dateTime": date, } @@ -338,7 +338,7 @@ def get_distance_day(date): if max_distance[0] == 0: val = 0 else: - val = np.random.randint(1, 1000) / 10000 + val = random.randint(1, 1000) / 10000 distance_day["distance_day"][0]["activities-distance-intraday"][ "dataset" @@ -351,7 +351,7 @@ def get_distance_day(date): return distance_day -def create_syn_data(start_date, end_date): +def create_syn_data(seed, start_date, end_date): """Returns a defaultdict of heart_rate data, activity data, "sleep", "steps","minutesVeryActive", "minutesLightlyActive", "minutesFairlyActive", "distance", "minutesSedentary", "heart_rate_day", "hrv", "distance_day" :param start_date: the start date (inclusive) as a string in the format "YYYY-MM-DD" @@ -362,6 +362,8 @@ def create_syn_data(start_date, end_date): :rtype: defaultdict """ + random.seed(seed) + num_days = ( datetime.strptime(end_date, "%Y-%m-%d") - datetime.strptime(start_date, "%Y-%m-%d") diff --git a/wearipedia/devices/oura/oura_ring3_gen.py b/wearipedia/devices/oura/oura_ring3_gen.py index a896f298..82e37978 100644 --- a/wearipedia/devices/oura/oura_ring3_gen.py +++ b/wearipedia/devices/oura/oura_ring3_gen.py @@ -1,5 +1,4 @@ import collections -import random from datetime import datetime, timedelta import numpy as np From f1b519d405a298e4eae8ca3370c99f34926b6dc2 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Fri, 1 Mar 2024 05:47:24 -0500 Subject: [PATCH 21/26] Update oura_ring3_gen.py --- wearipedia/devices/oura/oura_ring3_gen.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wearipedia/devices/oura/oura_ring3_gen.py b/wearipedia/devices/oura/oura_ring3_gen.py index 82e37978..4676703b 100644 --- a/wearipedia/devices/oura/oura_ring3_gen.py +++ b/wearipedia/devices/oura/oura_ring3_gen.py @@ -190,11 +190,11 @@ def get_activity(date): steps = np.random.randint(8000, 15000) daily_movement = np.random.randint(7000, 12000) - non_wear = np.random.randint(0, 120) - rest = np.random.randint(400, 600) + non_wear = np.random.randint(0, 120) * 60 + rest = np.random.randint(400, 600) * 60 inactive = np.random.randint(500, 800) low = np.random.randint(200, 400) - medium = np.random.randint(50, 150) + medium = np.random.randint(50, 150) * 60 high = np.random.randint(0, 20) inactivity_alerts = np.random.randint(0, 3) average_met = round(np.random.uniform(1.0, 1.8), 2) From db2a3ae5a5f868e784ebbfa30001cd30b4bce226 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 3 Mar 2024 00:45:17 -0500 Subject: [PATCH 22/26] Update fitbit_sense_gen.py --- wearipedia/devices/fitbit/fitbit_sense_gen.py | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_sense_gen.py b/wearipedia/devices/fitbit/fitbit_sense_gen.py index c49b0a26..0f4152e1 100644 --- a/wearipedia/devices/fitbit/fitbit_sense_gen.py +++ b/wearipedia/devices/fitbit/fitbit_sense_gen.py @@ -331,18 +331,21 @@ def get_distance_day(date): minutes_in_a_day = 1440 for i in range(minutes_in_a_day): + if ( + the_time.hour >= 6 and the_time.hour < 22 + ): # Only consider daytime (6 am to 10 pm) + distance = [0, 0.1] + weights = [0.6, 0.3] + max_distance = choices(distance, weights) + if max_distance[0] == 0: + val = 0 + else: + val = random.randint(1, 1000) / 10000 - distance = [0, 0.1] - weights = [0.6, 0.3] - max_distance = choices(distance, weights) - if max_distance[0] == 0: - val = 0 - else: - val = random.randint(1, 1000) / 10000 + distance_day["distance_day"][0]["activities-distance-intraday"][ + "dataset" + ].append({"time": the_time.strftime("%H:%M:%S"), "value": val}) - distance_day["distance_day"][0]["activities-distance-intraday"][ - "dataset" - ].append({"time": the_time.strftime("%H:%M:%S"), "value": val}) newtime = ( datetime.combine(datetime.today(), the_time) + timedelta(seconds=60) ).time() @@ -440,3 +443,6 @@ def create_syn_data(seed, start_date, end_date): full_dict["heart_rate_day"] = full_dict["heart_rate_day"][0]["heart_rate_day"] return full_dict + + +print(create_syn_data(100, "2022-02-02", "2022-02-03")) From cabfbde5f3022b741c6d57bed609a3cc129a128c Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 3 Mar 2024 00:47:51 -0500 Subject: [PATCH 23/26] Update fitbit_sense_gen.py --- wearipedia/devices/fitbit/fitbit_sense_gen.py | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_sense_gen.py b/wearipedia/devices/fitbit/fitbit_sense_gen.py index 0f4152e1..c49b0a26 100644 --- a/wearipedia/devices/fitbit/fitbit_sense_gen.py +++ b/wearipedia/devices/fitbit/fitbit_sense_gen.py @@ -331,21 +331,18 @@ def get_distance_day(date): minutes_in_a_day = 1440 for i in range(minutes_in_a_day): - if ( - the_time.hour >= 6 and the_time.hour < 22 - ): # Only consider daytime (6 am to 10 pm) - distance = [0, 0.1] - weights = [0.6, 0.3] - max_distance = choices(distance, weights) - if max_distance[0] == 0: - val = 0 - else: - val = random.randint(1, 1000) / 10000 - distance_day["distance_day"][0]["activities-distance-intraday"][ - "dataset" - ].append({"time": the_time.strftime("%H:%M:%S"), "value": val}) + distance = [0, 0.1] + weights = [0.6, 0.3] + max_distance = choices(distance, weights) + if max_distance[0] == 0: + val = 0 + else: + val = random.randint(1, 1000) / 10000 + distance_day["distance_day"][0]["activities-distance-intraday"][ + "dataset" + ].append({"time": the_time.strftime("%H:%M:%S"), "value": val}) newtime = ( datetime.combine(datetime.today(), the_time) + timedelta(seconds=60) ).time() @@ -443,6 +440,3 @@ def create_syn_data(seed, start_date, end_date): full_dict["heart_rate_day"] = full_dict["heart_rate_day"][0]["heart_rate_day"] return full_dict - - -print(create_syn_data(100, "2022-02-02", "2022-02-03")) From e0ea7401a9ce06485fd71fd3d4a3663a7b4d7421 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Sun, 3 Mar 2024 01:01:09 -0500 Subject: [PATCH 24/26] Update fitbit_sense_gen.py --- wearipedia/devices/fitbit/fitbit_sense_gen.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/wearipedia/devices/fitbit/fitbit_sense_gen.py b/wearipedia/devices/fitbit/fitbit_sense_gen.py index c49b0a26..07f0d69a 100644 --- a/wearipedia/devices/fitbit/fitbit_sense_gen.py +++ b/wearipedia/devices/fitbit/fitbit_sense_gen.py @@ -331,7 +331,6 @@ def get_distance_day(date): minutes_in_a_day = 1440 for i in range(minutes_in_a_day): - distance = [0, 0.1] weights = [0.6, 0.3] max_distance = choices(distance, weights) @@ -340,6 +339,9 @@ def get_distance_day(date): else: val = random.randint(1, 1000) / 10000 + if 0 <= the_time.hour < 6 or 21 <= the_time.hour < 24: + val = 0 + distance_day["distance_day"][0]["activities-distance-intraday"][ "dataset" ].append({"time": the_time.strftime("%H:%M:%S"), "value": val}) @@ -440,3 +442,6 @@ def create_syn_data(seed, start_date, end_date): full_dict["heart_rate_day"] = full_dict["heart_rate_day"][0]["heart_rate_day"] return full_dict + + +print(get_distance_day("2022-02-02")) From b42d907f4355df7f0826a60ea27aac723772a453 Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Mon, 15 Apr 2024 02:43:26 -0400 Subject: [PATCH 25/26] Fixes --- wearipedia/devices/fitbit/fitbit_charge_4_gen.py | 6 +++--- wearipedia/devices/fitbit/fitbit_sense_gen.py | 3 --- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_charge_4_gen.py b/wearipedia/devices/fitbit/fitbit_charge_4_gen.py index fd2af743..0b9653ad 100644 --- a/wearipedia/devices/fitbit/fitbit_charge_4_gen.py +++ b/wearipedia/devices/fitbit/fitbit_charge_4_gen.py @@ -136,7 +136,7 @@ def get_activity(date): :param date: the date as a string in the format "YYYY-MM-DD" :type date: str :return: dictionaries of "steps", "minutesVeryActive", "minutesFairlyActive", "minutesLightlyActive", "distance", "minutesSedentary" - :rtype: dictionary + :rtype: tuple(dictionary) """ very_active = random.randint(0, 240) @@ -170,13 +170,13 @@ def get_activity(date): def create_syn_data(seed, start_date, end_date): - """Returns a defaultdict of heart_rate data, activity data, "sleep", "steps","minutesVeryActive", "minutesLightlyActive", "minutesFairlyActive", "distance", "minutesSedentary" + """Returns a defaultdict of "activity data", "sleep", "steps","minutesVeryActive", "minutesLightlyActive", "minutesFairlyActive", "distance", "minutesSedentary" :param start_date: the start date (inclusive) as a string in the format "YYYY-MM-DD" :type start_date: str :param end_date: the end date (inclusive) as a string in the format "YYYY-MM-DD" :type end_date: str - :return: a defaultdict of heart_rate data, activity data, "sleep", "steps","minutesVeryActive", "minutesLightlyActive", "minutesFairlyActive", "distance", "minutesSedentary" + :return: a defaultdict of "activity data", "sleep", "steps","minutesVeryActive", "minutesLightlyActive", "minutesFairlyActive", "distance", "minutesSedentary" :rtype: defaultdict """ diff --git a/wearipedia/devices/fitbit/fitbit_sense_gen.py b/wearipedia/devices/fitbit/fitbit_sense_gen.py index 07f0d69a..6285b74e 100644 --- a/wearipedia/devices/fitbit/fitbit_sense_gen.py +++ b/wearipedia/devices/fitbit/fitbit_sense_gen.py @@ -442,6 +442,3 @@ def create_syn_data(seed, start_date, end_date): full_dict["heart_rate_day"] = full_dict["heart_rate_day"][0]["heart_rate_day"] return full_dict - - -print(get_distance_day("2022-02-02")) From d0d4e4dac0e984e9f9a18638c54df4b907f33c3e Mon Sep 17 00:00:00 2001 From: "Mohamed (Soliman) Elhussiny" Date: Mon, 15 Apr 2024 21:51:16 -0400 Subject: [PATCH 26/26] refactoring code --- wearipedia/devices/fitbit/fitbit_charge_4.py | 57 ++++----------- .../devices/fitbit/fitbit_charge_4_gen.py | 41 ++++------- wearipedia/devices/fitbit/fitbit_sense.py | 72 +++++-------------- wearipedia/devices/fitbit/fitbit_sense_gen.py | 45 ++++-------- 4 files changed, 61 insertions(+), 154 deletions(-) diff --git a/wearipedia/devices/fitbit/fitbit_charge_4.py b/wearipedia/devices/fitbit/fitbit_charge_4.py index e8cffae4..2c5d7c69 100644 --- a/wearipedia/devices/fitbit/fitbit_charge_4.py +++ b/wearipedia/devices/fitbit/fitbit_charge_4.py @@ -84,49 +84,20 @@ def _filter_synthetic(self, data, data_type, params): num_days_start = delta1.days num_days_end = delta2.days - if data_type == "sleep": - intermediary = data[0]["sleep"][num_days_start : -num_days_end + 1] - return [{"sleep": intermediary}] - - if data_type == "steps": - intermediary = data[0]["activities-steps"][ - num_days_start : -num_days_end + 1 - ] - return [{"activities-steps": intermediary}] - - if data_type == "sleep": - intermediary = data[0]["sleep"][num_days_start : -num_days_end + 1] - return [{"steps": intermediary}] - - if data_type == "minutesVeryActive": - intermediary = data[0]["activities-minutesVeryActive"][ - num_days_start : -num_days_end + 1 - ] - return [{"activities-minutesVeryActive": intermediary}] - - if data_type == "minutesLightlyActive": - intermediary = data[0]["activities-minutesLightlyActive"][ - num_days_start : -num_days_end + 1 - ] - return [{"activities-minutesLightlyActive": intermediary}] - - if data_type == "minutesFairlyActive": - intermediary = data[0]["activities-minutesFairlyActive"][ - num_days_start : -num_days_end + 1 - ] - return [{"activities-minutesFairlyActive": intermediary}] - - if data_type == "distance": - intermediary = data[0]["activities-distance"][ - num_days_start : -num_days_end + 1 - ] - return [{"activities-distance": intermediary}] - - if data_type == "minutesSedentary": - intermediary = data[0]["activities-minutesSedentary"][ - num_days_start : -num_days_end + 1 - ] - return [{"activities-minutesSedentary": intermediary}] + key_map = { + "sleep": "sleep", + "steps": "activities-steps", + "minutesVeryActive": "activities-minutesVeryActive", + "minutesLightlyActive": "activities-minutesLightlyActive", + "minutesFairlyActive": "activities-minutesFairlyActive", + "distance": "activities-distance", + "minutesSedentary": "activities-minutesSedentary", + } + + if data_type in key_map: + key = key_map[data_type] + intermediary = data[0][key][num_days_start : -num_days_end + 1] + return [{key: intermediary}] def _get_real(self, data_type, params): diff --git a/wearipedia/devices/fitbit/fitbit_charge_4_gen.py b/wearipedia/devices/fitbit/fitbit_charge_4_gen.py index 0b9653ad..8681c421 100644 --- a/wearipedia/devices/fitbit/fitbit_charge_4_gen.py +++ b/wearipedia/devices/fitbit/fitbit_charge_4_gen.py @@ -216,34 +216,19 @@ def create_syn_data(seed, start_date, end_date): data.append(ele) full_dict["sleep"] = [{"sleep": data}] - data = [] - for ele in full_dict["steps"]: - data.append(ele) - full_dict["steps"] = [{"activities-steps": data}] - - data = [] - for ele in full_dict["minutesVeryActive"]: - data.append(ele) - full_dict["minutesVeryActive"] = [{"activities-minutesVeryActive": data}] - - data = [] - for ele in full_dict["minutesFairlyActive"]: - data.append(ele) - full_dict["minutesFairlyActive"] = [{"activities-minutesFairlyActive": data}] - - data = [] - for ele in full_dict["minutesLightlyActive"]: - data.append(ele) - full_dict["minutesLightlyActive"] = [{"activities-minutesLightlyActive": data}] - - data = [] - for ele in full_dict["distance"]: - data.append(ele) - full_dict["distance"] = [{"activities-distance": data}] + keys_to_update = [ + "steps", + "minutesVeryActive", + "minutesFairlyActive", + "minutesLightlyActive", + "distance", + "minutesSedentary", + ] - data = [] - for ele in full_dict["minutesSedentary"]: - data.append(ele) - full_dict["minutesSedentary"] = [{"activities-minutesSedentary": data}] + for key in keys_to_update: + data = [] + for ele in full_dict[key]: + data.append(ele) + full_dict[key] = [{f"activities-{key}": data}] return full_dict diff --git a/wearipedia/devices/fitbit/fitbit_sense.py b/wearipedia/devices/fitbit/fitbit_sense.py index 543d393b..8a8e50a5 100644 --- a/wearipedia/devices/fitbit/fitbit_sense.py +++ b/wearipedia/devices/fitbit/fitbit_sense.py @@ -90,59 +90,25 @@ def _filter_synthetic(self, data, data_type, params): num_days_start = delta1.days num_days_end = delta2.days - if data_type == "sleep": - intermediary = data[0]["sleep"][num_days_start : -num_days_end + 1] - return [{"sleep": intermediary}] - - if data_type == "steps": - intermediary = data[0]["activities-steps"][ - num_days_start : -num_days_end + 1 - ] - return [{"activities-steps": intermediary}] - - if data_type == "sleep": - intermediary = data[0]["sleep"][num_days_start : -num_days_end + 1] - return [{"steps": intermediary}] - - if data_type == "minutesVeryActive": - intermediary = data[0]["activities-minutesVeryActive"][ - num_days_start : -num_days_end + 1 - ] - return [{"activities-minutesVeryActive": intermediary}] - - if data_type == "minutesLightlyActive": - intermediary = data[0]["activities-minutesLightlyActive"][ - num_days_start : -num_days_end + 1 - ] - return [{"activities-minutesLightlyActive": intermediary}] - - if data_type == "minutesFairlyActive": - intermediary = data[0]["activities-minutesFairlyActive"][ - num_days_start : -num_days_end + 1 - ] - return [{"activities-minutesFairlyActive": intermediary}] - - if data_type == "distance": - intermediary = data[0]["activities-distance"][ - num_days_start : -num_days_end + 1 - ] - return [{"activities-distance": intermediary}] - - if data_type == "minutesSedentary": - intermediary = data[0]["activities-minutesSedentary"][ - num_days_start : -num_days_end + 1 - ] - return [{"activities-minutesSedentary": intermediary}] - - if data_type == "hrv": - intermediary = data[0]["hrv"][num_days_start : -num_days_end + 1] - return [{"hrv": intermediary}] - - if data_type == "distance_day": - return data - - if data_type == "heart_rate_day": - return data + key_map = { + "sleep": "sleep", + "steps": "activities-steps", + "minutesVeryActive": "activities-minutesVeryActive", + "minutesLightlyActive": "activities-minutesLightlyActive", + "minutesFairlyActive": "activities-minutesFairlyActive", + "distance": "activities-distance", + "minutesSedentary": "activities-minutesSedentary", + "hrv": "hrv", + "distance_day": None, + "heart_rate_day": None, + } + + if data_type in key_map: + key = key_map[data_type] + if key is None: + return data + intermediary = data[0][key][num_days_start : -num_days_end + 1] + return [{key: intermediary}] def _get_real(self, data_type, params): diff --git a/wearipedia/devices/fitbit/fitbit_sense_gen.py b/wearipedia/devices/fitbit/fitbit_sense_gen.py index 6285b74e..792d1969 100644 --- a/wearipedia/devices/fitbit/fitbit_sense_gen.py +++ b/wearipedia/devices/fitbit/fitbit_sense_gen.py @@ -403,41 +403,26 @@ def create_syn_data(seed, start_date, end_date): data.append(ele) full_dict["sleep"] = [{"sleep": data}] - data = [] - for ele in full_dict["steps"]: - data.append(ele) - full_dict["steps"] = [{"activities-steps": data}] - - data = [] - for ele in full_dict["minutesVeryActive"]: - data.append(ele) - full_dict["minutesVeryActive"] = [{"activities-minutesVeryActive": data}] - - data = [] - for ele in full_dict["minutesFairlyActive"]: - data.append(ele) - full_dict["minutesFairlyActive"] = [{"activities-minutesFairlyActive": data}] - - data = [] - for ele in full_dict["minutesLightlyActive"]: - data.append(ele) - full_dict["minutesLightlyActive"] = [{"activities-minutesLightlyActive": data}] - - data = [] - for ele in full_dict["distance"]: - data.append(ele) - full_dict["distance"] = [{"activities-distance": data}] - - data = [] - for ele in full_dict["minutesSedentary"]: - data.append(ele) - full_dict["minutesSedentary"] = [{"activities-minutesSedentary": data}] - data = [] for ele in full_dict["hrv"]: data.append(ele) full_dict["hrv"] = [{"hrv": data}] + keys_to_update = [ + "steps", + "minutesVeryActive", + "minutesFairlyActive", + "minutesLightlyActive", + "distance", + "minutesSedentary", + ] + + for key in keys_to_update: + data = [] + for ele in full_dict[key]: + data.append(ele) + full_dict[key] = [{f"activities-{key}": data}] + full_dict["distance_day"] = full_dict["distance_day"][0]["distance_day"] full_dict["heart_rate_day"] = full_dict["heart_rate_day"][0]["heart_rate_day"]