paradigma 1.0.3__py3-none-any.whl → 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- paradigma/__init__.py +10 -1
- paradigma/classification.py +38 -21
- paradigma/config.py +187 -123
- paradigma/constants.py +48 -35
- paradigma/feature_extraction.py +345 -255
- paradigma/load.py +476 -0
- paradigma/orchestrator.py +670 -0
- paradigma/pipelines/gait_pipeline.py +685 -246
- paradigma/pipelines/pulse_rate_pipeline.py +456 -155
- paradigma/pipelines/pulse_rate_utils.py +289 -248
- paradigma/pipelines/tremor_pipeline.py +405 -132
- paradigma/prepare_data.py +409 -0
- paradigma/preprocessing.py +500 -163
- paradigma/segmenting.py +180 -140
- paradigma/testing.py +370 -178
- paradigma/util.py +190 -101
- paradigma-1.1.0.dist-info/METADATA +229 -0
- paradigma-1.1.0.dist-info/RECORD +26 -0
- {paradigma-1.0.3.dist-info → paradigma-1.1.0.dist-info}/WHEEL +1 -1
- paradigma-1.1.0.dist-info/entry_points.txt +4 -0
- {paradigma-1.0.3.dist-info → paradigma-1.1.0.dist-info/licenses}/LICENSE +0 -1
- paradigma-1.0.3.dist-info/METADATA +0 -138
- paradigma-1.0.3.dist-info/RECORD +0 -22
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: paradigma
|
|
3
|
+
Version: 1.1.0
|
|
4
|
+
Summary: ParaDigMa - A toolbox for deriving Parkinson's disease Digital Markers from real-life wrist sensor data
|
|
5
|
+
License: Apache-2.0
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Author: Erik Post
|
|
8
|
+
Author-email: erik.post@radboudumc.nl
|
|
9
|
+
Requires-Python: >=3.11,<4.0
|
|
10
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
+
Requires-Dist: avro (>=1.12.1,<2.0.0)
|
|
17
|
+
Requires-Dist: nbconvert (>=7.16.6,<8.0.0)
|
|
18
|
+
Requires-Dist: pandas (>=2.1.4,<3.0.0)
|
|
19
|
+
Requires-Dist: pyarrow (>=22.0.0,<23.0.0)
|
|
20
|
+
Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
|
|
21
|
+
Requires-Dist: scikit-learn (>=1.3.2,<1.6.1)
|
|
22
|
+
Requires-Dist: tsdf (>=0.6.1,<0.7.0)
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
<p align="center">
|
|
26
|
+
<img src="https://raw.githubusercontent.com/biomarkersParkinson/paradigma/main/docs/source/_static/img/paradigma-logo-banner.png" alt="ParaDigMa logo"/>
|
|
27
|
+
</p>
|
|
28
|
+
|
|
29
|
+
| Badges | |
|
|
30
|
+
|:----:|----|
|
|
31
|
+
| **Packages and Releases** | [](https://github.com/biomarkersparkinson/paradigma/releases/latest) [](https://pypi.python.org/pypi/paradigma/) [](https://research-software-directory.org/software/paradigma) |
|
|
32
|
+
| **DOI** | [](https://doi.org/10.5281/zenodo.13838392) |
|
|
33
|
+
| **Build Status** | [](https://www.python.org/downloads/) [](https://github.com/biomarkersParkinson/paradigma/actions/workflows/build-and-test.yml) [](https://github.com/biomarkersParkinson/paradigma/actions/workflows/pages/pages-build-deployment) |
|
|
34
|
+
| **License** | [](https://github.com/biomarkersparkinson/paradigma/blob/main/LICENSE) |
|
|
35
|
+
|
|
36
|
+
## Overview
|
|
37
|
+
|
|
38
|
+
ParaDigMa (Parkinson's disease Digital Markers) is a Python toolbox for extracting validated digital biomarkers from wrist sensor data in Parkinson's disease. It processes accelerometer, gyroscope, and PPG signals collected during passive monitoring in daily life.
|
|
39
|
+
|
|
40
|
+
**Key Features:**
|
|
41
|
+
- Arm swing during gait analysis
|
|
42
|
+
- Tremor analysis
|
|
43
|
+
- Pulse rate analysis
|
|
44
|
+
- Scientifically validated in peer-reviewed publications
|
|
45
|
+
- Modular, extensible architecture for custom analyses
|
|
46
|
+
|
|
47
|
+
## Quick Start
|
|
48
|
+
|
|
49
|
+
### Installation
|
|
50
|
+
|
|
51
|
+
**For regular use:**
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pip install paradigma
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Requires Python 3.11+.
|
|
58
|
+
|
|
59
|
+
**For development or running tutorials:**
|
|
60
|
+
|
|
61
|
+
Example data requires git-lfs. See the [installation guide](https://biomarkersparkinson.github.io/paradigma/guides/installation.html) for setup instructions.
|
|
62
|
+
|
|
63
|
+
### Basic Usage
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
from paradigma.orchestrator import run_paradigma
|
|
67
|
+
|
|
68
|
+
# Example 1: Single DataFrame with default output directory
|
|
69
|
+
results = run_paradigma(
|
|
70
|
+
dfs=df,
|
|
71
|
+
pipelines=['gait', 'tremor'],
|
|
72
|
+
watch_side='left', # Required for gait pipeline
|
|
73
|
+
save_intermediate=['quantification', 'aggregation'] # Saves to ./output by default
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# Example 2: Multiple DataFrames as list (assigned to 'df_1', 'df_2', etc.)
|
|
77
|
+
results = run_paradigma(
|
|
78
|
+
dfs=[df1, df2, df3],
|
|
79
|
+
pipelines=['gait', 'tremor'],
|
|
80
|
+
output_dir="./results", # Custom output directory
|
|
81
|
+
watch_side='left',
|
|
82
|
+
save_intermediate=['quantification', 'aggregation']
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# Example 3: Dictionary of DataFrames (custom segment/file names)
|
|
86
|
+
results = run_paradigma(
|
|
87
|
+
dfs={'morning_session': df1, 'evening_session': df2},
|
|
88
|
+
pipelines=['gait', 'tremor'],
|
|
89
|
+
watch_side='right',
|
|
90
|
+
save_intermediate=[] # No files saved - results only in memory
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
# Example 4: Load from data directory
|
|
94
|
+
results = run_paradigma(
|
|
95
|
+
data_path='./my_data',
|
|
96
|
+
pipelines=['gait', 'tremor'],
|
|
97
|
+
watch_side='left',
|
|
98
|
+
file_pattern='*.parquet',
|
|
99
|
+
save_intermediate=['quantification', 'aggregation']
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# Access results (nested by pipeline)
|
|
103
|
+
gait_measures = results['quantifications']['gait']
|
|
104
|
+
tremor_measures = results['quantifications']['tremor']
|
|
105
|
+
gait_aggregates = results['aggregations']['gait']
|
|
106
|
+
tremor_aggregates = results['aggregations']['tremor']
|
|
107
|
+
|
|
108
|
+
# Check for errors
|
|
109
|
+
if results['errors']:
|
|
110
|
+
print(f"Warning: {len(results['errors'])} error(s) occurred")
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**See our [tutorials](https://biomarkersparkinson.github.io/paradigma/tutorials/index.html) for complete examples.**
|
|
114
|
+
|
|
115
|
+
## Pipelines
|
|
116
|
+
|
|
117
|
+
<p align="center">
|
|
118
|
+
<img src="https://raw.githubusercontent.com/biomarkersParkinson/paradigma/main/docs/source/_static/img/pipeline-architecture.png" alt="Pipeline architeecture"/>
|
|
119
|
+
</p>
|
|
120
|
+
|
|
121
|
+
### Validated Processing Pipelines
|
|
122
|
+
|
|
123
|
+
| Pipeline | Input sensors | Output week-level aggregation | Publications | Tutorial |
|
|
124
|
+
| ---- | ---- | ------- | ---- | ---- |
|
|
125
|
+
| **Arm swing during gait** | Accelerometer + Gyroscope | Typical, maximum & variability of arm swing range of motion | [Post 2025](https://doi.org/10.1186/s12984-025-01578-z), [Post 2026*](https://doi.org/10.64898/2026.01.06.26343500) | [Guide](https://biomarkersparkinson.github.io/paradigma/tutorials/gait_analysis) |
|
|
126
|
+
| **Tremor** | Gyroscope | % tremor time, typical & maximum tremor power | [Timmermans 2025a](https://doi.org/10.1038/s41531-025-01056-2), [Timmermans 2025b*](https://www.medrxiv.org/content/10.64898/2025.12.23.25342892v1) | [Guide](https://biomarkersparkinson.github.io/paradigma/tutorials/tremor_analysis) |
|
|
127
|
+
| **Pulse rate** | PPG (+ Accelerometer) | Resting & maximum pulse rate | [Veldkamp 2025*](https://doi.org/10.1101/2025.08.15.25333751) | [Guide](https://biomarkersparkinson.github.io/paradigma/tutorials/pulse_rate_analysis) |
|
|
128
|
+
|
|
129
|
+
*\* Indicates pre-print*
|
|
130
|
+
|
|
131
|
+
### Pipeline Architecture
|
|
132
|
+
|
|
133
|
+
ParaDigMa can best be understood by categorizing the sequential processes:
|
|
134
|
+
| Process | Description |
|
|
135
|
+
| ---- | ---- |
|
|
136
|
+
| **Preprocessing** | Preparing raw sensor signals for further processing |
|
|
137
|
+
| **Feature extraction** | Extracting features based on windowed sensor signals |
|
|
138
|
+
| **Classification** | Detecting segments of interest using validated classifiers (e.g., gait segments) |
|
|
139
|
+
| **Quantification** | Extracting specific measures from the detected segments (e.g., arm swing measures) |
|
|
140
|
+
| **Aggregation** | Aggregating the measures over a specific time period (e.g., week-level aggregates)
|
|
141
|
+
|
|
142
|
+
## Usage
|
|
143
|
+
### Documentation
|
|
144
|
+
|
|
145
|
+
- **[Tutorials](https://biomarkersparkinson.github.io/paradigma/tutorials/index.html)** - Step-by-step usage examples
|
|
146
|
+
- **[Installation Guide](https://biomarkersparkinson.github.io/paradigma/guides/installation.html)** - Setup and troubleshooting
|
|
147
|
+
- **[Sensor Requirements](https://biomarkersparkinson.github.io/paradigma/guides/sensor_requirements.html)** - Data specifications and compliance
|
|
148
|
+
- **[Supported Devices](https://biomarkersparkinson.github.io/paradigma/guides/supported_devices.html)** - Validated hardware
|
|
149
|
+
- **[Input Formats Guide](https://biomarkersparkinson.github.io/paradigma/guides/input_formats.html)** - Input format options and data loading
|
|
150
|
+
- **[Configuration Guide](https://biomarkersparkinson.github.io/paradigma/guides/config.html)** - Pipeline configuration
|
|
151
|
+
- **[Scientific Validation](https://biomarkersparkinson.github.io/paradigma/guides/validation.html)** - Validation studies and publications
|
|
152
|
+
- **[API Reference](https://biomarkersparkinson.github.io/paradigma/autoapi/paradigma/index.html)** - Complete API documentation
|
|
153
|
+
|
|
154
|
+
### Sensor Requirements & Supported Devices
|
|
155
|
+
|
|
156
|
+
ParaDigMa is designed for wrist sensor data collected during passive monitoring in persons with Parkinson's disease. While designed to work with any compliant device, it has been empirically validated on:
|
|
157
|
+
|
|
158
|
+
- **Verily Study Watch** (gait, tremor, pulse rate)
|
|
159
|
+
- **Axivity AX6** (gait, tremor)
|
|
160
|
+
- **Gait-up Physilog 4** (gait, tremor)
|
|
161
|
+
- **Empatica EmbracePlus** (data loading)
|
|
162
|
+
|
|
163
|
+
Please check before running the pipelines whether your sensor data complies with the requirements for the sensor configuration and context of use. See the [sensor requirements guide](https://biomarkersparkinson.github.io/paradigma/guides/sensor_requirements.html) for data specifications and the [supported devices guide](https://biomarkersparkinson.github.io/paradigma/guides/supported_devices.html) for device-specific setup instructions.
|
|
164
|
+
|
|
165
|
+
### Data Formats
|
|
166
|
+
|
|
167
|
+
ParaDigMa supports the following data formats:
|
|
168
|
+
|
|
169
|
+
- In-memory (recommended): **Pandas DataFrames** (see examples above)
|
|
170
|
+
- Data loading file extensions: **TSDF, Parquet, CSV, Pickle** and **several device-specific formats** (AVRO (Empatica), CWA (Axivity))
|
|
171
|
+
|
|
172
|
+
### Troubleshooting
|
|
173
|
+
|
|
174
|
+
For installation issues, see the [installation guide troubleshooting section](https://biomarkersparkinson.github.io/paradigma/guides/installation.html#troubleshooting).
|
|
175
|
+
|
|
176
|
+
For other issues, check our [issue tracker](https://github.com/biomarkersParkinson/paradigma/issues) or contact paradigma@radboudumc.nl.
|
|
177
|
+
|
|
178
|
+
## Scientific Validation
|
|
179
|
+
|
|
180
|
+
ParaDigMa pipelines are validated in peer-reviewed publications:
|
|
181
|
+
|
|
182
|
+
| Pipeline | Publication |
|
|
183
|
+
|----------|-------------|
|
|
184
|
+
| **Arm swing during gait** | Post et al. (2025, 2026) |
|
|
185
|
+
| **Tremor** | Timmermans et al. (2025a, 2025b) |
|
|
186
|
+
| **Pulse rate** | Veldkamp et al. (2025) |
|
|
187
|
+
|
|
188
|
+
See the [validation guide](https://biomarkersparkinson.github.io/paradigma/guides/validation.html) for full publication details.
|
|
189
|
+
|
|
190
|
+
## Contributing
|
|
191
|
+
|
|
192
|
+
We welcome contributions! Please see:
|
|
193
|
+
|
|
194
|
+
- [Contributing Guidelines](https://biomarkersparkinson.github.io/paradigma/contributing.html)
|
|
195
|
+
- [Code of Conduct](https://biomarkersparkinson.github.io/paradigma/conduct.html)
|
|
196
|
+
|
|
197
|
+
## Citation
|
|
198
|
+
|
|
199
|
+
If you use ParaDigMa in your research, please cite:
|
|
200
|
+
|
|
201
|
+
```bibtex
|
|
202
|
+
@software{paradigma2024,
|
|
203
|
+
author = {Post, Erik and Veldkamp, Kars and Timmermans, Nienke and
|
|
204
|
+
Soriano, Diogo Coutinho and Kasalica, Vedran and
|
|
205
|
+
Kok, Peter and Evers, Luc},
|
|
206
|
+
title = {ParaDigMa: Parkinson's disease Digital Markers},
|
|
207
|
+
year = {2024},
|
|
208
|
+
doi = {10.5281/zenodo.13838392},
|
|
209
|
+
url = {https://github.com/biomarkersParkinson/paradigma}
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## License
|
|
214
|
+
|
|
215
|
+
Licensed under the Apache License 2.0. See [LICENSE](LICENSE) for details.
|
|
216
|
+
|
|
217
|
+
## Acknowledgements
|
|
218
|
+
|
|
219
|
+
**Core Team**: Erik Post, Kars Veldkamp, Nienke Timmermans, Diogo Coutinho Soriano, Vedran Kasalica, Peter Kok, Twan van Laarhoven, Luc Evers
|
|
220
|
+
|
|
221
|
+
**Advisors**: Max Little, Jordan Raykov, Hayriye Cagnan, Bas Bloem
|
|
222
|
+
|
|
223
|
+
**Funding**: the initial release was funded by the Michael J Fox Foundation (grant #020425) and the Dutch Research Council (grants #ASDI.2020.060, #2023.010)
|
|
224
|
+
|
|
225
|
+
## Contact
|
|
226
|
+
|
|
227
|
+
- Email: paradigma@radboudumc.nl
|
|
228
|
+
- [Issue Tracker](https://github.com/biomarkersParkinson/paradigma/issues)
|
|
229
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
paradigma/__init__.py,sha256=F2c3pnNkqGe4iVAZFufMCQZO99Azp5yD9y3PJly-Tbc,304
|
|
2
|
+
paradigma/assets/gait_detection_clf_package.pkl,sha256=8jCbuM_4dkilSjOEk9ss7bJbSppgzXe72y0X4BCnzCU,11497247
|
|
3
|
+
paradigma/assets/gait_filtering_clf_package.pkl,sha256=lAaLyhmXdV4X_drmYt0EM6wGwSo80yhpxtncWGq4RfQ,3915
|
|
4
|
+
paradigma/assets/ppg_quality_clf_package.pkl,sha256=vUcM4v8gZwWAmDVK7E4UcHhVnhlEg27RSB71oPGloSc,1292
|
|
5
|
+
paradigma/assets/tremor_detection_clf_package.pkl,sha256=S-KsK1EcUBJX6oGGBo8GqU0AhNZThA6Qe-cs0QPcWw4,1475
|
|
6
|
+
paradigma/classification.py,sha256=Wu_hnUgimpf3A7ap0yk3TnzMgwjSVZd7WXJ438Ho89c,3283
|
|
7
|
+
paradigma/config.py,sha256=WLcvR7h7e12MV1G-DbYWGAjaLZuzz45tHayWGQY7Cy4,14228
|
|
8
|
+
paradigma/constants.py,sha256=-Hm5xy7YUf8nUg30MrFogGCsPtLakHbyzZtwBu2mf60,3837
|
|
9
|
+
paradigma/feature_extraction.py,sha256=kE-DuND49GVQFje9B4uCLFdO7pD4IOpVpj1ZdK30qxE,35913
|
|
10
|
+
paradigma/load.py,sha256=jIvsujAt3U-JQc3bT5AKLMnpIcvNunRjnPngon_DjKc,13580
|
|
11
|
+
paradigma/orchestrator.py,sha256=-vUFxkzwQqUFtz72ZX2ZDWEOe9hJXH_y3kMKAi3l-7w,28751
|
|
12
|
+
paradigma/pipelines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
+
paradigma/pipelines/gait_pipeline.py,sha256=1QUTVh7Z9LAODAOUUQ9RuU6XjQc7thm3QE7aOXvad8I,43644
|
|
14
|
+
paradigma/pipelines/pulse_rate_pipeline.py,sha256=pzRr2PMZtBdTr5v7n7KTarM2pFAqE7H8Di4Jn8BW-iM,25956
|
|
15
|
+
paradigma/pipelines/pulse_rate_utils.py,sha256=PTFWFnALjf3Ja-_xy1S4WmDQ1Oo1NnAfq2rKISNiDDs,27489
|
|
16
|
+
paradigma/pipelines/tremor_pipeline.py,sha256=wo2ECtVxeUcKd9ziWKlJeUk8No3mV4LzZUdMfYFh86k,21511
|
|
17
|
+
paradigma/prepare_data.py,sha256=8_2EfGnctXYJji6_2t_LJGpspoIrLzth0urxLhY1d5w,12898
|
|
18
|
+
paradigma/preprocessing.py,sha256=7vO-Xd36Inc-Tymmdv5Ar31uszYga3vXq9eVIjCvMxE,27139
|
|
19
|
+
paradigma/segmenting.py,sha256=T27UB9dDtJbTb1GGr44gKGvqZnpOi6ESmnojqUsridU,14831
|
|
20
|
+
paradigma/testing.py,sha256=CCXq0dpt1ky7QkQ-4eP_QPFGRhsTiaEISTIVq8W3LsI,19492
|
|
21
|
+
paradigma/util.py,sha256=QzCAaHsImlJLOYgEcVOjRezPDqqhoFm-CSn5249IAxM,18281
|
|
22
|
+
paradigma-1.1.0.dist-info/METADATA,sha256=wC5aqPpXOvi5iYjTpbVJm1VsiiUE-VOKFGIAkAYL3Kk,10986
|
|
23
|
+
paradigma-1.1.0.dist-info/WHEEL,sha256=kJCRJT_g0adfAJzTx2GUMmS80rTJIVHRCfG0DQgLq3o,88
|
|
24
|
+
paradigma-1.1.0.dist-info/entry_points.txt,sha256=Jiuvl3rCJFdHOVxhC4Uum_jc3qXIj_h5mTo-rALN94E,89
|
|
25
|
+
paradigma-1.1.0.dist-info/licenses/LICENSE,sha256=FErdVJ9zP4I24ElO6xFU5_e8KckvFkpcZdm69ZkaUWI,9806
|
|
26
|
+
paradigma-1.1.0.dist-info/RECORD,,
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.3
|
|
2
|
-
Name: paradigma
|
|
3
|
-
Version: 1.0.3
|
|
4
|
-
Summary: ParaDigMa - A toolbox for deriving Parkinson's disease Digital Markers from real-life wrist sensor data
|
|
5
|
-
License: Apache-2.0
|
|
6
|
-
Author: Erik Post
|
|
7
|
-
Author-email: erik.post@radboudumc.nl
|
|
8
|
-
Requires-Python: >=3.11,<4.0
|
|
9
|
-
Classifier: License :: OSI Approved :: Apache Software License
|
|
10
|
-
Classifier: Programming Language :: Python :: 3
|
|
11
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
12
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
14
|
-
Requires-Dist: nbconvert (>=7.16.6,<8.0.0)
|
|
15
|
-
Requires-Dist: pandas (>=2.1.4,<3.0.0)
|
|
16
|
-
Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
|
|
17
|
-
Requires-Dist: pytype (>=2024.4.11,<2025.0.0)
|
|
18
|
-
Requires-Dist: scikit-learn (>=1.3.2,<1.6.1)
|
|
19
|
-
Requires-Dist: tsdf (>=0.5.2,<0.6.0)
|
|
20
|
-
Description-Content-Type: text/markdown
|
|
21
|
-
|
|
22
|
-
<p align="center">
|
|
23
|
-
<img src="https://raw.githubusercontent.com/biomarkersParkinson/paradigma/main/docs/source/_static/img/paradigma-logo-banner.png" alt="ParaDigMa logo"/>
|
|
24
|
-
</p>
|
|
25
|
-
|
|
26
|
-
| Badges | |
|
|
27
|
-
|:----:|----|
|
|
28
|
-
| **Packages and Releases** | [](https://github.com/biomarkersparkinson/paradigma/releases/latest) [](https://pypi.python.org/pypi/paradigma/) [](https://research-software-directory.org/software/paradigma) |
|
|
29
|
-
| **DOI** | [](https://doi.org/10.5281/zenodo.13838392) |
|
|
30
|
-
| **Build Status** | [](https://www.python.org/downloads/) [](https://github.com/biomarkersParkinson/paradigma/actions/workflows/build-and-test.yml) [](https://github.com/biomarkersParkinson/paradigma/actions/workflows/pages/pages-build-deployment) |
|
|
31
|
-
| **License** | [](https://github.com/biomarkersparkinson/paradigma/blob/main/LICENSE) |
|
|
32
|
-
<!-- | **Fairness** | [](https://fair-software.eu) [](https://www.bestpractices.dev/projects/8083) | -->
|
|
33
|
-
|
|
34
|
-
## Overview
|
|
35
|
-
The Parkinson's disease Digital Markers (ParaDigMa) toolbox is a Python
|
|
36
|
-
software package designed for processing real-life wrist sensor data
|
|
37
|
-
to extract digital measures of motor and non-motor signs of Parkinson's disease (PD).
|
|
38
|
-
|
|
39
|
-
Specifically, the toolbox is designed to process accelerometer, gyroscope and
|
|
40
|
-
photoplethysmography (PPG) signals, collected during passive monitoring in daily life.
|
|
41
|
-
It contains three data processing pipelines: (1) arm swing during gait, (2) tremor,
|
|
42
|
-
and (3) pulse rate. These pipelines are scientifically validated for their
|
|
43
|
-
use in persons with PD. Furthermore, the toolbox contains general functionalities for
|
|
44
|
-
signal processing and feature extraction, such as filtering, peak detection, and
|
|
45
|
-
spectral analysis.
|
|
46
|
-
|
|
47
|
-
The toolbox is accompanied by a set of example scripts and notebooks for
|
|
48
|
-
each processing pipeline that demonstrate how to use the toolbox for extracting
|
|
49
|
-
digital measures. In addition, the toolbox is designed to be modular, enabling
|
|
50
|
-
researchers to easily extend the toolbox with new algorithms and functionalities.
|
|
51
|
-
|
|
52
|
-
## Features
|
|
53
|
-
The components of ParaDigMa are shown in the diagram below.
|
|
54
|
-
|
|
55
|
-
<p align="center">
|
|
56
|
-
<img src="https://raw.githubusercontent.com/biomarkersParkinson/paradigma/main/docs/source/_static/img/pipeline-architecture.png" alt="Pipeline architeecture"/>
|
|
57
|
-
</p>
|
|
58
|
-
The three colored, shaded columns represent the individual pipelines. Processes of the pipelines are represented by blue ellipses, and input/output data by rectangular boxes. The input/output of each step is indicated by yellow horizontal bars denoting the type of data (e.g., 3. Extracted features). Arrows indicate the sequential order of the processes of the pipeline. <br/> <br/>
|
|
59
|
-
ParaDigMa can best be understood by categorizing the sequential processes:
|
|
60
|
-
|
|
61
|
-
| Process | Description |
|
|
62
|
-
| ---- | ---- |
|
|
63
|
-
| Preprocessing | Preparing raw sensor signals for further processing |
|
|
64
|
-
| Feature extraction | Extracting features based on windowed sensor signals |
|
|
65
|
-
| Classification | Detecting segments of interest using validated classifiers (e.g., gait segments) |
|
|
66
|
-
| Quantification | Extracting specific measures from the detected segments (e.g., arm swing measures) |
|
|
67
|
-
| Aggregation | Aggregating the measures over a specific time period (e.g., week-level aggregates) |
|
|
68
|
-
|
|
69
|
-
<br/>
|
|
70
|
-
ParaDigMa contains the following validated processing pipelines (each using the processes described above):
|
|
71
|
-
|
|
72
|
-
| Pipeline | Input | Output classification | Output quantification | Output week-level aggregation |
|
|
73
|
-
| ---- | ---- | ---- | ---- | ---- |
|
|
74
|
-
| **Arm swing during gait** | Wrist accelerometer and gyroscope data | Gait probability, gait without other arm activities probability | Arm swing range of motion (RoM) | Typical & maximum arm swing RoM |
|
|
75
|
-
| **Tremor** | Wrist gyroscope data | Tremor probability | Tremor power | % tremor time, typical & maximum tremor power |
|
|
76
|
-
| **Pulse rate** | Wrist PPG and accelerometer data | PPG signal quality | Pulse rate | Resting & maximum pulse rate |
|
|
77
|
-
|
|
78
|
-
## Installation
|
|
79
|
-
|
|
80
|
-
The package is available in PyPI and requires [Python 3.11](https://www.python.org/downloads/) or higher. It can be installed using:
|
|
81
|
-
|
|
82
|
-
```bash
|
|
83
|
-
pip install paradigma
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
## Usage
|
|
87
|
-
|
|
88
|
-
### Tutorials & documentation
|
|
89
|
-
See our tutorials for example scripts on how to use the toolbox to extract digital measures from wrist sensor signals.
|
|
90
|
-
The API reference contains detailed documentation of all toolbox modules and functions.
|
|
91
|
-
The user guides provide additional information about specific topics (e.g. the required orientation of the wrist sensor).
|
|
92
|
-
|
|
93
|
-
### Sensor data requirements
|
|
94
|
-
The ParaDigMa toolbox is designed for the analysis of passive monitoring data collected using a wrist sensor in persons with PD.
|
|
95
|
-
|
|
96
|
-
Specific requirements include:
|
|
97
|
-
| Pipeline | Sensor Configuration | Context of Use |
|
|
98
|
-
|------------------------|--------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|
|
|
99
|
-
| **All** | - Sensor position: wrist-band on most or least affected side (validated for both, but different sensitivity for measuring disease progression for tremor and arm swing during gait). <br> - Sensor orientation: orientation as described in [Coordinate System](https://biomarkersparkinson.github.io/paradigma/guides/coordinate_system.html). <br> - Timeframe: contiguous, strictly increasing timestamps. | - Population: persons with PD. <br> - Data collection protocol: passive monitoring in daily life. |
|
|
100
|
-
| **Arm swing during gait** | - Accelerometer: minimum sampling rate of 100 Hz, minimum range of ± 4 g. <br> - Gyroscope: minimum sampling rate of 100 Hz, minimum range of ± 1000 degrees/sec. | - Population: no walking aid, no severe dyskinesia in the watch-sided arm. <br> - Compliance: for weekly measures: at least three compliant days (with ≥10 hours of data between 8 am and 10 pm), and at least 2 minutes of arm swing. |
|
|
101
|
-
| **Tremor** | - Gyroscope: minimum sampling rate of 100 Hz, minimum range of ± 1000 degrees/sec. | - Compliance: for weekly measures: at least three compliant days (with ≥10 hours of data between 8 am and 10 pm). |
|
|
102
|
-
| **Pulse rate** | - PPG*: minimum sampling rate of 30 Hz, green LED. <br> - Accelerometer: minimum sampling rate of 100 Hz, minimum range of ± 4 g. | - Population: no rhythm disorders (e.g. atrial fibrillation, atrial flutter). <br> - Compliance: for weekly measures: minimum average of 12 hours of data per day. |
|
|
103
|
-
|
|
104
|
-
\* The processing of PPG signals is currently based on the blood volume pulse (arbitrary units) obtained from the Verily Study Watch, and we are currently testing the applicability of the pipeline to other PPG devices.
|
|
105
|
-
|
|
106
|
-
> [!WARNING]
|
|
107
|
-
> While the toolbox is designed to work on any wrist sensor device which fulfills the requirements,
|
|
108
|
-
we have currently verified its performance on data from the Gait-up Physilog 4 (arm swing during gait & tremor) and the Verily Study Watch (all pipelines). Furthermore, the specifications above are the minimally validated requirements. For example, while ParaDigMa works with accelerometer and gyroscope data sampled at 50 Hz, its effect on subsequent processes has not been empirically validated.
|
|
109
|
-
<br/>
|
|
110
|
-
|
|
111
|
-
We have included support for [TSDF](https://biomarkersparkinson.github.io/tsdf/) as format for loading and storing sensor data. TSDF enables efficient data storage with added metadata. However, ParaDigMa does not require a particular method of data storage and retrieval. Please see our tutorial [Data preparation](https://biomarkersparkinson.github.io/paradigma/tutorials/data_preparation.html) for examples of loading TSDF and other data formats into memory, and for preparing raw sensor data as input for the processing pipelines.
|
|
112
|
-
|
|
113
|
-
## Scientific validation
|
|
114
|
-
|
|
115
|
-
The pipelines were developed and validated using data from the Parkinson@Home Validation study [[Evers et al. (2020)]](https://pmc.ncbi.nlm.nih.gov/articles/PMC7584982/) and the Personalized Parkinson Project [[Bloem et al. (2019)]](https://pubmed.ncbi.nlm.nih.gov/31315608/). The following publications contain details and validation of the pipelines:
|
|
116
|
-
* [Post, E. et al. (2025) - Quantifying arm swing in Parkinson's disease: a method account for arm activities during free-living gait](https://doi.org/10.1186/s12984-025-01578-z)
|
|
117
|
-
* [Timmermans, N.A. et al. (2025) - A generalizable and open-source algorithm for real-life monitoring of tremor in Parkinson's disease](https://doi.org/10.1038/s41531-025-01056-2)
|
|
118
|
-
* [Veldkamp, K.I. et al. (2025) - Heart rate monitoring using wrist photoplethysmography in Parkinson disease: feasibility and relation with autonomic dysfunction](https://doi.org/10.1101/2025.08.15.25333751)
|
|
119
|
-
|
|
120
|
-
## Contributing
|
|
121
|
-
|
|
122
|
-
We welcome contributions! Please check out our [contributing guidelines](https://biomarkersparkinson.github.io/paradigma/contributing.html).
|
|
123
|
-
Please note that this project is released with a [Code of Conduct](https://biomarkersparkinson.github.io/paradigma/conduct.html). By contributing to this project, you agree to abide by its terms.
|
|
124
|
-
|
|
125
|
-
## License
|
|
126
|
-
|
|
127
|
-
It is licensed under the terms of the Apache License 2.0 license. See [License](https://biomarkersparkinson.github.io/paradigma/license.html) for more details.
|
|
128
|
-
|
|
129
|
-
## Acknowledgements
|
|
130
|
-
|
|
131
|
-
The core team of ParaDigMa consists of Erik Post, Kars Veldkamp, Nienke Timmermans, Diogo Coutinho Soriano, Peter Kok, Vedran Kasalica and Luc Evers.
|
|
132
|
-
Advisors to the project are Max Little, Jordan Raykov, Twan van Laarhoven, Hayriye Cagnan, and Bas Bloem.
|
|
133
|
-
The initial release of ParaDigMa was funded by the Michael J Fox Foundation (grant #020425) and the Dutch Research Council (grant #ASDI.2020.060 & grant #2023.010).
|
|
134
|
-
ParaDigMa was created with [`cookiecutter`](https://cookiecutter.readthedocs.io/en/latest/) and the `py-pkgs-cookiecutter` [template](https://github.com/py-pkgs/py-pkgs-cookiecutter).
|
|
135
|
-
|
|
136
|
-
## Contact
|
|
137
|
-
Questions, issues or suggestions about ParaDigMa? Please reach out to paradigma@radboudumc.nl, or open an issue in the GitHub repository.
|
|
138
|
-
|
paradigma-1.0.3.dist-info/RECORD
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
paradigma/__init__.py,sha256=vCLqo7vOEgcnYs10gUVYvEFfi8y-jBi7w1YKRoqn95k,127
|
|
2
|
-
paradigma/assets/gait_detection_clf_package.pkl,sha256=8jCbuM_4dkilSjOEk9ss7bJbSppgzXe72y0X4BCnzCU,11497247
|
|
3
|
-
paradigma/assets/gait_filtering_clf_package.pkl,sha256=lAaLyhmXdV4X_drmYt0EM6wGwSo80yhpxtncWGq4RfQ,3915
|
|
4
|
-
paradigma/assets/ppg_quality_clf_package.pkl,sha256=vUcM4v8gZwWAmDVK7E4UcHhVnhlEg27RSB71oPGloSc,1292
|
|
5
|
-
paradigma/assets/tremor_detection_clf_package.pkl,sha256=S-KsK1EcUBJX6oGGBo8GqU0AhNZThA6Qe-cs0QPcWw4,1475
|
|
6
|
-
paradigma/classification.py,sha256=sBJSePvwHZNPUQuLdx-pncfnDzMq-1naomsCxSJneWY,2921
|
|
7
|
-
paradigma/config.py,sha256=rrGKabsd1ffLYH9NKdvZmGJmsv-V8rpyqSaC5jkXfo0,11335
|
|
8
|
-
paradigma/constants.py,sha256=gR--OzxaZqS5nJnYlWLqnJ9xN05_GMNtd6ec3upsfms,3543
|
|
9
|
-
paradigma/feature_extraction.py,sha256=zgu_fW1zpPvHxpgsPVpJILUiyWH44b9n1bGG7lV2HwE,35323
|
|
10
|
-
paradigma/pipelines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
-
paradigma/pipelines/gait_pipeline.py,sha256=u4Jocmt94V08Yw4ZxsNPeh-E-SN6a1gMN-OHiTqkb50,28452
|
|
12
|
-
paradigma/pipelines/pulse_rate_pipeline.py,sha256=aBDopwWvfabLCQM6De9PHNKKzL03xD_29jWcsElnjCw,17711
|
|
13
|
-
paradigma/pipelines/pulse_rate_utils.py,sha256=rlXze04meLFlyPaxMBYhvz3_vu3SM77RF-7mLPegTm0,26772
|
|
14
|
-
paradigma/pipelines/tremor_pipeline.py,sha256=IgDAnYbOLYaadBeS-ylT_O24qNuXbWVhopuU5rIrCNQ,14302
|
|
15
|
-
paradigma/preprocessing.py,sha256=U9ZGnmUg7M77i00YJ9_gV51p3giYqhWKDAeXZk-veQo,14570
|
|
16
|
-
paradigma/segmenting.py,sha256=hgT4dtg23eyvjUraEXCzX8u0kSRx4vArjQgF10r61P8,13909
|
|
17
|
-
paradigma/testing.py,sha256=zWPBj7Q1Td6rgeMGoAWi6rIVLB8M6_FNUxlZSbpWqEM,18547
|
|
18
|
-
paradigma/util.py,sha256=EvZvwRxdQXXAx_U5QsMVKkjTFp__M_pNF61bhefGza4,17289
|
|
19
|
-
paradigma-1.0.3.dist-info/LICENSE,sha256=Lda8kIVC2kbmlSeYaUWwUwV75Q-q31idYvo18HUTfiw,9807
|
|
20
|
-
paradigma-1.0.3.dist-info/METADATA,sha256=XM1odiNJLhbvpz6rIjQYrM0ET2fGPhI6RpOId6G21CI,11972
|
|
21
|
-
paradigma-1.0.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
22
|
-
paradigma-1.0.3.dist-info/RECORD,,
|