PTB-XL处理程序

ECG处理程序


#data_process = (X_train[5,:,11] - np.roll(data_process,10))/10 #差分
#print(data_process)
import matplotlib.pyplot as plt
from scipy.signal import medfilt
def Slope_condition(data_process, location, Scope, Threshold):
    for i in range(Scope,0,-1):# 逐渐缩小范围找斜率满足要求的点
        if location-i>=0 and location+i<=999 :
            Slope_left = (data_process[location]-data_process[location-i])*100 # 100Hz, 计算左斜率
            Slope_right = (data_process[location+i]-data_process[location])*100  # 100Hz, 计算右斜率
            if Slope_left*Slope_right<(Threshold/(Scope-i+1)):
                return 1
            else :
                continue
    return 0 #这样都找不到,那就没有
    
def R_location(data_process, P_N, threshold, baseline):
    Xlim = []
    Ylim = []
    # print(data_process.shape)
    if P_N == "+":
        candidate = np.where((data_process-baseline)>=threshold)
    if P_N == "-":
        candidate = np.where((data_process-baseline)<=threshold)
    candidate = candidate[0]
    # print(candidate)
    # print(len(candidate))
    if len(candidate)==0:
        return Xlim, Ylim
    Data_max = data_process[candidate[0]]
    #print(Data_max)
    max_index = candidate[0]
    #print(max_index)
    for i in candidate:
        # print(i)
        if max_index != i-1 and max_index != i :  # 有间断再输出,并且进行下一段比较
            S_C = Slope_condition(data_process, max_index, 5, -500) #斜率状态
            if len(Xlim)==0:
                if S_C :
                    Xlim.append(max_index)
                    Ylim.append(Data_max)
            else :
                if S_C and max_index-Xlim[-1]>40: # 一般心率不会超过250/min
                    Xlim.append(max_index)
                    Ylim.append(Data_max)
            # print(Data_max, max_index)
            max_index = i
            Data_max = data_process[i]
        else :
            if Data_max < data_process[i] and P_N == "+" :  # 比较
                Data_max = data_process[i]
                max_index = i
            if Data_max > data_process[i] and P_N == "-" :  # 比较
                Data_max = data_process[i]
                max_index = i
        #print(data_process[i])
        #print(i)
    if len(Xlim)==0:
        return Xlim, Ylim
    if max_index != 999 and max_index-Xlim[-1]>40 and Slope_condition(data_process, max_index, 5, -500):
        Xlim.append(max_index)
        Ylim.append(Data_max)
    return Xlim, Ylim

def R_location_supplement(data_process,  P_N, Xlim_S, Scope):
    Xlim = []
    Ylim = []
    for i in Xlim_S:
        Data_max = data_process[i-Scope]
        max_index = i-Scope
        for j in range(i-Scope+1, i+Scope):
            if j>=1000 :
                break
            if j<=0 :
                continue
            if Data_max < data_process[j] and P_N == "+" : # 在一个范围内找最大值 
                Data_max = data_process[j]
                max_index = j
            if Data_max > data_process[j] and P_N == "-" :
                Data_max = data_process[j]
                max_index = j
        Xlim.append(max_index)
        Ylim.append(Data_max)
        #Xlim.append(i)
        #Ylim.append(data_process[i])
    return Xlim, Ylim

def R_location_Sup(data_person, threshold, high):
    for i in [11,10,9,5,2,1,0]:
        data_process = data_person[:, i]
        Baseline = medfilt(data_person[:, i],51)
        Xlim, Ylim = R_location(data_process, P_N="+", threshold = high, baseline = Baseline)
        if len(Xlim) >= threshold : #默认心跳频率高于48次/min
            break
    if len(Xlim) < threshold :
        Xlim, Ylim = R_location_Sup(data_person=data_person, threshold=threshold, high = high/2)
    return Xlim, Ylim

def Q_location(data_process,location, Scope):
    Q_min = data_process[location]
    Q_l = location
    for i in range(location, location-Scope, -1):
        if i>=0 :
            if data_process[i] < Q_min :  #向左在一定范围内找最小(判定条件)
                Q_min = data_process[i]
                Q_l = i
        else :
            break
    return Q_l, Q_min

def S_location(data_process,location, Scope):
    S_min = data_process[location]
    S_l = location
    for i in range(location, location+Scope, 1):
        if i<=999 :
            if data_process[i] < S_min :  #向右在一定范围内找最小(判定条件)
                S_min = data_process[i]
                S_l = i
        else :
            break
    return S_l, S_min

def Q_S_location(data_process, Xlim_S, Scope):
    Q_Xlim = []
    Q_Ylim = []
    S_Xlim = []
    S_Ylim = []
    for i in Xlim_S:
        Q_X,Q_Y = Q_location(data_process, i, Scope)
        S_X,S_Y = S_location(data_process, i, Scope)
        Q_Xlim.append(Q_X)
        Q_Ylim.append(Q_Y)
        S_Xlim.append(S_X)
        S_Ylim.append(S_Y)
    return Q_Xlim, Q_Ylim, S_Xlim, S_Ylim

def base_leave(data_process, location, Scope, PT, baseline):
    T_max = abs(data_process[location]-baseline[location])
    T_l = location
    if PT == 'P':
        range_start = location
        range_end = location+Scope
    if PT == 'T':
        range_start = location-Scope
        range_end = location
    # print(distance)
    for i in range(range_start, range_end):
        if i>=1000 :
            break
        if i<0 :
            continue
        if abs(data_process[i]-baseline[i]) > T_max :  #  找到离基线最远的点
            T_max = abs(data_process[i]-baseline[i])
            T_l = i
    #if Slope_condition(data_process, T_l, 1, -0) == 0 and (range_end-range_start) > 4:
        #T_l, data_process[T_l] = base_leave(data_process=data_process, location=location, Scope = Scope, PT=PT, baseline=baseline, distance = distance+1)
        
    return T_l, data_process[T_l]

def mm_where(data_process, range_start, range_end, P_N = 'max'):
    T_MM = data_process[range_start]
    T_l = range_start
    if P_N == 'max':
        for i in range(range_start, range_end):
            if i>=1000 :
                break
            if i<0 :
                continue
            if data_process[i] > T_MM :
                T_MM = data_process[i]
                T_l = i
    if P_N == 'min':
        for i in range(range_start, range_end):
            if i>=1000 :
                break
            if i<0 :
                continue
            if data_process[i] < T_MM :
                T_MM = data_process[i]
                T_l = i
    return T_l, T_MM

def PT_location_supplement(data_process, T_Xlim, Scope, PT, baseline):
    Xlim = []
    Ylim = []
    count = 0
    for i in T_Xlim:
        count = count+1
        T_l, T_MM = base_leave(data_process, i, int(Scope[count-1]), PT = PT, baseline = baseline)  # 以在一定范围内离基线最远为判定条件
        Xlim.append(T_l)
        Ylim.append(T_MM)
    return Xlim, Ylim

def Space(Xlim):
    # 循环左移
    Xlim_start = np.delete(Xlim, len(Xlim)-1)
    Xlim_end = np.roll(Xlim, -1)
    Xlim_end = np.delete(Xlim_end, len(Xlim_end)-1)
    space = Xlim_end-Xlim_start
    space = np.r_[Xlim[0], space, 1000-Xlim[-1]]
    space.astype(int)
    return space

def Space_P(Q_Xlim, TFR_Xlim):
    Xlim_start = np.r_[0, TFR_Xlim]
    Xlim_end = np.r_[Q_Xlim, 999]
    space = Xlim_start - Xlim_end
    space.astype(int)
    return space

def foot_find(data_process, location, Scope, direction, Baseline):
    if direction == 'right':
        S = location
        E = location+Scope
        D = 1
    if direction == 'left':
        S = location
        E = location-Scope
        D = -1
    for i in range(S,E,D):
        if (i+1)>=999:
            break
        if i<0 :
            continue
        high_R = data_process[i+1]-Baseline[i+1]
        high = data_process[i]-Baseline[i]
        if (high*high_R)<0:
            if(abs(high)<abs(high_R)):
                return i, data_process[i]
            if(abs(high)>abs(high_R)):
                return i+1, data_process[i+1]
    return i, data_process[i]

def TF_location(data_process, Xlim, Scope, direction, Baseline):
    TFXlim = []
    TFYlim = []
    for i in Xlim:
        TFX, TFY = foot_find(data_process=data_process, location=i, Scope=Scope, direction=direction, Baseline=Baseline)
        TFXlim.append(TFX)
        TFYlim.append(TFY)
    return TFXlim, TFYlim

def PT_location(data_process, Xlim_S, Scope, PT, baseline):
    space = Space(Xlim_S)
    #print(space)
    space.astype(int)
    if PT == 'P':
        space = np.delete(space, len(space)-1) #需要左边的间距
        middle = Xlim_S - space//2  # 获得左边中间位置
    if PT == 'T':
        space = np.delete(space, 0)  #需要右边的间距
        middle = Xlim_S + space//2  # 获得右边中间位置
    middle[middle > 999] = 999  # 去掉索引超出范围的点
    middle[middle < 0] = 0
    middle = middle.astype(int)
    #print(middle,"middle")
    #print(Scope)
    PT_Xlim, PT_Ylim = PT_location_supplement(data_process, middle, Scope=space//2-Scope, PT = PT, baseline = baseline)
    return PT_Xlim, PT_Ylim

def P_location(data_process, Q_Xlim, TFR_Xlim, Scope, Baseline):
    P_Xlim = []
    P_Ylim = []
    space = Space_P(Q_Xlim, TFR_Xlim)-Scope
    for i in range(len(TFR_Xlim)):
        P_X, P_Y = base_leave(data_process=data_process, location=TFR_Xlim[i], Scope=space[i], PT='P', baseline=Baseline)
        P_Xlim.append(P_X)
        P_Ylim.append(P_Y)
    return P_Xlim, P_Ylim
count = 0
for k in range(0,1):
    count = count+1
    if y_train.values[k] ==['NORM']:
        print(y_train.values[k],k)


    """
    data_person = X_train[k, :, :]
    # data_process = data_person[:, 0]
    Xlim, Ylim = R_location_Sup(data_person, threshold=8, high=0.05)
    # print(Xlim)
    #T_Xlim, T_Ylim = T_location(data_person[:, index], Xlim, 3)
    for i in range(1, 12):
        if i in [9, 10, 11]:
            Xlim_S, Ylim_S = R_location_supplement(data_person[:, i], P_N="+", Xlim_S=Xlim, Scope=10)
        else:
            Xlim_S, Ylim_S = R_location_supplement(data_person[:, i], P_N="+", Xlim_S=Xlim, Scope=5)
        # print(Xlim_S)
        Q_Xlim, Q_Ylim, S_Xlim, S_Ylim = Q_S_location(data_person[:, i], Xlim_S, Scope=10)
        Baseline = medfilt(data_person[:, i], 11)
        T_Xlim, T_Ylim = PT_location(data_person[:, i], S_Xlim, 5, 'T', Baseline)
        TFR_Xlim, TFR_Ylim = TF_location(data_person[:, i], T_Xlim, 50, 'right', Baseline)
        TFL_Xlim, TFL_Ylim = TF_location(data_person[:, i], T_Xlim, 50, 'left', Baseline)
        P_Xlim, P_Ylim = PT_location(data_person[:, i], Q_Xlim, 5, 'P', Baseline)
        # print(type(y_train))
        # print(y_train.index)
        
        plt.figure(figsize=(15, 24))
        plt.subplot(12, 1, i+1)
        plt.plot(P_Xlim, P_Ylim, 'ko')
        plt.plot(T_Xlim, T_Ylim, 'bo')
        plt.plot(Q_Xlim, Q_Ylim, 'go')
        plt.plot(S_Xlim, S_Ylim, 'yo')
        plt.plot(Xlim_S, Ylim_S, 'ro')
        plt.plot(data_person[:, i])
        plt.plot(Baseline)
        plt.grid()
        plt.show()
    """
print(count)
# plt.savefig("1.jpg")
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值