【问题标题】:Identifying rolling outliers and replacing them by backfill in timeseries data- Pandas识别滚动异常值并通过回填时间序列数据替换它们 - Pandas
【发布时间】:2020-02-24 10:01:30
【问题描述】:

我正在绘制我的数据并且我得到了局部异常值,如下图所示

我想用 bfill 替换这些异常值,基于 120 天的滚动平均值,而不是删除这些异常值。

我的问题是我不能使用平均平均值,因为该值会随着时间的推移而不断增加,例如 2013 年的异常值是 2018 年的正常读数。

我见过像 this 这样的解决方案,但它们没有提供有关如何替换这些异常值的指南(我不想完全删除它们)

【问题讨论】:

  • 可以分享这些数据吗?
  • 您可以做的是首先确定要使用的时间窗口,然后计算该间隔窗口中值的分布,然后获得该窗口平均值的 95% 置信区间,一旦你得到了上限和下限,你就可以很确定你的异常值超出了你刚刚计算的置信区间:) 听起来怎么样?获取时间窗口的间隔并不难,因为您知道平均值大致分布为具有均值 E(X) 和方差 Var(X)/n 的正态变量,这应该可以解决问题。
  • @PankajJoshi 数据保密,抱歉。

标签: python pandas outliers rolling-computation


【解决方案1】:

好吧,您链接的答案可以帮助您解决大部分问题。在有意义的时间段内选择滚动平均值之外的一些滚动标准差,然后将它们标记为NaN 并填充它们,例如:

import pandas as pd
import numpy as np


df = pd.DataFrame({'Data':np.random.normal(size=200)})
df.iloc[[10, 55, 80]] = 40. 
r = df.rolling(window=20)
mps_up, mps_low = r.mean() + 3 * r.std(), r.mean()  -  3 * r.std()
df.loc[~df['Data'].between(mps_low.Data, mps_up.Data), 'Data'] = np.NaN
df['Data'] = df['Data'].fillna(method='bfill')

这应该可以解决问题!

【讨论】:

  • 是的,但这只会消除上层异常值而不是其他异常值
猜你喜欢
  • 2020-08-05
  • 2016-05-10
  • 2018-01-09
  • 2021-07-27
  • 2021-04-27
  • 1970-01-01
  • 2022-07-19
  • 2019-05-06
  • 1970-01-01
相关资源
最近更新 更多