def select_ND_NX_dw_12s(
data_one,
ND,
ND_index,
NX,
NX_index,
peaks_lst,
period_points,
peak_need_delete_element,
period_need_delete_element,
baseline_py_lowest,
jishu_num,
):
ND_index_remodify_throughx = []
ND_remodify_throughx = []
ND_index_finall = []
ND_finall = []
period_len_rate_accum_compute = []
x_distance_all_accum_compute = []
# 初始判断周期的函数
if len(peaks_lst) <= 1:
# 确定峰值索引
if len(ND) > 0: # 这里需要加条件 不能简单的根据大小来选取极值点
if len(ND_index) > 1: # 2023-12-18
peak = max(ND) # 2023_12_25 这里的有瑕疵,第一个点就可能选不对
f = ND_index[ND.index(peak)]
# 第一步 通过x距离约束来筛选peak_index, 确保顺序不变
for i_dsts in range(len(ND_index)):
if ND_index[i_dsts] == f:
ND_index_remodify_throughx.append(ND_index[i_dsts])
ND_remodify_throughx.append(ND[i_dsts])
else:
distance_NDx = abs(ND_index[i_dsts] - f)
# f 是最大值的索引
# 根据周期的最大最小个数确定
if (
distance_NDx > 208 or distance_NDx < 24
): # 2024_10_31 这里采集10s,周期数范围为6-26,对应长度为104-24
continue
else:
ND_index_remodify_throughx.append(ND_index[i_dsts])
ND_remodify_throughx.append(ND[i_dsts])
# 第二步 通过y值的一些约束来筛选真正的peak_index
for j_dsts in range(len(ND_index_remodify_throughx)):
# 2023-12-29
if len(NX) != 0:
peak_rate = abs(
(ND_remodify_throughx[j_dsts] - min(NX)) / (peak - min(NX))
)
else:
peak_rate = abs(ND_remodify_throughx[j_dsts] / peak)
if (
peak_rate > 0.30
): # 这里阈值设置较低,为了把所有正确的点选进去 2023-12-29 这里不应该用二者的绝对值,而是该用二者相对极小值的值 第一次筛选值,阈值稍微高点
ND_index_finall.append(ND_index_remodify_throughx[j_dsts])
# writingto_txt('peak_with_max_peak_value_rate_record',peak_rate )
ND_finall.append(ND_remodify_throughx[j_dsts])
else:
continue
(
F,
G,
baseline_py_lowest,
peak_need_delete_element,
period_need_delete_element,
) = get_true_peak_and_period_index_12(
data_one,
ND_index_finall,
ND_finall,
NX_index,
NX,
peaks_lst,
period_points,
)
else:
# 2023-12-23 这里没办法了 只能令F = ND_index[0],没有获取到周期长度
F, F_value, x_delta_py = ND_len_zero_select_F_peak_index_dw(
data_one, ND, ND_index, peaks_lst
)
G, baseline_py_lowest = general_select_NX_index(
NX,
NX_index,
F,
F_value,
peaks_lst,
period_points,
peak_need_delete_element,
period_need_delete_element,
baseline_py_lowest,
x_delta_py,
)
else:
F = "Null"
G = "Null"
else:
# 知道周期的大概长度
period_approximate_len = int(
(peaks_lst[-1] - peaks_lst[0]) / (len(peaks_lst) - 1)
)
#
# 确定峰值索引
if len(ND) > 0: # 这里需要加条件 不能简单的根据大小来选取极值点
if len(ND_index) > 1: # 2023-12-18
peak = max(ND)
f = ND_index[ND.index(peak)]
# 第一步 通过x距离约束来筛选peak_index, 确保顺序不变
for i_dsts in range(len(ND_index)):
if ND_index[i_dsts] == f:
distance_with_last_peak_index = abs(
ND_index[i_dsts] - peaks_lst[-1]
)
if (
distance_with_last_peak_index < 24
or distance_with_last_peak_index > 208
): # 2024_10_31 这里采集10s,周期数范围为6-26,对应长度为104-24
continue
else:
ND_index_remodify_throughx.append(ND_index[i_dsts])
ND_remodify_throughx.append(ND[i_dsts])
else:
distance_NDx = abs(ND_index[i_dsts] - f)
distance_with_last_peak_index = abs(
ND_index[i_dsts] - peaks_lst[-1]
)
if (
distance_NDx > 208
or distance_NDx < 24
or distance_with_last_peak_index < 24
or distance_with_last_peak_index > 208
): # 2024_10_31 这里采集10s,周期数范围为6-26,对应长度为104-24
continue
else:
ND_index_remodify_throughx.append(ND_index[i_dsts])
ND_remodify_throughx.append(ND[i_dsts])
# 第二步 通过y值的一些约束来筛选真正的peak_index
if len(ND_index_remodify_throughx) > 1:
for j_dsts in range(len(ND_remodify_throughx)):
# peak_rate = ND_remodify_throughx[j_dsts] / peak
# 2023-12-29
if len(NX) != 0:
if (peak - min(NX)) != 0:
peak_rate = abs(
(ND_remodify_throughx[j_dsts] - min(NX))
/ (peak - min(NX))
)
else:
peak_rate = abs(ND_remodify_throughx[j_dsts] / peak)
else:
peak_rate = abs(ND_remodify_throughx[j_dsts] / peak)
if peak_rate > 0.4: # 0.6变0.4 2023——12-25
# writingto_txt('peak_with_max_peak_value_rate_record', peak_rate)
ND_index_finall.append(ND_index_remodify_throughx[j_dsts])
ND_finall.append(ND_remodify_throughx[j_dsts])
else:
continue
else:
for j_dsts in range(len(ND_index_remodify_throughx)):
peak_values_lst_dsts = []
for k_imtq in range(len(peaks_lst)):
peak_values_lst_dsts.append(data_one[peaks_lst[k_imtq]])
mean_peak_values = np.mean(peak_values_lst_dsts)
if (
len(NX) != 0 and (mean_peak_values - min(NX)) != 0
): # 2024-6-14 这里要防止=0,但是我没有进一步优化,可能还有其他情况
peak_rate = abs(
(ND_remodify_throughx[j_dsts] - min(NX))
/ (mean_peak_values - min(NX))
)
else:
peak_rate = abs(
ND_remodify_throughx[j_dsts] / mean_peak_values
)
if (
peak_rate > 0.30
): # 这里阈值设置较低,为了把所有正确的点选进去 2023-12-29 这里不应该用二者的绝对值,而是该用二者相对极小值的值 第一次筛选值,阈值稍微高点
ND_index_finall.append(ND_index_remodify_throughx[j_dsts])
# writingto_txt('peak_with_max_peak_value_rate_record', peak_rate)
ND_finall.append(ND_remodify_throughx[j_dsts])
need_whether_num = 0
if len(ND_index_finall) != 0:
for j_dst in range(len(ND_index_finall)):
period_len_compute = ND_index_finall[j_dst] - peaks_lst[-1]
# if peaks_lst[-1] + period_approximate_len + 65< 625: #2024-1-19 后面看看效果
if (
peaks_lst[-1] + period_approximate_len + 25 < 1250
): # 2024-1-19 后面看看效果
period_len_rate = abs(
1 - period_len_compute / period_approximate_len
) # 20241107 增加为10s数据后,这里也是一个修改点,因为周期变短了,导致分母变小,变化量占比变大,所以这里要修改变小,周期得分,离周期长度最近的得分最高
else:
period_len_rate = 0.05
# if period_len_rate < 0.27:
if (
period_len_rate < 0.04
): # 20241107 增加为10s数据后,这里也是一个修改点,因为周期变短了,导致分母变小,变化量占比变大,所以这里要修改变小
need_whether_num += 1
x_distance_khjq = abs(
period_len_compute - period_approximate_len
)
# 这里不能仅凭x距离判断出点,还得综合y值来看
# if ND_index_finall[j_dst] < (peaks_lst[-1] + 50):#
if ND_index_finall[j_dst] < (
peaks_lst[-1] + 0.8 * period_approximate_len
): # 20241107 增加为10s数据后,这里也是一个修改点,加50显然不正确,这里最好加一个可以变化的量
x_distance_khjq = 999
x_distance_all_accum_compute.append(x_distance_khjq)
period_len_rate_accum_compute.append(period_len_rate)
# if min(period_len_rate_accum_compute) < 0.27: # 2023-12-29 # 2024-1-3 这里,由于第一个周期点没选对,导致周期长度错误,进一步导致正确周期点计算得分不在02范围之内,无法纠正周期
if (
min(period_len_rate_accum_compute) < 0.04
): # #20241107 增加为10s数据后,这里也是一个修改点,因为周期变短了,导致分母变小,变化量占比变大,所以这里要修改变小
if need_whether_num > 1:
F, F_value, G, x_delta_py, baseline_py_lowest = (
get_correct_peak_index(
data_one,
ND_index_finall,
NX_index,
ND_finall,
NX,
x_distance_all_accum_compute,
peaks_lst,
period_points,
period_approximate_len,
)
)
else:
# baseline_py_peak =0.5* abs(data_one[peaks_lst[-1]] - data_one[peaks_lst[-2]]) + 0.5*() #这里并不能有效处理基线漂移
index_num_peak = period_len_rate_accum_compute.index(
min(period_len_rate_accum_compute)
)
x_delta_py = (
0.8 * x_distance_all_accum_compute[index_num_peak]
)
F_first_jgba = ND_index_finall[index_num_peak]
F_value_first_jgba = ND_finall[index_num_peak]
baseline_py_peak = 0.4 * abs(
data_one[peaks_lst[-1]] - data_one[peaks_lst[-2]]
) + 0.6 * abs(F_value_first_jgba - data_one[peaks_lst[-1]])
# writingto_txt('峰值距离波动', period_len_rate_accum_compute[index_num_peak])
difference_period_with_ND = (
F_value_first_jgba - data_one[period_points[-1]]
)
peak_value_jgjz = (
data_one[peaks_lst[-1]] - data_one[period_points[-1]]
)
if F_value_first_jgba > data_one[peaks_lst[-1]]:
peak_value_jgjz += baseline_py_peak
else:
# if difference_period_with_ND !=0:
# chaju_big = (peak_value_jgjz - difference_period_with_ND)/ difference_period_with_ND
# if chaju_big >1.2:
# difference_period_with_ND += 0
#
# else:
# difference_period_with_ND += baseline_py_peak
#
# else:
difference_period_with_ND += baseline_py_peak
if peak_value_jgjz != 0:
minus_period_jgnq = abs(
1 - difference_period_with_ND / peak_value_jgjz
)
if minus_period_jgnq > 1:
minus_period_jgnq = 0.4
else:
minus_period_jgnq = 0.4
if (
minus_period_jgnq > 0.40
): # 2023-12-27 触发周期保护机制,利用周期长度的稳定性来确保周期是否正确
# writingto_txt('相对峰值占比', minus_period_jgnq)
# F, F_value, peak_need_delete_element, period_need_delete_element = pan_duan_zhou_qi_zhengque(data_one, ND_index_finall, ND_finall, peaks_lst, period_points)
(
F,
G,
peak_need_delete_element,
period_need_delete_element,
jishu_num,
) = jiuzheng_zhouqi_1(
data_one,
ND_index_finall,
ND_finall,
NX_index,
NX,
peaks_lst,
period_points,
)
else:
# F, F_value,_ = ND_len_zero_select_F_peak_index_dw(data_one, ND_finall,ND_index_finall,peaks_lst)
# 这里得对ND_index_finall 进行筛选,直接传的不一定合格
F, F_value = F_first_jgba, F_value_first_jgba
G, baseline_py_lowest = general_select_NX_index(
NX,
NX_index,
F,
F_value,
peaks_lst,
period_points,
peak_need_delete_element,
period_need_delete_element,
baseline_py_lowest,
x_delta_py,
)
# writingto_txt('相对峰值占比', minus_period_jgnq)
# elif min(x_distance_all_accum_compute) < 37 and peaks_lst[-1] + period_approximate_len + int(0.14*period_approximate_len)< 625: # 2024-1-8 为了提升正确率 允许有40距离的周期突变 #2024-1-13 这里设置过大容易把最后一些不是峰值的极大值概括进去
elif (
min(x_distance_all_accum_compute) < 0.6 * period_approximate_len
and peaks_lst[-1]
+ period_approximate_len
+ int(0.14 * period_approximate_len)
< 1250
): # #20241107 增加为10s数据后,这里也是一个修改点,这个0.14不知道修不修改
index_num_peak_ohhh = x_distance_all_accum_compute.index(
min(x_distance_all_accum_compute)
)
F_first_jgba = ND_index_finall[index_num_peak_ohhh]
F_value_first_jgba = ND_finall[index_num_peak_ohhh]
F, F_value = F_first_jgba, F_value_first_jgba
x_delta_py = (
0.8 * x_distance_all_accum_compute[index_num_peak_ohhh]
)
G, baseline_py_lowest = general_select_NX_index(
NX,
NX_index,
F,
F_value,
peaks_lst,
period_points,
peak_need_delete_element,
period_need_delete_element,
baseline_py_lowest,
x_delta_py,
)
else:
if peaks_lst[-1] + period_approximate_len + 25 < 1250:
(
F,
G,
peak_need_delete_element,
period_need_delete_element,
jishu_num,
) = jiuzheng_zhouqi_1(
data_one,
ND_index_finall,
ND_finall,
NX_index,
NX,
peaks_lst,
period_points,
)
else:
F = "Null"
if len(NX_index) != 0:
last_period_len_rate_accum_compute = []
period_penult_index = period_points[-1]
for m_dsts_last_period in range(len(NX_index)):
last_period_length = (
NX_index[m_dsts_last_period]
- period_penult_index
)
last_period_len_rate = abs(
1 - last_period_length / period_approximate_len
)
last_period_len_rate_accum_compute.append(
last_period_len_rate
)
if min(last_period_len_rate_accum_compute) < 0.2:
last_period_index = (
last_period_len_rate_accum_compute.index(
min(last_period_len_rate_accum_compute)
)
)
G = NX_index[last_period_index]
min_num_jhbf = NX.index(min(NX))
G_nnbj = NX_index[min_num_jhbf]
if G != G_nnbj: # 2024-1-19 zheli 有问题
if (
peaks_lst[-1] + period_approximate_len + 25
< 1250
):
G = G_nnbj
else:
distance_period_less_htbq = (
period_approximate_len
- (
NX_index[last_period_index]
- period_penult_index
)
)
if (
NX_index[last_period_index] > 1235
and distance_period_less_htbq > 8
):
G = "Null"
else:
G = G
else: # 2024-1-21 例子4787
# 2024_1_22 例子 3795
penult_period_distance_dnbq = (
period_penult_index - period_points[-2]
)
distance_period_less_htbq = (
penult_period_distance_dnbq
- (
NX_index[last_period_index]
- period_penult_index
)
)
if (
NX_index[last_period_index] > 1235
and distance_period_less_htbq > 11
):
G = "Null"
else:
G = G
else:
G = "Null"
else:
G = "Null"
else:
F = "Null"
if len(NX_index) != 0:
last_period_len_rate_accum_compute = []
period_penult_index = period_points[-1]
for m_dsts_last_period in range(len(NX_index)):
last_period_length = (
NX_index[m_dsts_last_period] - period_penult_index
)
last_period_len_rate = abs(
1 - last_period_length / period_approximate_len
)
last_period_len_rate_accum_compute.append(
last_period_len_rate
)
if min(last_period_len_rate_accum_compute) < 0.2:
last_period_index = (
last_period_len_rate_accum_compute.index(
min(last_period_len_rate_accum_compute)
)
)
last_distance_period_hjqn = period_approximate_len - (
NX_index[last_period_index] - period_penult_index
)
if last_distance_period_hjqn < 8:
G = NX_index[last_period_index]
else:
G = "Null"
else:
G = 1249
F = 1249 # 等于624的原因是 峰值后的极小值不是周期点,所以赋值624
else:
F = 1249
G = 1249
else:
# 2023-12-23 这里有问题 仅通过选第一个会导致峰值选错,应该结合前面选的峰值
# 2024_8_18 这个周期正确率要高一些,改代码得多跑数据多看看了,不然不如不改
peak = max(ND)
f = ND_index[ND.index(peak)]
# 第一步 通过x距离约束来筛选peak_index, 确保顺序不变
for i_dsts in range(len(ND_index)):
if ND_index[i_dsts] == f:
distance_with_last_peak_index = abs(
ND_index[i_dsts] - peaks_lst[-1]
)
if (
distance_with_last_peak_index < 24
or distance_with_last_peak_index > 208
): # 2024_10_31 这里采集10s,周期数范围为6-26,对应长度为104-24
continue
else:
ND_index_remodify_throughx.append(ND_index[i_dsts])
ND_remodify_throughx.append(ND[i_dsts])
else:
distance_NDx = abs(ND_index[i_dsts] - f)
distance_with_last_peak_index = abs(
ND_index[i_dsts] - peaks_lst[-1]
)
if (
distance_NDx > 208
or distance_NDx < 24
or distance_with_last_peak_index < 24
or distance_with_last_peak_index > 208
): # 2024_10_31 这里采集10s,周期数范围为6-26,对应长度为104-24
continue
else:
ND_index_remodify_throughx.append(ND_index[i_dsts])
ND_remodify_throughx.append(ND[i_dsts])
# 第二步 通过y值的一些约束来筛选真正的peak_index
for j_dsts in range(len(ND_remodify_throughx)):
# peak_rate = ND_remodify_throughx[j_dsts] / peak
# 2023-12-29
if len(NX) != 0:
if (peak - min(NX)) != 0:
peak_rate = abs(
(ND_remodify_throughx[j_dsts] - min(NX))
/ (peak - min(NX))
)
else:
peak_rate = abs(ND_remodify_throughx[j_dsts] / peak)
else:
peak_rate = abs(ND_remodify_throughx[j_dsts] / peak)
if peak_rate > 0.4: # 0.6变0.4 2023——12-25
# writingto_txt('peak_with_max_peak_value_rate_record', peak_rate)
ND_index_finall.append(ND_index_remodify_throughx[j_dsts])
ND_finall.append(ND_remodify_throughx[j_dsts])
else:
continue
if len(ND_index_finall) != 0:
F, F_value, x_delta_py = ND_len_zero_select_F_peak_index_dw(
data_one, ND_finall, ND_index_finall, peaks_lst
)
else:
F, F_value, x_delta_py = "Null", None, 0
G, baseline_py_lowest = general_select_NX_index(
NX,
NX_index,
F,
F_value,
peaks_lst,
period_points,
peak_need_delete_element,
period_need_delete_element,
baseline_py_lowest,
x_delta_py,
)
# 2024_7_9 这里对ND进行筛选,之后再进行下一步
# f = peaks_lst[-1]
# peak = data_one[f]
#
# # 第一步 通过x距离约束来筛选peak_index, 确保顺序不变
# for i_dsts in range(len(ND_index)):
# distance_with_last_peak_index = abs(ND_index[i_dsts] - peaks_lst[-1])
# min_len = int(0.5 * period_approximate_len)
# if distance_with_last_peak_index < min_len or distance_with_last_peak_index > 208:
# continue
# else:
# ND_index_remodify_throughx.append(ND_index[i_dsts])
# ND_remodify_throughx.append(ND[i_dsts])
#
# # 第二步 通过y值的一些约束来筛选真正的peak_index
#
# for j_dsts in range(len(ND_remodify_throughx)):
# # peak_rate = ND_remodify_throughx[j_dsts] / peak
# # 2023-12-29
# if len(NX) != 0:
#
# if (peak - min(NX)) != 0:
# peak_rate = abs((ND_remodify_throughx[j_dsts] - min(NX)) / (peak - min(NX)))
#
# else:
# peak_rate = abs(ND_remodify_throughx[j_dsts] / peak)
#
# else:
# peak_rate = abs(ND_remodify_throughx[j_dsts] / peak)
# if peak_rate > 0.4: # 0.6变0.4 2023——12-25
# # writingto_txt('peak_with_max_peak_value_rate_record', peak_rate)
# ND_index_finall.append(ND_index_remodify_throughx[j_dsts])
# ND_finall.append(ND_remodify_throughx[j_dsts])
# else:
# continue
#
# if len(ND_index_finall) != 0:
# F, F_value, x_delta_py = ND_len_zero_select_F_peak_index_dw(data_one, ND_finall, ND_index_finall,
# peaks_lst)
#
# else:
# F, F_value, x_delta_py = 'Null', None, 0
#
# G, baseline_py_lowest = general_select_NX_index(NX, NX_index, F, F_value, peaks_lst, period_points,
# peak_need_delete_element, period_need_delete_element,
# baseline_py_lowest, x_delta_py)
else:
F = "Null"
if len(NX_index) != 0:
last_period_len_rate_accum_compute = []
period_penult_index = period_points[-1]
for m_dsts_last_period in range(len(NX_index)):
last_period_length = (
NX_index[m_dsts_last_period] - period_penult_index
)
last_period_len_rate = abs(
1 - last_period_length / period_approximate_len
)
last_period_len_rate_accum_compute.append(last_period_len_rate)
if min(last_period_len_rate_accum_compute) < 0.2:
last_period_index = last_period_len_rate_accum_compute.index(
min(last_period_len_rate_accum_compute)
)
G = NX_index[last_period_index]
else:
G = 1249
F = 1249 # 等于624的原因是 峰值后的极小值不是周期点,所以赋值624
else:
F = 1249
G = 1249
return (
F,
G,
peak_need_delete_element,
period_need_delete_element,
baseline_py_lowest,
jishu_num,
)
将以上代码转为 c#实现,