예제 #1
0
def heart_beats_features2(thb):
    means = np.array([col.mean() for col in thb.T])
    stds = np.array([col.std() for col in thb.T])

    PQ = means[:int(0.15 * loader.FREQUENCY)]
    ST = means[int(0.25 * loader.FREQUENCY):]
    r_pos = int(0.2 * loader.FREQUENCY)

    a = np.zeros(15)
    p_pos = np.argmax(PQ)
    t_pos = np.argmax(ST)
    a[0] = r_pos - p_pos
    a[1] = PQ[p_pos]
    a[2] = PQ[p_pos] / means[r_pos]
    a[3] = t_pos
    a[4] = ST[t_pos]
    a[5] = ST[t_pos] / means[r_pos]
    a[6] = PQ[p_pos] / ST[t_pos]
    a[7] = skew(PQ)
    a[8] = kurtosis(PQ)
    a[9] = skew(ST)
    a[10] = kurtosis(ST)
    a[11] = calcActivity(means)
    a[12] = calcMobility(means)
    a[13] = calcComplexity(means)
    a[14] = np.mean(stds)

    return a
예제 #2
0
def heart_beats_features2(thb, rpeaks):
    if len(thb) == 0:
        thb = np.zeros((1, int(0.6 * loader.FREQUENCY)), dtype=np.int32)

    diff_rpeak = np.median(np.diff(rpeaks))
    means = heartbeats.median_heartbeat(thb)
    r_pos = int(0.2 * loader.FREQUENCY)

    if diff_rpeak < 350:
        tmp1 = 100 - int(diff_rpeak / 3)
        tmp2 = 100 + int(2 * diff_rpeak / 3)
        for i in range(len(means)):
            if i < tmp1:
                means[i] = 0
            elif i > tmp2:
                means[i] = 0
        freq_cof = diff_rpeak / 350 * loader.FREQUENCY
    else:
        freq_cof = loader.FREQUENCY

    a = dict()
    r_list = []
    p_list = []
    q_list = []
    s_list = []
    t_list = []

    for i in range(np.shape(thb)[0]):
        r_pos = int(0.2 * loader.FREQUENCY)
        template = thb[i, :]
        PQ = template[r_pos - int(0.2 * freq_cof):r_pos - int(0.05 * freq_cof)]
        ST = template[r_pos + int(0.05 * freq_cof):r_pos + int(0.4 * freq_cof)]
        QR = template[r_pos - int(0.07 * freq_cof):r_pos]
        RS = template[r_pos:r_pos + int(0.07 * freq_cof)]

        q_list.append(np.min(QR))
        s_list.append(np.min(RS))

        p_list.append(np.max(PQ))
        t_list.append(np.max(ST))
        r_list.append(template[r_pos])

    a['T_P_max'] = np.max(p_list)
    a['T_P_min'] = np.min(p_list)
    a['T_P_std'] = np.std(p_list)
    a['T_Q_max'] = np.max(q_list)
    a['T_Q_min'] = np.min(q_list)
    a['T_Q_std'] = np.std(q_list)
    a['T_R_max'] = np.max(r_list)
    a['T_R_min'] = np.min(r_list)
    a['T_R_std'] = np.std(r_list)
    a['T_S_max'] = np.max(s_list)
    a['T_S_min'] = np.min(s_list)
    a['T_S_std'] = np.std(s_list)
    a['T_T_max'] = np.max(t_list)
    a['T_T_min'] = np.min(t_list)
    a['T_T_std'] = np.std(t_list)

    # PQ = means[:int(0.15 * loader.FREQUENCY)]
    PQ = means[r_pos - int(0.2 * freq_cof):r_pos - int(0.05 * freq_cof)]
    #ST = means[int(0.25 * loader.FREQUENCY):]
    #ST = means[r_pos + int(0.05 * freq_cof):r_pos + int(0.4 * freq_cof)]
    #QR = means[int(0.13 * loader.FREQUENCY):r_pos]
    QR = means[r_pos - int(0.07 * freq_cof):r_pos]
    RS = means[r_pos:r_pos + int(0.07 * freq_cof)]

    #q_pos = int(0.13 * loader.FREQUENCY) + np.argmin(QR)
    q_pos = r_pos - len(QR) + np.argmin(QR)
    s_pos = r_pos + np.argmin(RS)

    ST = means[s_pos + int(0.08 * freq_cof):r_pos + int(0.35 * freq_cof)]
    p_pos = np.argmax(PQ)

    t_pos = np.argmax(ST)
    if t_pos / len(ST) < 0.2 or t_pos / len(ST) > 0.8:
        t_pos = np.argmin(ST)
        if t_pos / len(ST) < 0.2 or t_pos / len(ST) > 0.8:
            t_pos = int(0.12 * freq_cof)
    t_pos = t_pos + s_pos + int(0.08 * freq_cof)
    t_begin = max(s_pos + int(0.08 * freq_cof), t_pos - int(0.12 * freq_cof))
    st_begin = max(s_pos + int(0.035 * freq_cof),
                   t_begin - int(0.06 * freq_cof))
    #t_begin = int(0.035 * freq_cof) + s_pos
    #t_end = int(0.24 * freq_cof) + t_begin
    t_end = min(len(means) - 1, int(t_pos + int(0.12 * freq_cof)))

    #t_wave = ST[max(0, t_pos - int(0.08 * freq_cof)):min(len(ST), t_pos + int(0.08 * freq_cof))]
    t_wave = means[t_begin:t_end]
    p_wave = PQ[max(0, p_pos -
                    int(0.06 * freq_cof)):min(len(PQ), p_pos +
                                              int(0.06 * freq_cof))]
    st_wave = means[st_begin:t_begin]
    p_pos = p_pos + r_pos - int(0.2 * freq_cof)

    QRS = means[q_pos:s_pos]
    #
    a['PR_interval'] = (r_pos - p_pos) / 500
    a['PQ_interval'] = (p_pos - q_pos) / 500
    a['RT_interval'] = (t_pos - r_pos) / 500
    a['PT_interval'] = (t_pos - p_pos) / 500
    a['ST_interval'] = (t_pos - s_pos) / 500
    a['T_slope1'] = (means[t_pos] - means[t_begin]) / len(t_wave)
    a['T_slope2'] = (means[t_pos] - means[t_end]) / len(t_wave)
    a['ST_slope'] = (means[t_begin] - means[st_begin]) / len(st_wave)
    a['RS_interval'] = (r_pos - q_pos) / 500
    a['QR_interval'] = (q_pos - r_pos) / 500
    a['R_time'] = len(p_wave) / 500
    a['T_time'] = len(t_wave) / 500
    a['t_activity'] = calcActivity(t_wave)
    a['t_mobility'] = calcMobility(t_wave)
    a['t_complexity'] = calcComplexity(t_wave)
    a['p_activity'] = calcActivity(p_wave)
    a['p_mobility'] = calcMobility(p_wave)
    a['p_complexity'] = calcComplexity(p_wave)
    #

    a['P_max'] = means[p_pos]
    a['P_min'] = min(p_wave)
    a['P_to_R'] = means[p_pos] / means[r_pos]
    a['P_to_Q'] = means[p_pos] - means[q_pos]

    a['T_am'] = means[t_pos]
    a['T_max'] = max(t_wave)
    a['T_min'] = min(t_wave)
    a['T_to_R'] = means[t_pos] / means[r_pos]
    a['T_to_S'] = means[t_pos] / means[s_pos]
    a['P_to_T'] = means[p_pos] / means[t_pos]
    a['P_skew'] = skew(p_wave)
    a['P_kurt'] = kurtosis(p_wave)
    a['T_skew'] = skew(t_wave)
    a['T_kurt'] = kurtosis(t_wave)
    a['activity'] = calcActivity(means)
    a['mobility'] = calcMobility(means)
    a['complexity'] = calcComplexity(means)

    qrs_min = abs(min(QRS))
    qrs_max = abs(max(QRS))
    qrs_abs = max(qrs_min, qrs_max)
    sign = -1 if qrs_min > qrs_max else 1

    a['QRS_diff'] = sign * abs(qrs_min / qrs_abs)
    a['QS_diff'] = abs(means[s_pos] - means[q_pos])
    a['QRS_kurt'] = kurtosis(QRS)
    a['QRS_skew'] = skew(QRS)
    a['QRS_minmax'] = qrs_max - qrs_min

    a['T_wave_time'] = len(t_wave) / 500
    a['P_wave_time'] = len(p_wave) / 500

    a['Temp_Median_p_5'] = np.percentile(means, 5)
    a['Temp_Median_p_25'] = np.percentile(means, 25)
    a['Temp_Median_p_75'] = np.percentile(means, 75)
    a['Temp_Median_p_95'] = np.percentile(means, 95)

    a['T_Median_p_5'] = np.percentile(t_wave, 5)
    a['T_Median_p_25'] = np.percentile(t_wave, 25)
    a['T_Median_p_75'] = np.percentile(t_wave, 75)
    a['T_Median_p_95'] = np.percentile(t_wave, 95)

    a.update(fft_features(means))
    return a
예제 #3
0
def heart_beats_features2(thb):
    means = heartbeats.median_heartbeat(thb)
    stds = np.array([np.std(col) for col in thb.T])

    r_pos = int(0.2 * loader.FREQUENCY)

    PQ = means[:int(0.15 * loader.FREQUENCY)]
    ST = means[int(0.25 * loader.FREQUENCY):]

    QR = means[int(0.13 * loader.FREQUENCY):r_pos]
    RS = means[r_pos:int(0.27 * loader.FREQUENCY)]

    q_pos = int(0.13 * loader.FREQUENCY) + np.argmin(QR)
    s_pos = r_pos + np.argmin(RS)

    p_pos = np.argmax(PQ)
    t_pos = np.argmax(ST)

    t_wave = ST[max(0, t_pos - int(0.08 * loader.FREQUENCY)
                    ):min(len(ST), t_pos + int(0.08 * loader.FREQUENCY))]
    p_wave = PQ[max(0, p_pos - int(0.06 * loader.FREQUENCY)
                    ):min(len(PQ), p_pos + int(0.06 * loader.FREQUENCY))]

    r_plus = sum(1 if b[r_pos] > 0 else 0 for b in thb)
    r_minus = len(thb) - r_plus

    QRS = means[q_pos:s_pos]

    a = dict()
    a['PR_interval'] = r_pos - p_pos
    a['P_max'] = PQ[p_pos]
    a['P_to_R'] = PQ[p_pos] / means[r_pos]
    a['P_to_Q'] = PQ[p_pos] - means[q_pos]
    a['ST_interval'] = t_pos
    a['T_max'] = ST[t_pos]
    a['R_plus'] = r_plus / max(1, len(thb))
    a['R_minus'] = r_minus / max(1, len(thb))
    a['T_to_R'] = ST[t_pos] / means[r_pos]
    a['T_to_S'] = ST[t_pos] - means[s_pos]
    a['P_to_T'] = PQ[p_pos] / ST[t_pos]
    a['P_skew'] = skew(p_wave)
    a['P_kurt'] = kurtosis(p_wave)
    a['T_skew'] = skew(t_wave)
    a['T_kurt'] = kurtosis(t_wave)
    a['activity'] = calcActivity(means)
    a['mobility'] = calcMobility(means)
    a['complexity'] = calcComplexity(means)
    a['QRS_len'] = s_pos - q_pos

    qrs_min = abs(min(QRS))
    qrs_max = abs(max(QRS))
    qrs_abs = max(qrs_min, qrs_max)
    sign = -1 if qrs_min > qrs_max else 1

    a['QRS_diff'] = sign * abs(qrs_min / qrs_abs)
    a['QS_diff'] = abs(means[s_pos] - means[q_pos])
    a['QRS_kurt'] = kurtosis(QRS)
    a['QRS_skew'] = skew(QRS)
    a['QRS_minmax'] = qrs_max - qrs_min
    a['P_std'] = np.mean(stds[:q_pos])
    a['T_std'] = np.mean(stds[s_pos:])

    return a
def heart_beats_features(thb, diff_rpeak):
    means = heartbeats.median_heartbeat(thb)
    r_pos = int(0.2 * loader.FREQUENCY)

    if diff_rpeak < 350:
        tmp1 = 100 - int(diff_rpeak / 3)
        tmp2 = 100 + int(2 * diff_rpeak / 3)
        for i in range(len(means)):
            if i < tmp1:
                means[i] = 0
            elif i > tmp2:
                means[i] = 0
        freq_cof = diff_rpeak / 350 * loader.FREQUENCY
    else:
        freq_cof = loader.FREQUENCY

    # PQ = means[:int(0.15 * loader.FREQUENCY)]
    PQ = means[r_pos - int(0.2 * freq_cof):r_pos - int(0.05 * freq_cof)]
    #ST = means[int(0.25 * loader.FREQUENCY):]
    #ST = means[r_pos + int(0.05 * freq_cof):r_pos + int(0.4 * freq_cof)]
    #QR = means[int(0.13 * loader.FREQUENCY):r_pos]
    QR = means[r_pos - int(0.07 * freq_cof):r_pos]
    RS = means[r_pos:r_pos + int(0.07 * freq_cof)]

    #q_pos = int(0.13 * loader.FREQUENCY) + np.argmin(QR)
    q_pos = r_pos - len(QR) + np.argmin(QR)
    s_pos = r_pos + np.argmin(RS)

    ST = means[s_pos + int(0.08 * freq_cof):r_pos + int(0.35 * freq_cof)]
    p_pos = np.argmax(PQ)

    t_pos = np.argmax(ST)
    if t_pos / len(ST) < 0.2 or t_pos / len(ST) > 0.8:
        t_pos = np.argmin(ST)
        if t_pos / len(ST) < 0.2 or t_pos / len(ST) > 0.8:
            t_pos = 0.12 * freq_cof
    t_pos = t_pos + s_pos + int(0.08 * freq_cof)
    t_begin = max(s_pos + int(0.08 * freq_cof), t_pos - int(0.12 * freq_cof))
    st_begin = max(s_pos + int(0.035 * freq_cof),
                   t_begin - int(0.06 * freq_cof))
    #t_begin = int(0.035 * freq_cof) + s_pos
    #t_end = int(0.24 * freq_cof) + t_begin
    t_end = min(len(means), int(t_pos + int(0.12 * freq_cof)))

    #t_wave = ST[max(0, t_pos - int(0.08 * freq_cof)):min(len(ST), t_pos + int(0.08 * freq_cof))]
    t_wave = means[t_begin:t_end]
    p_wave = PQ[max(0, p_pos -
                    int(0.06 * freq_cof)):min(len(PQ), p_pos +
                                              int(0.06 * freq_cof))]
    st_wave = means[st_begin:t_begin]
    p_pos = p_pos + r_pos - int(0.2 * freq_cof)
    #r_plus = sum(1 if b[r_pos] > 0 else 0 for b in thb)
    #r_minus = len(thb) - r_plus

    QRS = means[q_pos:s_pos]

    import matplotlib.pyplot as plt
    plt.figure()
    plt.plot(means)
    plt.axvline(p_pos, color='red')
    plt.axvline(q_pos, color='green')
    plt.axvline(r_pos, color='blue')
    plt.axvline(s_pos, color='black')
    plt.axvline(t_pos, color='yellow')
    plt.axvline(t_begin, color='orange')
    plt.axvline(t_end, color='purple')
    plt.axvline(st_begin, color='gray')
    #plt.axvline(t_min_pos, color='greenyellow')
    plt.show()

    a = dict()
    a['PR_interval'] = r_pos - p_pos
    a['P_max'] = means[p_pos]
    a['P_to_R'] = means[p_pos] / means[r_pos]
    a['P_to_Q'] = means[p_pos] - means[q_pos]
    a['ST_interval'] = t_pos
    a['T_max'] = means[t_pos]
    #a['R_plus'] = r_plus / max(1, len(thb))
    #a['R_minus'] = r_minus / max(1, len(thb))
    a['T_to_R'] = means[t_pos] / means[r_pos]
    a['T_to_S'] = means[t_pos] - means[s_pos]
    a['P_to_T'] = means[p_pos] / means[t_pos]
    a['P_skew'] = skew(p_wave)
    a['P_kurt'] = kurtosis(p_wave)
    a['T_skew'] = skew(t_wave)
    a['T_kurt'] = kurtosis(t_wave)
    a['activity'] = calcActivity(means)
    a['mobility'] = calcMobility(means)
    a['complexity'] = calcComplexity(means)
    a['QRS_len'] = s_pos - q_pos

    qrs_min = abs(min(QRS))
    qrs_max = abs(max(QRS))
    qrs_abs = max(qrs_min, qrs_max)
    sign = -1 if qrs_min > qrs_max else 1

    a['QRS_diff'] = sign * abs(qrs_min / qrs_abs)
    a['QS_diff'] = abs(means[s_pos] - means[q_pos])
    a['QRS_kurt'] = kurtosis(QRS)
    a['QRS_skew'] = skew(QRS)
    a['QRS_minmax'] = qrs_max - qrs_min
    #a['P_std'] = np.mean(stds[:q_pos])
    #a['T_std'] = np.mean(stds[s_pos:])

    a['Temp_Median_p_5'] = np.percentile(means, 5)
    a['Temp_Median_p_25'] = np.percentile(means, 25)
    a['Temp_Median_p_75'] = np.percentile(means, 75)
    a['Temp_Median_p_95'] = np.percentile(means, 95)

    return a
def heart_beats_features2(thb, rpeaks):
    if len(thb) == 0:
        thb = np.zeros((1, int(0.6 * loader.FREQUENCY)), dtype=np.int32)
    means = heartbeats.median_heartbeat(thb)
    diff_rpeak = np.median(np.diff(rpeaks))
    freq_cof = loader.FREQUENCY
    if diff_rpeak < 280:
        tmp1 = 100 - int(diff_rpeak / 3)
        tmp2 = 100 + int(2 * diff_rpeak / 3)
        for i in range(len(means)):
            if i < tmp1:
                means[i] = 0
            elif i > tmp2:
                means[i] = 0
        freq_cof = diff_rpeak / 300 * loader.FREQUENCY

    a = dict()
    r_list = []
    p_list = []
    q_list = []
    s_list = []
    t_list = []

    for i in range(np.shape(thb)[0]):
        r_pos = int(0.2 * loader.FREQUENCY)
        template = thb[i, :]
        PQ = template[r_pos - int(0.2 * freq_cof):r_pos - int(0.05 * freq_cof)]
        ST = template[r_pos + int(0.05 * freq_cof):r_pos + int(0.4 * freq_cof)]
        QR = template[r_pos - int(0.07 * freq_cof):r_pos]
        RS = template[r_pos:r_pos + int(0.07 * freq_cof)]

        q_list.append(np.min(QR))
        s_list.append(np.min(RS))

        p_list.append(np.max(PQ))
        t_list.append(np.max(ST))
        r_list.append(template[r_pos])

    a['T_P_max'] = np.max(p_list)
    a['T_P_min'] = np.min(p_list)
    a['T_P_std'] = np.std(p_list)
    a['T_Q_max'] = np.max(q_list)
    a['T_Q_min'] = np.min(q_list)
    a['T_Q_std'] = np.std(q_list)
    a['T_R_max'] = np.max(r_list)
    a['T_R_min'] = np.min(r_list)
    a['T_R_std'] = np.std(r_list)
    a['T_S_max'] = np.max(s_list)
    a['T_S_min'] = np.min(s_list)
    a['T_S_std'] = np.std(s_list)
    a['T_T_max'] = np.max(t_list)
    a['T_T_min'] = np.min(t_list)
    a['T_T_std'] = np.std(t_list)

    stds = np.array([np.std(col) for col in thb.T])

    r_pos = int(0.2 * loader.FREQUENCY)

    PQ = means[r_pos - int(0.2 * freq_cof):r_pos - int(0.05 * freq_cof)]
    #ST = means[int(0.25 * loader.FREQUENCY):]
    ST = means[r_pos + int(0.05 * freq_cof):r_pos + int(0.4 * freq_cof)]
    #QR = means[int(0.13 * loader.FREQUENCY):r_pos]
    QR = means[r_pos - int(0.07 * freq_cof):r_pos]
    RS = means[r_pos:r_pos + int(0.07 * freq_cof)]

    #q_pos = int(0.13 * loader.FREQUENCY) + np.argmin(QR)
    q_pos = r_pos - len(QR) + np.argmin(QR)
    s_pos = r_pos + np.argmin(RS)

    p_pos = np.argmax(PQ)
    t_pos = np.argmax(ST)

    t_wave = ST[max(0, t_pos -
                    int(0.08 * freq_cof)):min(len(ST), t_pos +
                                              int(0.08 * freq_cof))]
    p_wave = PQ[max(0, p_pos -
                    int(0.06 * freq_cof)):min(len(PQ), p_pos +
                                              int(0.06 * freq_cof))]

    #r_plus = sum(1 if b[r_pos] > 0 else 0 for b in thb)
    #r_minus = len(thb) - r_plus

    QRS = means[q_pos:s_pos]

    a['PR_interval'] = r_pos - p_pos
    a['P_max'] = PQ[p_pos]
    a['P_min'] = min(PQ)
    a['P_to_R'] = PQ[p_pos] / means[r_pos]
    a['P_to_Q'] = PQ[p_pos] - means[q_pos]
    a['ST_interval'] = t_pos
    a['T_max'] = ST[t_pos]
    a['T_min'] = min(ST)
    a['T_to_R'] = ST[t_pos] / means[r_pos]
    a['T_to_S'] = ST[t_pos] - means[s_pos]
    a['P_to_T'] = PQ[p_pos] / ST[t_pos]
    a['P_skew'] = skew(p_wave)
    a['P_kurt'] = kurtosis(p_wave)
    a['T_skew'] = skew(t_wave)
    a['T_kurt'] = kurtosis(t_wave)
    a['activity'] = calcActivity(means)
    a['mobility'] = calcMobility(means)
    a['complexity'] = calcComplexity(means)
    a['QRS_len'] = s_pos - q_pos

    qrs_min = abs(min(QRS))
    qrs_max = abs(max(QRS))
    qrs_abs = max(qrs_min, qrs_max)
    sign = -1 if qrs_min > qrs_max else 1

    a['QRS_diff'] = sign * abs(qrs_min / qrs_abs)
    a['QS_diff'] = abs(means[s_pos] - means[q_pos])
    a['QRS_kurt'] = kurtosis(QRS)
    a['QRS_skew'] = skew(QRS)
    a['QRS_minmax'] = qrs_max - qrs_min
    a['P_std'] = np.mean(stds[:q_pos])
    a['T_std'] = np.mean(stds[s_pos:])

    a['T_wave_time'] = len(t_wave) / 500
    a['P_wave_time'] = len(p_wave) / 500

    a['Temp_Median_p_5'] = np.percentile(means, 5)
    a['Temp_Median_p_25'] = np.percentile(means, 25)
    a['Temp_Median_p_75'] = np.percentile(means, 75)
    a['Temp_Median_p_95'] = np.percentile(means, 95)

    a.update(fft_features(means))
    return a