我具有下面的数据帧,这是一个时序数据,我处理此信息以输入到我的预测模型中。
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
在该时间戳记中不是异常值。
那么我如何根据哪个时间戳不适合该组来过滤每个时间戳的异常值?
感谢您的帮助。
答案 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')
然后您可以调整过滤器列:
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调整值以使其发挥一些作用。