From 191e53e54332e766828a9adc3c58ebdc34fa5cdd Mon Sep 17 00:00:00 2001 From: Primoz Date: Wed, 23 Mar 2022 15:13:53 +0000 Subject: [PATCH] Added cf provider for EDA feature processing. --- .gitignore | 1 + config.yaml | 9 ++- data/external/empatica/empatica1/E4 Data.zip | Bin 1678743 -> 1678743 bytes .../cf/main.py | 55 +++++------------- 4 files changed, 22 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index 4ac47683..6cf83e29 100644 --- a/.gitignore +++ b/.gitignore @@ -93,6 +93,7 @@ packrat/* # exclude data from source control by default data/external/* +!/data/external/empatica/empatica1/E4 Data.zip !/data/external/.gitkeep !/data/external/stachl_application_genre_catalogue.csv !/data/external/timesegments*.csv diff --git a/config.yaml b/config.yaml index 381e5cb0..290b8b89 100644 --- a/config.yaml +++ b/config.yaml @@ -509,7 +509,14 @@ EMPATICA_ELECTRODERMAL_ACTIVITY: SRC_SCRIPT: src/features/empatica_electrodermal_activity/dbdp/main.py CF: COMPUTE: True - FEATURES: ['mean', 'std', 'q25', 'q75', 'qd'] # To-Do add remaining features from CF helper file. + FEATURES: ['mean', 'std', 'q25', 'q75', 'qd', 'deriv', 'power', 'numPeaks', 'ratePeaks', 'powerPeaks', + 'sumPosDeriv', 'propPosDeriv', 'derivTonic', 'sigTonicDifference', 'freqFeats', + 'maxPeakAmplitudeChangeBefore', 'maxPeakAmplitudeChangeAfter', + 'avgPeakAmplitudeChangeBefore', 'avgPeakAmplitudeChangeAfter', 'avgPeakChangeRatio', + 'maxPeakIncreaseTime', 'maxPeakDecreaseTime', 'maxPeakDuration', 'maxPeakChangeRatio', + 'avgPeakIncreaseTime', 'avgPeakDecreaseTime', 'avgPeakDuration', 'maxPeakResponseSlopeBefore', + 'maxPeakResponseSlopeAfter', 'signalOverallChange', 'changeDuration', 'changeRate', + 'significantIncrease', 'significantDecrease'] SRC_SCRIPT: src/features/empatica_electrodermal_activity/cf/main.py # See https://www.rapids.science/latest/features/empatica-blood-volume-pulse/ diff --git a/data/external/empatica/empatica1/E4 Data.zip b/data/external/empatica/empatica1/E4 Data.zip index 40691f5f799c3917f192e03ecaf8500bc511525c..bb1e36fe7f3420a0072bb7889cec4e6c8d0cc1a6 100644 GIT binary patch delta 388 zcmYk$ze_?<6bJD0e)yiLnY~x$(SkQP1c5XJ5t3x);LsqtM-&#VMnMD-A<`Pef$kF? zO|>)xA|ip*P=A7LLJ|Z)Lu**a2SOJCDSUn2-5cfQ_;s z8)G3h&J1R<2{y^Xjb?A^Eva7a9u}*P6=^sY;?b#Gk)?{vyHb(Wy6kE8$PhTI001ou zoYt=O>dkG6HUx$5Vyk@Ma}NL{h``U|eBv(E zk=ma|;XXwn8>2M$5eZUPU_jYcP5KfT8~(%bg1*0GLT)ujX@QY{L6pw8tZ2d{$Ho~= z-8&zQ_QVx$yJo`v=1$q|(1VR(vTXFxVhyAEJBP*WI;{xAVauK4`HIti-Gp=|<2L;l Q-4lMZBmFvYI<8^t4+2z=!~g&Q delta 307 zcmbQfJ8k;zwDx~ng@ITEh(&=|42Z?I|Jy3D`$;2HD-&ZY6Od$XWnyV%Vr^w&Yh_|@ zW#VXM;%sH&YGvYXW#VaN;%#N(Yh~hZWfEv*65Prp^w65c+g~xb{kgT!_UG2Zl2y~S z=1OX?GXR03v-7mMk`e;KTZGN+EpIUXU!Y^9d`1Q`q$Xb0j4dE-CPv zfn?m6)xjzPycwC~8AO0)a4>*OpRO=lQjEI+$e*Mj!QkrR2r_s2zB!T#(<^67O0mhl zlwj}(LI_?23Nq`;Nlt$^TT%w1PHPTOXn(!rboV)uvLGR`=~Z(iRhTQAB&RQ&BN@&- QAISI(l@prYJXcZ#02-@gQ2+n{ diff --git a/src/features/empatica_electrodermal_activity/cf/main.py b/src/features/empatica_electrodermal_activity/cf/main.py index 524ebd99..54cb417d 100644 --- a/src/features/empatica_electrodermal_activity/cf/main.py +++ b/src/features/empatica_electrodermal_activity/cf/main.py @@ -1,57 +1,29 @@ import pandas as pd from scipy.stats import entropy +import sys +sys.path.insert(1, '/workspaces/rapids/calculatingfeatures') +from CalculatingFeatures.helper_functions import convert1DEmpaticaToArray, convertInputInto2d, gsrFeatureNames +from CalculatingFeatures.calculate_features import calculateFeatures -def statsFeatures(eda_data, features, eda_features): - col_name = "electrodermal_activity" - if "sumeda" in features: - eda_features["sumeda"] = eda_data[["local_segment", col_name]].groupby(["local_segment"])[ - col_name].sum() - if "maxeda" in features: - eda_features["maxeda"] = eda_data[["local_segment", col_name]].groupby(["local_segment"])[ - col_name].max() - if "mineda" in features: - eda_features["mineda"] = eda_data[["local_segment", col_name]].groupby(["local_segment"])[ - col_name].min() - if "avgeda" in features: - eda_features["avgeda"] = eda_data[["local_segment", col_name]].groupby(["local_segment"])[ - col_name].mean() - if "medianeda" in features: - eda_features["medianeda"] = eda_data[["local_segment", col_name]].groupby(["local_segment"])[ - col_name].median() - if "modeeda" in features: - eda_features["modeeda"] = eda_data[["local_segment", col_name]].groupby(["local_segment"])[ - col_name].agg(lambda x: pd.Series.mode(x)[0]) - if "stdeda" in features: - eda_features["stdeda"] = eda_data[["local_segment", col_name]].groupby(["local_segment"])[ - col_name].std() - if "diffmaxmodeeda" in features: - eda_features["diffmaxmodeeda"] = eda_data[["local_segment", col_name]].groupby(["local_segment"])[ - col_name].max() - \ - eda_data[["local_segment", col_name]].groupby(["local_segment"])[ - col_name].agg(lambda x: pd.Series.mode(x)[0]) - if "diffminmodeeda" in features: - eda_features["diffminmodeeda"] = eda_data[["local_segment", col_name]].groupby(["local_segment"])[ - col_name].agg(lambda x: pd.Series.mode(x)[0]) - \ - eda_data[["local_segment", col_name]].groupby(["local_segment"])[ - col_name].min() - if "entropyeda" in features: - eda_features["entropyeda"] = eda_data[["local_segment", col_name]].groupby(["local_segment"])[ - col_name].agg(entropy) +pd.set_option('display.max_columns', None) - return eda_features def extractEDAFeaturesFromIntradayData(eda_intraday_data, features, time_segment, filter_data_by_segment): eda_intraday_features = pd.DataFrame(columns=["local_segment"] + features) - if not eda_intraday_data.empty: + + if not eda_intraday_data.empty: eda_intraday_data = filter_data_by_segment(eda_intraday_data, time_segment) if not eda_intraday_data.empty: + eda_intraday_features = pd.DataFrame() - # get stats of eda - eda_intraday_features = statsFeatures(eda_intraday_data, features, eda_intraday_features) + # apply a method from calculate features module + eda_intraday_features = \ + eda_intraday_data.groupby('local_segment').apply(\ + lambda x: calculateFeatures(convertInputInto2d(x['electrodermal_activity'], x.shape[0]), fs=4, featureNames=features)) eda_intraday_features.reset_index(inplace=True) @@ -63,8 +35,7 @@ def cf_features(sensor_data_files, time_segment, provider, filter_data_by_segmen requested_intraday_features = provider["FEATURES"] # name of the features this function can compute - base_intraday_features_names = ["maxeda", "mineda", "avgeda", "medianeda", "modeeda", "stdeda", "diffmaxmodeeda", - "diffminmodeeda", "entropyeda"] + base_intraday_features_names = gsrFeatureNames # the subset of requested features this function can compute intraday_features_to_compute = list(set(requested_intraday_features) & set(base_intraday_features_names))