Skip to main content

A Python library to extract FitBit Google Takeout data.

Project description

pyFitOut

GitHub license PyPI - Python Version semver GitHub tag (latest SemVer) Code style: autopep8

The pyFitOut project is an open source Python library for extracting FitBit data from Google Takeout.

Installation

Use pip to install:

pip install fitout

Example

How to use pyFitOut:

Export

Export your FitBit data, using Google Takeout.

Note: Currently only export to zip is supported, and the zip files must be extracted to your local drive.

Once the export is complete, download the zip file and extract it. I use C:\Dev\Fitbit\Google\Takeout. This directory is the takeout_dir.

Trivial Example

import fitout as fo
from datetime import date

def main():
    # Specify the location where the Takeout zip files was extracted
    takeout_dir = "C:\Dev\Fitbit\Google\Takeout"
    # Use the NativeFileLoader to load the data from the extracted files
    data_source = fo.NativeFileLoader(takeout_dir)

    # Specify the desired date range.
    start_date = date(2024, 10, 1)
    end_date = date(2024, 11, 5)

    # Generate a list of dates for the date range, for informational or plotting purposes.
    dates = fo.dates_array(start_date, end_date)
    print("Dates:", dates)

    # Create the breathing rate importer and fetch the data.
    breather_importer = fo.BreathingRate(data_source, 1)
    breathing_data = breather_importer.get_data(start_date, end_date)
    print("Breathing rate:", breathing_data)

    # Create the heart rate variability importer and fetch the data.
    hrv_importer = fo.HeartRateVariability(data_source)
    hrv_data = hrv_importer.get_data(start_date, end_date)
    print("HRV:", hrv_data)

    # Create the resting heart rate importer and fetch the data.
    rhr_importer = fo.RestingHeartRate(data_source)
    rhr_data = rhr_importer.get_data(start_date, end_date)
    print("RHR:", rhr_data)


if __name__ == "__main__":
    main()

Plotting Example with Numpy and Matplotlib

from datetime import date
import numpy as np
import matplotlib.pyplot as plt
import fitout as fo

def main():
    # Specify the location where the Takeout zip files was extracted
    takeout_dir = "C:\Dev\Fitbit\Google\Takeout"
    # Use the NativeFileLoader to load the data from the extracted files
    data_source = fo.NativeFileLoader(takeout_dir)

    # Specify the desired date range.
    start_date = date(2024, 10, 1)
    end_date = date(2024, 10, 31)

    # Generate a list of dates for the date range, for informational or plotting purposes.
    dates = fo.dates_array(start_date, end_date)

    # Create the breathing rate importer and fetch the data.
    breather_importer = fo.BreathingRate(data_source, 1)
    breathing_data = breather_importer.get_data(start_date, end_date)

    # Create the heart rate variability importer and fetch the data.
    hrv_importer = fo.HeartRateVariability(data_source)
    hrv_data = hrv_importer.get_data(start_date, end_date)

    # Create the resting heart rate importer and fetch the data.
    rhr_importer = fo.RestingHeartRate(data_source)
    rhr_data = rhr_importer.get_data(start_date, end_date)

    # Fill in missing values with the mean of the neighbouring values
    breathing_data = fo.fill_missing_with_neighbours(breathing_data)
    hrv_data = fo.fill_missing_with_neighbours(hrv_data)
    rhr_data = fo.fill_missing_with_neighbours(rhr_data)

    # Adjust buggy data (typically values that are too high or too low) to the mean of the neighbouring values
    # These values depend on your personal ranges.
    breathing_data = fo.fix_invalid_data_points(breathing_data, 10, 20)
    hrv_data = fo.fix_invalid_data_points(hrv_data, 20, 50)
    rhr_data = fo.fix_invalid_data_points(rhr_data, 46, 54)

    # Convert lists to numpy arrays
    dates_array = np.asarray(dates)
    breathing_data_array = np.array(breathing_data).astype(float)
    hrv_data_array = np.array(hrv_data).astype(float)
    rhr_data_array = np.array(rhr_data).astype(float)

    #print("Dates array:", dates_array)
    #print("Breathing data array:", breathing_data_array)
    #print("HRV data array:", hrv_data_array)
    #print("RHR data array:", rhr_data_array)

    # Create a combined calmness index as follows: 100-(RHR/2 + breathing rate*2 - HRV)
    calmness_index = 100 - (rhr_data_array / 2. + breathing_data_array * 2. - hrv_data_array)
    #print("Calmness index:", calmness_index)

    # Plot the calmness index
    plt.figure(figsize=(10, 6))
    plt.plot(dates_array, calmness_index, marker='o', linestyle='-', color='b')
    plt.xlabel('Date')
    plt.ylabel('Calmness Index')
    plt.title('Calmness Index Over Time')
    plt.grid(True)
    plt.xticks(rotation=45)
    plt.tight_layout()
    
    # Fit a 4th order polynomial to the calmness index data
    dates_axis = np.arange(len(dates_array))
    polynomial_coefficients = np.polyfit(dates_axis, calmness_index, 4)
    polynomial = np.poly1d(polynomial_coefficients)
    fitted_calmness_index = polynomial(dates_axis)

    # Plot the fitted polynomial
    plt.plot(dates_array, fitted_calmness_index, linestyle='--', color='r', label='4th Order Polynomial Fit')
    plt.legend()

    plt.show()
if __name__ == "__main__":
    main()

More Examples

For more examples, see the examples directory.

Contributing

If you'd like to contribute to pyFitOut, follow the guidelines outlined in the Contributing Guide.

License

See LICENSE.txt for more information.

Contact

For inquiries and discussion, use pyFitOut Discussions.

Issues

For issues related to this Python implementation, visit the Issues page.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fitout-0.0.9.tar.gz (20.9 kB view details)

Uploaded Source

Built Distribution

fitout-0.0.9-py3-none-any.whl (15.1 kB view details)

Uploaded Python 3

File details

Details for the file fitout-0.0.9.tar.gz.

File metadata

  • Download URL: fitout-0.0.9.tar.gz
  • Upload date:
  • Size: 20.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for fitout-0.0.9.tar.gz
Algorithm Hash digest
SHA256 77f7e1e78bc249083d7c4d0db8d3fbbc5449ce4df6aa6a78353d3522c1cd64c9
MD5 3cbc0139c767709c9ffbc3a9ce926859
BLAKE2b-256 1d45c5c4304fa42c57e0778fd807da241a6a7cdcb0901dfcbaf3a5d3d8895071

See more details on using hashes here.

Provenance

The following attestation bundles were made for fitout-0.0.9.tar.gz:

Publisher: python-publish.yml on kev-m/pyFitOut

Attestations:

File details

Details for the file fitout-0.0.9-py3-none-any.whl.

File metadata

  • Download URL: fitout-0.0.9-py3-none-any.whl
  • Upload date:
  • Size: 15.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for fitout-0.0.9-py3-none-any.whl
Algorithm Hash digest
SHA256 424958c174dc6e5f41e7cb04c14c5f6402e65e6b24f7e1cbbe687e537d21ea3f
MD5 e075d727bbaecf004d5c22fb610fbf6c
BLAKE2b-256 27f5152298901286874ab427bfcbb2957e9759fdaf7dd7aa863bf495c1cc77d0

See more details on using hashes here.

Provenance

The following attestation bundles were made for fitout-0.0.9-py3-none-any.whl:

Publisher: python-publish.yml on kev-m/pyFitOut

Attestations:

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page