python - 加快对 pandas 系列的异常值检查

标签 python pandas outliers

我正在使用不同的标准偏差标准对 pandas Series 对象运行两次异常值检查。但是,我为此使用了两个循环,并且运行速度非常慢。我想知道是否有任何 Pandas “技巧”可以加快这一步。

这是我正在使用的代码(警告真的丑陋的代码!):

def find_outlier(point, window, n):
    return np.abs(point - nanmean(window)) >= n * nanstd(window)

def despike(self, std1=2, std2=20, block=100, keep=0):
    res = self.values.copy()
    # First run with std1:
    for k, point in enumerate(res):
        if k <= block:
            window = res[k:k + block]
        elif k >= len(res) - block:
            window = res[k - block:k]
        else:
            window = res[k - block:k + block]
        window = window[~np.isnan(window)]
        if np.abs(point - window.mean()) >= std1 * window.std():
            res[k] = np.NaN
    # Second run with std2:
    for k, point in enumerate(res):
        if k <= block:
            window = res[k:k + block]
        elif k >= len(res) - block:
            window = res[k - block:k]
        else:
            window = res[k - block:k + block]
        window = window[~np.isnan(window)]
        if np.abs(point - window.mean()) >= std2 * window.std():
            res[k] = np.NaN
    return Series(res, index=self.index, name=self.name)

最佳答案

我不确定你在用那 block block 做什么,但在一个系列中找到异常值应该很容易:

In [1]: s > s.std() * 3

其中 s 是您的系列,3 是离群状态要超过多少标准差。该表达式将返回一系列 bool 值,然后您可以通过以下方式对该系列进行索引:

In [2]: s.head(10)
Out[2]:
0    1.181462
1   -0.112049
2    0.864603
3   -0.220569
4    1.985747
5    4.000000
6   -0.632631
7   -0.397940
8    0.881585
9    0.484691
Name: val

In [3]: s[s > s.std() * 3]
Out[3]:
5    4
Name: val

更新:

解决关于 block 的评论。我认为您可以在这种情况下使用 pd.rolling_std():

In [53]: pd.rolling_std(s, window=5).head(10)
Out[53]:
0         NaN
1         NaN
2         NaN
3         NaN
4    0.871541
5    0.925348
6    0.920313
7    0.370928
8    0.467932
9    0.391485

In [55]: abs(s) > pd.rolling_std(s, window=5) * 3

Docstring:
Unbiased moving standard deviation

Parameters
----------
arg : Series, DataFrame
window : Number of observations used for calculating statistic
min_periods : int
    Minimum number of observations in window required to have a value
freq : None or string alias / date offset object, default=None
    Frequency to conform to before computing statistic
    time_rule is a legacy alias for freq

Returns
-------
y : type of input argument

关于python - 加快对 pandas 系列的异常值检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15070279/

相关文章:

python - cx_Oracle.NotSupportedError : Python value of type NAType not supported

python - Normal equation 和 Numpy 'least-squares' , 'solve' 回归方法的区别?

python - 如何管理跨多个数据集的查找

python - 将每对列彼此分开

python - 存储前一行中两列 pandas 的差异

python - 如何在 if 语句中使用列中的前 N ​​个值

Python:将 setup.py "scripts="迁移到 entry_points

python - 比较两个列表并提取元素

r - 如何在R代码中使用离群值测试

python - 从 DataFrame 中过滤异常值