Georg Willer
commited on
Commit
·
597061b
1
Parent(s):
75a0783
Do not compute all features and discard not needed features later on (takes too long)
Browse files- rpeaks2hrv.py +16 -38
rpeaks2hrv.py
CHANGED
@@ -13,36 +13,6 @@ class FeatureDomain(Enum):
|
|
13 |
NON_LINEAR = 'non_lin'
|
14 |
|
15 |
|
16 |
-
FEATURE_COLS = {
|
17 |
-
FeatureDomain.TIME.value: [
|
18 |
-
'HRV_MeanNN', 'HRV_SDNN', 'HRV_SDANN1', 'HRV_SDNNI1',
|
19 |
-
'HRV_SDANN2', 'HRV_SDNNI2', 'HRV_SDANN5', 'HRV_SDNNI5',
|
20 |
-
'HRV_RMSSD', 'HRV_SDSD', 'HRV_CVNN', 'HRV_CVSD', 'HRV_MedianNN',
|
21 |
-
'HRV_MadNN', 'HRV_MCVNN', 'HRV_IQRNN', 'HRV_SDRMSSD', 'HRV_Prc20NN', 'HRV_Prc80NN',
|
22 |
-
'HRV_pNN50', 'HRV_pNN20', 'HRV_MinNN', 'HRV_MaxNN', 'HRV_HTI', 'HRV_TINN'],
|
23 |
-
FeatureDomain.FREQUENCY.value: [
|
24 |
-
'HRV_ULF', 'HRV_VLF', 'HRV_LF', 'HRV_HF', 'HRV_VHF', 'HRV_TP',
|
25 |
-
'HRV_LFHF', 'HRV_LFn', 'HRV_HFn', 'HRV_LnHF'
|
26 |
-
],
|
27 |
-
FeatureDomain.NON_LINEAR.value: [
|
28 |
-
'HRV_SD1', 'HRV_SD2', 'HRV_SD1SD2', 'HRV_S', 'HRV_CSI', 'HRV_CVI',
|
29 |
-
'HRV_CSI_Modified', 'HRV_PIP', 'HRV_IALS', 'HRV_PSS', 'HRV_PAS',
|
30 |
-
'HRV_GI', 'HRV_SI', 'HRV_AI', 'HRV_PI', 'HRV_C1d', 'HRV_C1a',
|
31 |
-
'HRV_SD1d', 'HRV_SD1a', 'HRV_C2d', 'HRV_C2a', 'HRV_SD2d', 'HRV_SD2a',
|
32 |
-
'HRV_Cd', 'HRV_Ca', 'HRV_SDNNd', 'HRV_SDNNa', 'HRV_DFA_alpha1',
|
33 |
-
'HRV_MFDFA_alpha1_Width', 'HRV_MFDFA_alpha1_Peak',
|
34 |
-
'HRV_MFDFA_alpha1_Mean', 'HRV_MFDFA_alpha1_Max',
|
35 |
-
'HRV_MFDFA_alpha1_Delta', 'HRV_MFDFA_alpha1_Asymmetry',
|
36 |
-
'HRV_MFDFA_alpha1_Fluctuation', 'HRV_MFDFA_alpha1_Increment',
|
37 |
-
'HRV_DFA_alpha2', 'HRV_MFDFA_alpha2_Width', 'HRV_MFDFA_alpha2_Peak',
|
38 |
-
'HRV_MFDFA_alpha2_Mean', 'HRV_MFDFA_alpha2_Max',
|
39 |
-
'HRV_MFDFA_alpha2_Delta', 'HRV_MFDFA_alpha2_Asymmetry',
|
40 |
-
'HRV_MFDFA_alpha2_Fluctuation', 'HRV_MFDFA_alpha2_Increment',
|
41 |
-
'HRV_ApEn', 'HRV_SampEn', 'HRV_ShanEn', 'HRV_FuzzyEn', 'HRV_MSEn',
|
42 |
-
'HRV_CMSEn', 'HRV_RCMSEn', 'HRV_CD', 'HRV_HFD', 'HRV_KFD', 'HRV_LZC'
|
43 |
-
]
|
44 |
-
}
|
45 |
-
|
46 |
|
47 |
class RPeak2HRV():
|
48 |
|
@@ -165,15 +135,23 @@ class RPeak2HRV():
|
|
165 |
return data_for_pipeline
|
166 |
|
167 |
def _calculate_features(self, data, feature_domains, sampling_rate):
|
168 |
-
# Calculate all possible features, then only keep needed
|
169 |
-
hrv_features = []
|
170 |
for feature in feature_domains:
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
177 |
|
178 |
|
179 |
|
|
|
13 |
NON_LINEAR = 'non_lin'
|
14 |
|
15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
|
17 |
class RPeak2HRV():
|
18 |
|
|
|
135 |
return data_for_pipeline
|
136 |
|
137 |
def _calculate_features(self, data, feature_domains, sampling_rate):
|
|
|
|
|
138 |
for feature in feature_domains:
|
139 |
+
if (feature not in [item.value for item in FeatureDomain]):
|
140 |
+
raise KeyError(f"'{feature}' is not a supported feature domain. feature_domains may only include 'time', 'freq' and 'non_lin'.")
|
141 |
+
data = self._convert_format(data)
|
142 |
+
if FeatureDomain.TIME.value in feature_domains and FeatureDomain.FREQUENCY.value in feature_domains and FeatureDomain.NON_LINEAR.value in feature_domains:
|
143 |
+
return nk.hrv(data, sampling_rate)
|
144 |
+
else:
|
145 |
+
result = pd.DataFrame()
|
146 |
+
if FeatureDomain.TIME.value in feature_domains:
|
147 |
+
result = nk.hrv_time(data, sampling_rate)
|
148 |
+
if FeatureDomain.FREQUENCY.value in feature_domains:
|
149 |
+
frequency_values = nk.hrv_frequency(data, sampling_rate)
|
150 |
+
result = pd.concat([result, frequency_values], axis=1)
|
151 |
+
if FeatureDomain.NON_LINEAR.value in feature_domains:
|
152 |
+
nonlinear_values = nk.hrv_nonlinear(data, sampling_rate)
|
153 |
+
result = pd.concat([result, nonlinear_values], axis=1)
|
154 |
+
return result
|
155 |
|
156 |
|
157 |
|