如何使用相邻数据点清洗Pandas时间序列数据中的尖峰异常值
代码问题排查
- 核心逻辑颠倒:你的需求是判断当前数据点是否超出后一个数据点的±value区间,但现有代码是拿当前行的值计算上下限,去判断下一行的值是否超限,最后却修改了当前行的值,完全匹配不到真正的异常尖峰,所以运行后结果无变化。
- 索引匹配错误:
iterrows返回的index是DataFrame的行标签,并非行位置序号,如果你使用的不是默认从0开始的连续整数索引(比如时间索引),用index作为iloc的入参会完全取错行。 - 边界逻辑漏洞:循环没有排除第一行,当
index=0时iloc[index-1]会取到DataFrame最后一行的值,引发逻辑错误。
高效尖峰异常值替换方案
直接使用Pandas向量化操作实现需求,无需循环,性能远高于iterrows,尤其适合大规模时间序列数据:
import pandas as pd value = 5000 target_col = "Admissions to Date" # 生成前后行的偏移序列 prev = gauteng_df[target_col].shift(1) next_ = gauteng_df[target_col].shift(-1) # 构造异常值掩码:当前值超出后一个值±value范围,且排除无前后值的首尾行 outlier_mask = (gauteng_df[target_col] > next_ + value) | (gauteng_df[target_col] < next_ - value) outlier_mask.iloc[[0, -1]] = False # 异常值替换为前后行平均值 gauteng_df.loc[outlier_mask, target_col] = (prev[outlier_mask] + next_[outlier_mask]) / 2
内容的提问来源于stack exchange,提问作者hengjuice
相关产品推荐
相关产品推荐

