Python:拒绝列表中的异常值(序列)

标签 python algorithm numpy

我正在尝试在 python 中找到一种算法,该算法基于 a) 数据集的趋势(增长/收缩)b) 和基于与其直接邻居的数值距离:x 不超过 > abs(1 % 的 x-1

编辑:如果 python 中有可用的算法,它也可以是三次样条插值。

我见过使用标准偏差的 numpy 算法,但由于我必须考虑列表的序列,因此该算法不适用于这种情况。

0.0937,
0.0934,
0.0933,
0.0931,
0.0933,
0.0936,
0.1091 < == outlier,
0.0938,
0.0945,
0.0949,
0.0956,
0.1082, 
0.1065 < == outlier since -,
0.1123,
0.1198

最佳答案

您可以做的是计算数据的后向和前向梯度,假设步长为 1。您的离群值是那些条件适用的元素:

  • 后向和前向梯度符号不同:趋势变化
  • 后向梯度绝对值大于左邻域绝对值的1%

我对您的陈述的解释是两者都必须为真。

f 为数据的一维 numpy 数组。

f=np.array([
0.0937,
0.0934,
0.0933,
0.0931,
0.0933,
0.0936,
0.1091, #< == outlier,
0.0938,
0.0945,
0.0949,
0.0956,
0.1082, 
0.1065, #< == outlier since -,
0.1123,
0.1198
])
bg = 0.0*f # backward gradient, we want them to have the same size as f
fg = 0.0*f # forward gradient, we want them to have the same size as f
bg[1:] = f[1:]-f[:-1]
fg[:-1] = f[1:]-f[:-1]

outliers = (bg*fg<0) * np.hstack((False, np.where(np.abs(bg[1:])>0.01*np.abs(f[:-1]),True,False) ))
# You don't want to remove an element and the next
outliers[1:] = outliers[1:]*np.where( outliers[:-1], False, True )

print 'Outliers = ', f[outliers]
print 'Good = ', f[np.where( outliers, False, True)]

我用你的数据做了这个例子,只需将 f 替换为任何内容即可。

关于Python:拒绝列表中的异常值(序列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31728704/

相关文章:

python - 导入错误: cannot import name 'app' from 'mypackage' (unknown location)

python - 使用Python中不同大小网格点的数据生成3D曲面图

algorithm - 将一个数字分成三个有约束的桶

c# - C#中字符串集合的排列

algorithm - 您如何确定随机掷骰产生的问题的最佳、最差和平均情况复杂度?

python - 如何在 Python 中更改 Pandas Dataframe 的结构?

python - UTF-8 编码 Pandas DataFrame 到 MySQL

python - 如何用 NumPy 获得累积分布函数?

numpy - 检查一个 numpy 数组是否是一个 numpy 掩码数组

numpy - Pycuda弄乱了numpy矩阵转置