我有一段互联网测量实验的结果,如下图所示。我正在做大熊猫的时间序列分析。数据中存在某些下降,这是由于服务器中断造成的。我正在寻找平滑数据的好方法。
在更简单的内置平滑函数中,pd.rolling_max()
提供了相当不错的估计。然而它高估了一点。我还尝试编写自己的平滑函数,当有> 20%的下降时,它会带来前向值。这也提供了相当好的估计,但阈值是任意设定的。
def my_smooth(win, thresh = 0.80):
win = win.copy()
for i, val in enumerate(win):
if i > 1 and val < win[i-1] * thresh:
win[i] = win[i-1]
return win[-1]
ts = pd.rolling_apply(ts, 6, my_smooth)
我的问题是,鉴于具体特征,这类时间序列的平滑函数有哪些? (即,它是事件的数量,并且在特定时间计数的主要测量误差很大)。另外,我建议的平滑功能可以减少或优化吗?
答案 0 :(得分:3)
我想补充一下,我最终是如何为其他感兴趣的人解决这个问题的。最重要的是,在查看了一些平滑技术之后,我最终决定不进行平滑,因为它会改变数据。相反,我选择过滤掉10%的点作为异常值,这是机器学习和信号处理中的常用技术。
在我们的例子中,异常值是测量记录失败导致的低测量值。有许多技术可以检测异常值,其中流行的是在NIST的Engineering Statistics Handbook中命名的。鉴于我的数据有明显趋势,我选择了中位数绝对偏差&#34;:将测量系列中的每个点与滚动中位数进行比较,生成差异,并适当选择一个截止点。
# 'data' are the weekly measurements, in a Pandas series
filtered = data.copy()
dm = pd.rolling_median(data, 9, center=True)
df = sorted(np.abs(data - dm).dropna(), reverse=True)
cutoff = df[len(df) // 10]
filtered[np.abs(data - dm) > cutoff] = np.nan