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 月的月份计数。
过滤异常值的一种非常常见的方法是使用标准差。在这种情况下,我们将计算 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 个标准差。
使用abs并gt识别异常值
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)