如何删除每个时间戳特定的离群值?

时间:2020-06-17 08:00:02

标签: python machine-learning statistics time-series outliers

我具有下面的数据帧,这是一个时序数据,我处理此信息以输入到我的预测模型中。

df = pd.DataFrame({"timestamp": [pd.Timestamp('2019-01-01 01:00:00', tz=None),
                               pd.Timestamp('2019-01-01 01:00:00', tz=None),
                               pd.Timestamp('2019-01-01 01:00:00', tz=None),
                               pd.Timestamp('2019-01-01 02:00:00', tz=None),
                               pd.Timestamp('2019-01-01 02:00:00', tz=None),
                               pd.Timestamp('2019-01-01 02:00:00', tz=None),
                               pd.Timestamp('2019-01-01 03:00:00', tz=None),
                               pd.Timestamp('2019-01-01 03:00:00', tz=None),
                               pd.Timestamp('2019-01-01 03:00:00', tz=None)],
                   "value":[5.4,5.1,100.8,20.12,21.5,80.08,150.09,160.12,20.06]

                  })

由此,我取每个时间戳记的值的平均值,并将该值作为输入发送到预测变量。但是目前,我仅使用阈值来过滤离群值,但是这些阈值似乎会过滤掉真实值,也未过滤一些离群值。

例如,我保留了

df[(df['value']>3 )& (df['value']<120 )]

然后这不会过滤掉

2019-01-01 01:00:00 100.8

这是该时间戳的离群值,并且会过滤掉

2019-01-01 03:00:00 150.09
2019-01-01 03:00:00 160.12

在该时间戳记中不是异常值。

那么我如何根据哪个时间戳不适合该组来过滤每个时间戳的异常值?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

好的,假设您正在搜索置信区间以检测异常值。

然后,您必须获取每个时间戳组的均值和置信区间。因此,您可以run

stats = df.groupby(['timestamp'])['value'].agg(['mean', 'count', 'std'])
ci95_hi = []
ci95_lo = []
import math
for i in stats.index:
    m, c, s = stats.loc[i]
    ci95_hi.append(m + 1.96*s/math.sqrt(c))
    ci95_lo.append(m - 1.96*s/math.sqrt(c))

stats['ci95_hi'] = ci95_hi
stats['ci95_lo'] = ci95_lo
df = pd.merge(df, stats, how='left', on='timestamp')

会导致以下输出: enter image description here

然后您可以调整过滤器列:

import numpy as np
df['Outlier'] = np.where(df['value'] >= df['ci95_hi'], 1, np.where(df['value']<= df['ci95_lo'], 1, 0))

然后在列异常值中具有1的所有变量都是一个异常值。您可以使用1.96调整值以使其发挥一些作用。

结果看起来像: enter image description here