You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: paper.md
+9-9Lines changed: 9 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -36,10 +36,10 @@ bibliography: paper.bib
36
36
37
37
# Summary
38
38
39
-
`wristpy` is an open-source Python package designed to streamline the processing and analysis of wrist-worn accelerometer data. The package has been developed in a modular framework to process actigraphy data from both GENEActiv and Actigraph watches, while supporting the extension for other wearable standards in the future, and is supported across multiple platforms (Windows, MacOS, and Ubuntu). This software can be accessed and used through either a command-line interface (CLI) or as an importable Python module. The main processing pipeline will generate outputs in either a `.csv` or `.parquet` format. The output contains timeseries data at a user-chosen temporal resolution, including: physical activity metrics, sleep onset and wake up times, non-wear period identification, and physical activity classification.
39
+
`wristpy` is an open-source Python package designed to streamline the processing and analysis of wrist-worn accelerometer data. The package has been developed in a modular framework to process actigraphy data from both GENEActiv and Actigraph watches, while supporting the extension for other wearable standards in the future, and is supported across multiple platforms (Windows, macOS, and Ubuntu). This software can be accessed and used through either a command-line interface (CLI) or as an importable Python module. The main processing pipeline will generate outputs in either a `.csv` or `.parquet` format. The output contains timeseries data at a user-chosen temporal resolution, including: physical activity metrics, sleep onset and wake up times, non-wear period identification, and physical activity classification.
40
40
41
41
42
-
`wristpy` has been designed modularly, which allows for incremental improvements of bottlenecks in the processing pipeline — such as the independent creation and adoption of a Rust-based reader for actigraphy data that dramatically improves scalability over the vendor-provided reader. With `wristpy`, researchers can directly access a variety of functions that allow them to read specific sensor data stored on the watch, calculate a variety of physical activity metrics, compare various non-wear or sleep detection algorithms, or take advantage of them together in a 1-click end-to-end preprocessing pipeline.
42
+
`wristpy` has been designed modularly, which allows for incremental improvements of bottlenecks in the processing pipeline — such as the independent creation and adoption of a Rust-based reader for actigraphy data that dramatically improves scalability over the vendor-provided reader. With `wristpy`, researchers can directly access a variety of functions that allow them to read specific sensor data stored on the watch, calculate a variety of physical activity metrics, compare various non-wear or sleep detection algorithms, or take advantage of them together in a 1-click end-to-end preprocessing pipeline.
43
43
44
44
45
45
# Statement of Need
@@ -50,10 +50,10 @@ Several open-source packages have been developed, namely GGIR [@van_hees_ggir_20
50
50
51
51
While tools exist that can read Actigraph data (GGIR), or detect multiple sleep windows per night (`skdh`), our requirements to flexibly combine data from various watches with various metrics precluded us from using these. An additional limiting factor of each of these libraries is their inability to extensibly support data from other sensors, including those on the devices they currently support (such as skin conductance and light). `wristpy` addresses needs by providing a development environment and utilities that allow it to:
52
52
- Process raw accelerometer data from various watch manufacturers, including both GENEActiv and Actigraph watches (with plans to support more research grade devices in future development).
53
-
- Access all sensors and metadata from these watches.
54
-
- Support modular processing algorithms that can be easily extended while enforcing strict code quality guidelines, exhaustive test coverage, and documentation. Additionally, this documentation extends to a thorough and robust `logger` allowing users to easily track down and indetify the source of any `WARNING` or `ERROR` messages.
55
-
-Be run in a 1-click fashion with an easy to use interface that requires no domain specific knowledge.
56
-
- Allows batch processing for entire directories of data (e.g. a directory containing all data from a specific protocol can be processed in a 1-click fashion)
53
+
- Access to all sensors and metadata from these watches.
54
+
- Support modular processing algorithms that can be easily extended while enforcing strict code quality guidelines, exhaustive test coverage, and documentation. Additionally, this documentation extends to a thorough and robust `logger` allowing users to easily track down and identify the source of any `WARNING` or `ERROR` messages.
55
+
-Run in a 1-click fashion with an easy to use interface that requires no domain specific knowledge.
56
+
- Allows batch processing for entire directories of data (e.g. a directory containing all data from a specific protocol can be processed in a 1-click fashion).
57
57
- Provide a suite of functionality for more advanced users to request specific outputs (choice of physical activity metrics, user-defined temporal resolution, activity thresholds, different non-wear algorithms).
58
58
- Execute a streamlined implementation that can lead to computational savings on the order of magnitudes.
59
59
@@ -67,12 +67,12 @@ Critically, `wristpy` leverages the history and experience of each of these tool
67
67
- Data loading using `actfast`[@florian_rupprecht_childmindresearchactfast_2025] a Rust-based reader that provides up to nanosecond temporal resolution with direct access to all sensor information on the watch and key metadata information.
68
68
- Post-manufacturer calibration to remove any bias in the device. The two primary methods are a direct minimization method and the default method in GGIR [@van_hees_autocalibration_2014].
69
69
- Calculation of essential physical activity metrics such as ENMO (Euclidean norm minus one), angle-Z (orientation of the watch relative to the x-y axis), MAD (mean amplitude deviation) [@aittasalo_mean_2015], and Actigraph activity counts (agcounts) [@neishabouri_quantification_2022]. With current development to include MIMS (monitor independent motor summary unit) [@john_open-source_2019].
70
-
- Implementation of validated algorithms for on-body wear detection namely from GGIR [@van_hees_ggir_2025], the combined temperature and acceleration algorithm from [@Zhou_2015], the `skdh` DETACH algorithm, and ensemble nonwear classification (PR currently under review).
71
-
- Sleep period detection: following the default parameters from GGIR, we use the HDCZ [@van_hees_estimating_2018] and HSPT algorithms [@van_hees_novel_2015] to find sleep period candidates. Unlike the implementation within GGIR, we output all viable sleep window candidates across the entire available data. Furthermore, functionality is currently being implemented to remove overlap between sleep periods and non-wear times, eliminating the need for the researcher to verify or remove those overlaps manually.
70
+
- Implementation of validated algorithms for on-body wear detection namely from GGIR [@van_hees_ggir_2025], the combined temperature and acceleration algorithm from [@Zhou_2015], the `skdh` DETACH algorithm. Most recently, we have added the option for users to test out the ensemble classification of multiple non-wear detection algorithms (any number from the above list can be chosen).
71
+
- Sleep period detection: following the default parameters from GGIR, we use the HDCZ [@van_hees_estimating_2018] and HSPT algorithms [@van_hees_novel_2015] to find sleep period candidates. Unlike the implementation within GGIR, we output all viable sleep window candidates across the entire available data. Furthermore, any overlap between sleep periods and non-wear times are removed, eliminating the need for the researcher to verify or remove those overlaps manually.
72
72
- Physical activity level classification: Categorize periods of physical activity as `inactive`, `light`, `moderate`, or `vigorous` activity, based on established thresholds for ENMO [@hildebrand_age_2014], MAD [@aittasalo_mean_2015], agcounts [@neishabouri_quantification_2022] or custom user-defined thresholds.
73
73
74
74
# Acknowledgements
75
-
Financial and scientific support has been provided by Dr Michael P. Milham. Financial support has been provided by the California Department of Health Care Services (DHCS) as part of the Children and Youth Behavioral Health Initiative (CYBHI). We would also like to thank Dr. Michelle Freund, Dr. Vadim Zipunnikov, Dr. Andrew Leroux, and Dr. Kathleen R. Merikangas and her team at the NIMH, for their technical and administrative support.
75
+
Financial support has been provided by Dr Michael P. Milham. Financial support has been provided by the California Department of Health Care Services (DHCS) as part of the Children and Youth Behavioral Health Initiative (CYBHI). We would also like to thank Dr. Michelle Freund, Dr. Vadim Zipunnikov, Dr. Andrew Leroux, and Dr. Kathleen R. Merikangas and her team at the NIMH, for their technical and administrative support.
0 commit comments