Python 如何删除特定于每个时间戳的异常值?

Python 如何删除特定于每个时间戳的异常值?,python,machine-learning,statistics,time-series,outliers,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 0

我有下面的数据框,这是一个时间序列数据,我处理这些信息输入到我的预测模型

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 )]
这些不是该时间戳的异常值

那么,如何根据不适合该组的时间戳筛选出每个时间戳的异常值呢


非常感谢您的帮助。

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

然后你必须得到每个时间戳组的平均值和置信区间。因此,您可以:

这将导致以下输出:

然后可以调整过滤器列:

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

df['Outlier']=np.where(df['value']>=df['ci95_hi'],1,np.where(df['value']什么是离群值?我的意思是你的统计测量值是什么?置信区间?给我们一个关键词在这种情况下,一个值与组中的其他值有很大差异是否被视为离群值。例如
2019-01-01 01 01:00:00
大多数值约为5,但有一个值约为100,因此这是一个离群值,对于methat仍然是这是一个广泛的问题,但让我们把它另存为置信区间。
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))