递归剔除传感器数据异常值并重新计算均值的实现问询
递归剔除传感器数据中偏离均值3%的异常值解决方案
针对你需要反复剔除偏离均值3%的传感器数据、直到无异常值剩余的需求,这里提供一个基于循环(替代递归,更易控制终止条件)的实现方案,既满足迭代筛选的逻辑,又能保留原始数据行不被删除:
核心逻辑
对每行数据重复以下步骤,直到没有新的异常值被剔除或剩余有效数据不足2个(此时均值无参考意义无需继续):
- 基于当前有效数据计算均值
- 筛选出与当前均值偏差≤3%的数据作为新的有效数据
- 若新有效数据和上一轮完全一致,终止迭代
代码实现
import pandas as pd # 定义处理单行数据的迭代剔除函数 def iterative_outlier_removal(row, threshold=0.03): # 初始时所有数据都有效,先排除空值(如果存在) valid_values = row.dropna().values if len(valid_values) <= 1: return valid_values.mean() if len(valid_values) > 0 else pd.NA while True: current_mean = valid_values.mean() # 计算每个值与均值的相对偏差 deviations = abs((valid_values - current_mean) / current_mean) # 筛选符合偏差要求的数据 new_valid = valid_values[deviations <= threshold] # 终止条件:无数据被剔除,或剩余有效数据不足2个 if len(new_valid) == len(valid_values) or len(new_valid) <= 1: break valid_values = new_valid return valid_values.mean() # 示例数据(替换为你的实际DataFrame) data = { 'PCU_1': [777.742, 836.361, 727.017, 605.709, 110.978, 711.227, 876.883, 951.960, 611.169, 967.444], 'PCU_2': [718.338, 903.235, 724.114, 659.761, 109.853, 717.215, 907.998, 952.145, 662.214, 982.002], 'PCU_3': [742.445, 879.436, 793.942, 640.930, 106.536, 807.651, 856.678, 997.779, 710.009, 990.523], 'PCU_4': [747.016, 978.934, 775.843, 698.307, 104.108, 768.889, 868.977, 993.696, 872.859, 993.374] } df = pd.DataFrame(data, index=range(50,60)) # 指定传感器列 irrad_cols = ['PCU_1', 'PCU_2', 'PCU_3', 'PCU_4'] # 应用函数计算最终均值 df['Final Mean Irradiance'] = df[irrad_cols].apply(iterative_outlier_removal, axis=1) print(df)
代码说明
iterative_outlier_removal函数:针对单行数据执行迭代筛选逻辑,用循环替代递归(避免递归深度溢出问题),明确终止条件防止无限循环。- 保留原始数据:所有原始传感器列完整保留,仅新增最终均值列,完全符合"不删除整行"的要求。
- 边界处理:自动排除空值,同时在剩余有效数据不足2个时停止迭代,避免无意义计算。
- 兼容现有代码:可以直接替换你现有单次剔除的逻辑,无缝集成到原有数据处理流程中。
内容的提问来源于stack exchange,提问作者Normalitie
相关产品推荐
相关产品推荐

