A Python library to extract FitBit Google Takeout data.
Project description
FitOut
The FitOut 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 FitOut:
Export
Export your FitBit data, using Google Takeout.
Once the export is complete, download the zip file. I use C:/Dev/Fitbit/Google/.
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/'
# Use the NativeFileLoader to load the data from the extracted files
# data_source = fo.NativeFileLoader(takeout_dir)
# Use the ZipFileLoader to load data from the ZIP file directly.
data_source = fo.ZipFileLoader(takeout_dir+"takeout-20260320T162823Z-3-001.zip")
# 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)
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
Note: To run this example, you will need to install the dependencies:
pip install matplotlib numpy
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/'
# Use the NativeFileLoader to load the data from the extracted files
# data_source = fo.NativeFileLoader(takeout_dir)
# Use the ZipFileLoader to load data from the ZIP file directly.
data_source = fo.ZipFileLoader(takeout_dir+"takeout-20260320T162823Z-3-001.zip")
# 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)
# 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)
# 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.ylim(60, 95) # Set the y-range
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()
plt.show()
if __name__ == "__main__":
main()
More Examples
For more examples, see the examples directory.
Contributing
If you'd like to contribute to FitOut, follow the guidelines outlined in the Contributing Guide.
License
See LICENSE.txt for more information.
Contact
For inquiries and discussion, use FitOut Discussions.
Issues
For issues related to this Python implementation, visit the Issues page.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fitout-0.2.0.tar.gz.
File metadata
- Download URL: fitout-0.2.0.tar.gz
- Upload date:
- Size: 24.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c4ef308c5572d00d766c439f5eeb323d81bb70d50c2f7fc83fb6e8415f2fb2d
|
|
| MD5 |
534915ce39734b2c63bd77ab5d062777
|
|
| BLAKE2b-256 |
dfd42bf1db8904ccbd61fd48f81f515d8688714e7fe20aeb98c3f38133d3ec49
|
Provenance
The following attestation bundles were made for fitout-0.2.0.tar.gz:
Publisher:
python-publish.yml on kev-m/FitOut
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fitout-0.2.0.tar.gz -
Subject digest:
6c4ef308c5572d00d766c439f5eeb323d81bb70d50c2f7fc83fb6e8415f2fb2d - Sigstore transparency entry: 1149961226
- Sigstore integration time:
-
Permalink:
kev-m/FitOut@db9f98ab2f688bf73fa2e98178d4e5784b1272fd -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/kev-m
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@db9f98ab2f688bf73fa2e98178d4e5784b1272fd -
Trigger Event:
release
-
Statement type:
File details
Details for the file fitout-0.2.0-py3-none-any.whl.
File metadata
- Download URL: fitout-0.2.0-py3-none-any.whl
- Upload date:
- Size: 20.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64822b85739e370f61045b8df13539bd147e731fac5e4e7ca91ab230ea9c9b41
|
|
| MD5 |
b0e2521e275f75d4ad4ff6ce37a63072
|
|
| BLAKE2b-256 |
081b86f6e34e7092847dd9ed5a4b807168f71f6f576de2c5d63e5d2e256d2c00
|
Provenance
The following attestation bundles were made for fitout-0.2.0-py3-none-any.whl:
Publisher:
python-publish.yml on kev-m/FitOut
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fitout-0.2.0-py3-none-any.whl -
Subject digest:
64822b85739e370f61045b8df13539bd147e731fac5e4e7ca91ab230ea9c9b41 - Sigstore transparency entry: 1149961266
- Sigstore integration time:
-
Permalink:
kev-m/FitOut@db9f98ab2f688bf73fa2e98178d4e5784b1272fd -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/kev-m
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@db9f98ab2f688bf73fa2e98178d4e5784b1272fd -
Trigger Event:
release
-
Statement type: