Exemple #1
0
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
Exemple #2
0
    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