You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python基于滚动均值与标准差自动识别并移除异常数据?

滚动均值法移除异常值失效问题排查与修复

问题描述

我想在Python中用滚动均值±2-3倍标准差的方法移除数据集里的异常数据,但自己写的代码没能识别并清除数据录入错误,异常值还留在数据里。

我的代码如下:

def remove_outliers_rolling_dataframe(dataframe, window_size=10, num_std_dev=1):
   
    rolling_avg = dataframe.rolling(window=window_size, min_periods=1).mean()
    std_dev = dataframe.rolling(window=window_size, min_periods=1).std()
    
    lower_bound = rolling_avg - (num_std_dev * std_dev)
    upper_bound = rolling_avg + (num_std_dev * std_dev)
    
    mask = (dataframe >= lower_bound) & (dataframe <= upper_bound)
    
    cleaned_dataframe = dataframe[mask]
    
    return cleaned_dataframe

原始数据中存在明显的录入错误:部分列里出现与相邻值差距极大的数值,严重偏离正常数据范围。

问题原因分析

  1. 标准差倍数设置过小:代码默认num_std_dev=1,但你明确提到应该用2-3倍,1倍的范围太宽,大部分异常值会被误判为正常数据。
  2. 滚动窗口参数不合理:min_periods=1允许窗口数据不足时仍计算均值和标准差,初期的异常值会直接拉偏滚动统计量,导致后续边界计算完全失效。
  3. 逐元素筛选逻辑不符合需求:dataframe[mask]会保留每个元素中符合条件的值,不符合的设为NaN,但如果是整行存在异常值,你大概率需要直接移除整行,而非保留部分列的空值。
  4. 窗口未居中:默认滚动窗口是向前取值(比如窗口10取当前值+前9个值),异常值所在位置的滚动统计量会被自身干扰,用center=True让窗口居中,能更准确地用周围正常数据判断当前值是否异常。

修正后的代码

def remove_outliers_rolling_dataframe(dataframe, window_size=10, num_std_dev=2):
    # 滚动均值和标准差:窗口居中,要求窗口数据全量(避免数据不足时的误判)
    rolling_avg = dataframe.rolling(window=window_size, min_periods=window_size, center=True).mean()
    std_dev = dataframe.rolling(window=window_size, min_periods=window_size, center=True).std()
    
    # 计算上下边界
    lower_bound = rolling_avg - (num_std_dev * std_dev)
    upper_bound = rolling_avg + (num_std_dev * std_dev)
    
    # 生成掩码:所有列都符合条件的行才保留(若需逐列处理可去掉.all(axis=1))
    mask = (dataframe >= lower_bound) & (dataframe <= upper_bound)
    cleaned_dataframe = dataframe[mask.all(axis=1)]
    
    return cleaned_dataframe

额外说明

  • 若你的数据集是时序数据,center=True能让异常值判断更依赖前后正常数据,避免异常值干扰自身的统计边界。
  • min_periods=window_size确保只有窗口数据足够时才计算统计量,若需要处理开头的少量数据,可以单独用静态统计量(比如全局均值±标准差)先做一轮过滤。
  • 若只需针对特定列处理异常值,可以先筛选目标列生成掩码,再应用到整个DataFrame。

内容的提问来源于stack exchange,提问作者spcol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:42:03