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
Files changed (1) hide show
  1. 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
- try:
172
- hrv_features.extend(FEATURE_COLS[feature])
173
- except KeyError:
174
- raise KeyError(f"{feature} is not a supported feature domain. feature_domains may only include 'time', 'freq' and 'non_lin'.")
175
- result = nk.hrv(self._convert_format(data), sampling_rate)
176
- return result[hrv_features]
 
 
 
 
 
 
 
 
 
 
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