def load_file_data(*, path: str) -> Activity: """ Get the peak data from the nominated file. Args: path: The file to load. Returns: The peak data we loaded from the file. """ # Open the file. fitfile = FitFile(path) # Load the power and heart rate data. loaded_data = _load_file_data(fitfile=fitfile) # Setup the activity object activity = Activity() activity.start_time = loaded_data.start_time activity.end_time = loaded_data.end_time activity.moving_time = loaded_data.moving_time activity.activity_name = None activity.elevation = None activity.distance = loaded_data.distance activity.avg_power = int(sum(loaded_data.power) / loaded_data.moving_time) activity.max_power = max(loaded_data.power) activity.normalised_power = calculate_normalised_power( power=loaded_data.power) activity.avg_hr = int(sum(loaded_data.hr) / loaded_data.moving_time) activity.max_hr = max(loaded_data.hr) activity.raw_power = loaded_data.power activity.raw_hr = loaded_data.hr _load_peaks(source=loaded_data.power, attributes=POWER_AVERAGES, activity=activity) _load_peaks(source=loaded_data.hr, attributes=HR_AVERAGES, activity=activity) # Done. return activity
def _create_activity(self, *, record: Tuple) -> Activity: """ Create an Activities object given a database record. Args: record: The data we've retrieved from SQLite. Returns: The activity data object. """ # Create the new activity object. activity = Activity() # Fetch the row ID activity.rowid = record[SelectIndices.RowId.value] activity.zwift_id = record[SelectIndices.ZwiftId.value] activity.s3_url = record[SelectIndices.S3Url.value] # Setup timezones. src_tz = tz.tzutc() dst_tz = tz.tzlocal() # Fetch the start time. We see two formats here: # yyyy-mm-dd hh:mm:ss — UTC # yyyy-mm-dd hh:mm:ss+hh:mm - Local time # UTC times we correct to local times; local times we use verbatim. raw_start_time = record[SelectIndices.StartTime.value] if "+" in raw_start_time: time_parts = raw_start_time.split("+") activity.start_time = datetime.strptime(time_parts[0], "%Y-%m-%d %H:%M:%S") else: activity.start_time = datetime.strptime(raw_start_time, "%Y-%m-%d %H:%M:%S") utc = activity.start_time.replace(tzinfo=src_tz) activity.start_time = utc.astimezone(dst_tz) # Fetch the end time. Same deal as the start time with TZ data... raw_end_time = record[SelectIndices.EndTime.value] if "+" in raw_end_time: time_parts = raw_end_time.split("+") activity.end_time = datetime.strptime(time_parts[0], "%Y-%m-%d %H:%M:%S") else: activity.end_time = datetime.strptime(raw_end_time, "%Y-%m-%d %H:%M:%S") utc = activity.end_time.replace(tzinfo=src_tz) activity.end_time = utc.astimezone(dst_tz) # Fetch the moving time activity.moving_time = record[SelectIndices.MovingTime.value] # Fetch activity name and distance activity.distance = record[SelectIndices.Distance.value] activity.elevation = record[SelectIndices.Elevation.value] activity.activity_name = record[SelectIndices.ActivityName.value] # Fetch overall power and HR data activity.avg_power = record[SelectIndices.AvgPower.value] activity.max_power = record[SelectIndices.MaxPower.value] activity.normalised_power = record[SelectIndices.NormalisedPower.value] activity.avg_hr = record[SelectIndices.AvgHr.value] activity.max_hr = record[SelectIndices.MaxHr.value] # Fetch raw power and HR activity.raw_power = [int(p) for p in record[SelectIndices.RawPower.value].split(",")] activity.raw_hr = [int(hr) for hr in record[SelectIndices.RawHr.value].split(",")] # Fetch power peaks activity.peak_5sec_power = record[SelectIndices.Peak5SecPower.value] activity.peak_30sec_power = record[SelectIndices.Peak30SecPower.value] activity.peak_60sec_power = record[SelectIndices.Peak60SecPower.value] activity.peak_5min_power = record[SelectIndices.Peak5MinPower.value] activity.peak_10min_power = record[SelectIndices.Peak10MinPower.value] activity.peak_20min_power = record[SelectIndices.Peak20MinPower.value] activity.peak_30min_power = record[SelectIndices.Peak30MinPower.value] activity.peak_60min_power = record[SelectIndices.Peak60MinPower.value] activity.peak_90min_power = record[SelectIndices.Peak90MinPower.value] activity.peak_120min_power = record[SelectIndices.Peak120MinPower.value] # Fetch HR peaks activity.peak_5sec_hr = record[SelectIndices.Peak5SecHr.value] activity.peak_30sec_hr = record[SelectIndices.Peak30SecHr.value] activity.peak_60sec_hr = record[SelectIndices.Peak60SecHr.value] activity.peak_5min_hr = record[SelectIndices.Peak5MinHr.value] activity.peak_10min_hr = record[SelectIndices.Peak10MinHr.value] activity.peak_20min_hr = record[SelectIndices.Peak20MinHr.value] activity.peak_30min_hr = record[SelectIndices.Peak30MinHr.value] activity.peak_60min_hr = record[SelectIndices.Peak60MinHr.value] activity.peak_90min_hr = record[SelectIndices.Peak90MinHr.value] activity.peak_120min_hr = record[SelectIndices.Peak120MinHr.value] # Done. return activity