如何查找低于(或高于)平均值的值

sha*_*nuo 6 python dataframe pandas

正如您从以下摘要中看到的,9 月 1 日的计数 (1542677) 远低于每月的平均计数。

from StringIO import StringIO

myst="""01/01/2016  8781262
01/02/2016  8958598
01/03/2016  8787628
01/04/2016  9770861
01/05/2016  8409410
01/06/2016  8924784
01/07/2016  8597500
01/08/2016  6436862
01/09/2016  1542677
"""
u_cols=['month', 'count']

myf = StringIO(myst)
import pandas as pd
df = pd.read_csv(StringIO(myst), sep='\t', names = u_cols)
Run Code Online (Sandbox Code Playgroud)

是否有一个数学公式可以定义这个“远低于或太高”(模棱两可)的概念?

如果我定义一个限制(例如 9 或 10%),这很容易。但我希望脚本为我做出决定,并在最低值和倒数第二低值之间的差异超过总体 5% 时返回值。在这种情况下,应返回 9 月的月份计数。

piR*_*red 5

过滤异常值的一种非常常见的方法是使用标准差。在这种情况下,我们将计算 a zscore,它将快速确定每个观察值与平均值的标准差有多少。然后我们可以过滤掉那些大于 2 个标准差的观测值。对于正态分布的随机变量,这种情况发生的概率约为 5%。

定义 zscore 函数

def zscore(s):
    return (s - np.mean(s)) / np.std(s)
Run Code Online (Sandbox Code Playgroud)

将其应用到count列中

zscore(df['count'])

0    0.414005
1    0.488906
2    0.416694
3    0.831981
4    0.256946
5    0.474624
6    0.336390
7   -0.576197
8   -2.643349
Name: count, dtype: float64
Run Code Online (Sandbox Code Playgroud)

请注意,9 月份的观测值相差 2.6 个标准差。

使用absgt识别异常值

zscore(df['count']).abs().gt(2)

0    False
1    False
2    False
3    False
4    False
5    False
6    False
7    False
8     True
Name: count, dtype: bool
Run Code Online (Sandbox Code Playgroud)

九月又来了。

将它们结合在一起以过滤原始数据框

df[zscore(df['count']).abs().gt(2)]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

以另一种方式过滤

df[zscore(df['count']).abs().le(2)]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述