예제 #1
0
def extract_features(data, sampling_rate):
    detector = Detectors(sampling_rate)
    hrv_class = HRV(sampling_rate)

    # Borrar si todo va bien
    # np.array_split(data, sampling_rate)

    # PROCESAR POR TROZOS

    # FOR splitted data
    # Unir horizontalmente ecg y eda
    # unir verticalmente cada iteracion

    splitted = split_in_seconds(data, sampling_rate, 30)
    seccion = None
    names = None
    for idx, m in enumerate(splitted):
        print(f'Procesando split {idx} con longitud {len(m)}')

        try:
            ecg, names_ecg = ecg_processing(m[:, 1], detector, hrv_class)
            eda, names_eda = eda_processing(m[:, 0])
            full_iteration = np.hstack((eda, ecg))
            if seccion is None:
                seccion = np.empty((0, len(full_iteration)))
                names = names_eda + names_ecg + ["stress_lvl"]
            seccion = np.vstack((seccion, full_iteration))
        except Exception:
            print("Error en un dato. Continuando...")
            continue
    return seccion, names
for i in range(total_subjects):
    #for i in range(2):
    print(i)
    sitting_class = Ecg(data_path, i, 'sitting')
    sitting_class.filter_data()
    maths_class = Ecg(data_path, i, 'maths')
    maths_class.filter_data()

    detectors = Detectors(sitting_class.fs)

    if sitting_class.anno_cs_exists and maths_class.anno_cs_exists and (i !=
                                                                        11):
        subject.append(i)

        hrv_class = HRV(sitting_class.fs)

        if "e" in sys.argv[1]:
            ecg_channel_sitting = sitting_class.einthoven_II
            ecg_channel_maths = maths_class.einthoven_II
        elif "v" in sys.argv[1]:
            ecg_channel_sitting = sitting_class.cs_V2_V1
            ecg_channel_maths = maths_class.cs_V2_V1
        else:
            print(
                "Bad argument. Specify 'e' for Einthoven or 'v' for the Chest strap."
            )
            exit(1)

        r_peaks = detectors.swt_detector(ecg_channel_sitting)
        sitting_rr_sd.append(hrv_class.RMSSD(r_peaks, True))
예제 #3
0
total_subjects = 25
subject = []

for i in range(total_subjects):
    #for i in range(2):
    print(i)
    sitting_class = GUDb(i, 'sitting')
    sitting_class.filter_data()
    maths_class = GUDb(i, 'maths')
    maths_class.filter_data()

    if sitting_class.anno_cs_exists and maths_class.anno_cs_exists:
        subject.append(i)

        hrv_class = HRV(sitting_class.fs)

        maths_true_rr = maths_class.anno_cs
        maths_true_hf.append(hrv_class.fAnalysis(maths_true_rr))

        sitting_true_rr = sitting_class.anno_cs
        sitting_true_hf.append(hrv_class.fAnalysis(sitting_true_rr))

subject = np.array(subject)
width = 0.3

fig, ax = plt.subplots()
rects1 = ax.bar(subject + (0 * width), sitting_true_hf, width)
rects2 = ax.bar(subject + (1 * width), maths_true_hf, width)

ax.set_ylabel('LF/HF ratio')
예제 #4
0
subject = []

do_normalise = True

for i in range(total_subjects):
    #for i in range(2):
    print(i)
    sitting_class = GUDb(i, 'sitting')
    sitting_class.filter_data()
    maths_class = GUDb(i, 'maths')
    maths_class.filter_data()

    if sitting_class.anno_cs_exists and maths_class.anno_cs_exists:
        subject.append(i)

        hrv_class = HRV(sitting_class.fs)

        maths_true_rr = maths_class.anno_cs
        maths_true.append(
            hrv_class.RMSSD(maths_true_rr, normalise=do_normalise))

        sitting_true_rr = sitting_class.anno_cs
        sitting_true.append(
            hrv_class.RMSSD(sitting_true_rr, normalise=do_normalise))

subject = np.array(subject)
width = 0.4

fig, ax = plt.subplots()
rects1 = ax.bar(subject + (0 * width), sitting_true, width)
rects2 = ax.bar(subject + (1 * width), maths_true, width)
예제 #5
0
파일: utils.py 프로젝트: kaushil24/IoT-AI
    def ECGfeatures(self, df, sampling_rate=500):
        drivers = df['Driver'].value_counts()
        df.reset_index(inplace=True)
        # Filtering ECG to remove noise
        for dr in drivers.index:
            after = ecg.ecg(signal=df.loc[df['Driver'] == dr, 'ECG'],
                            sampling_rate=sampling_rate,
                            show=False)
            df.loc[df['Driver'] == dr, 'ECG'] = after[1]

        #Calculating R-R Peaks
        detectors = Detectors(sampling_rate)
        r_peaks = detectors.engzee_detector(df['ECG'])

        # Calculating R-R Interval
        df['RMSSD'] = [0 for _ in range(len(df))]
        rp = pd.Series(r_peaks)
        hrv_obj = HRV(sampling_rate)
        for dr in drivers.index:
            start = df.loc[df['Driver'] == dr].index[0]
            end = df.loc[df['Driver'] == dr].index[-1]
            RMSSD = hrv_obj.RMSSD(rp[(rp > start) & (rp < end)],
                                  normalise=False)
            df.loc[df['Driver'] == dr, 'RMSSD'] = RMSSD

        print('Finished extracting RMSSD successfully')

        drivers = df['Driver'].value_counts().keys()
        # Calculating other ECG features
        df['meanNN'] = [0 for _ in range(len(df))]
        df['sdNN'] = [0 for _ in range(len(df))]
        df['cvNN'] = [0 for _ in range(len(df))]
        df['CVSD'] = [0 for _ in range(len(df))]
        df['medianNN'] = [0 for _ in range(len(df))]
        df['madNN'] = [0 for _ in range(len(df))]
        df['mcvNN'] = [0 for _ in range(len(df))]
        df['pNN20'] = [0 for _ in range(len(df))]
        df['pNN50'] = [0 for _ in range(len(df))]
        for dr in drivers:
            start = df.loc[df['Driver'] == dr, :].index[0]
            end = df.loc[df['Driver'] == dr, :].index[-1]
            crop = rp[(rp > start) & (rp < end)].diff()
            rmssd = df.loc[start, 'RMSSD']
            meanNN = crop.mean()
            df.loc[df['Driver'] == dr, 'meanNN'] = meanNN
            std = crop.std()
            df.loc[df['Driver'] == dr, 'sdNN'] = std
            cvNN = std / meanNN
            df.loc[df['Driver'] == dr, 'cvNN'] = cvNN
            cvsd = rmssd / meanNN
            df.loc[df['Driver'] == dr, 'CVSD'] = cvsd
            medianNN = crop.median()
            df.loc[df['Driver'] == dr, 'medianNN'] = medianNN
            madNN = crop.mad()
            df.loc[df['Driver'] == dr, 'madNN'] = madNN
            mcvNN = madNN / medianNN
            df.loc[df['Driver'] == dr, 'mcvNN'] = mcvNN
            pNN20 = hrv_obj.pNN20(crop)
            df.loc[df['Driver'] == dr, 'pNN20'] = pNN20
            pNN50 = hrv_obj.pNN50(crop)
            df.loc[df['Driver'] == dr, 'pNN50'] = pNN50

        print(
            'Finished extracting meanNN, sdNN, cvNN, CVSD, medianNN, madNN, mcvNN, pNN20, pNN50 successfully'
        )
        self.df = df
        return df
예제 #6
0
from ecgdetectors import Detectors
import scipy.stats as stats
import sys
from ecg_gudb_database import GUDb

# for plotting max hflf ratio
hflfmax = 10

# example subject for the spectra
subj = 1

if len(sys.argv) > 1:
    subj = int(sys.argv[1])

sitting_class = GUDb(subj, 'sitting')
hrv_class = HRV(sitting_class.fs)
lfhf = hrv_class.fAnalysis(sitting_class.anno_cs)
print("Subject sitting: lf/hf=", lfhf)

fig = plt.figure()
fig.suptitle('Subject sitting doing nothing')
# in time
plt.title("Sitting")
plt.subplot(211)
plt.plot(hrv_class.t_hr_linear, hrv_class.hr_linear)
plt.plot(hrv_class.t_hr_discrete, hrv_class.hr_discrete, "x")
plt.xlabel("t/seconds")
plt.ylabel("heartrate/Hz")

# now the Fourier spectrum
plt.subplot(212)
def std_of_successive_diffs(ecg_signal, sample_rate=1000):
    hr_analyzer = HRV(sample_rate)
    detectors = Detectors(sample_rate)
    r_peaks = detectors.hamilton_detector(ecg_signal)
    return hr_analyzer.SDSD(r_peaks)
def rms_of_successive_diffs(ecg_signal, sample_rate=1000):
    hr_analyzer = HRV(sample_rate)
    detectors = Detectors(sample_rate)
    r_peaks = detectors.hamilton_detector(ecg_signal)
    return hr_analyzer.RMSSD(r_peaks, normalise=False)
def mean_hr(ecg_signal, sample_rate=1000):
    hr_analyzer = HRV(sample_rate)
    detectors = Detectors(sample_rate)
    r_peaks = detectors.hamilton_detector(ecg_signal)
    heart_r = hr_analyzer.HR(r_peaks)
    return np.mean(heart_r)