如何对预测值进行反向移动平均(在熊猫中,滚动()。均值)操作?

Mus*_*ser 1 python moving-average pandas

我有一个这样的 df:

import numpy as np
import pandas as pd
import matplotlib.pylab as plt
np.random.seed(100)
data = np.random.rand(200,3)

df = pd.DataFrame(data)
df.columns = ['a', 'b', 'y']

df['y_roll'] = df['y'].rolling(10).mean()
df['y_roll_predicted'] = df['y_roll'].apply(lambda x: x + np.random.rand()/20)
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我创建了一个随机的 pandas df。然后用于rolling(10).mean()执行一个moving averageondf['y']并将其保存为df['y_roll'].

情节df['y']如下: y 的图

因为我的模型无法预测 的尖​​锐边缘df['y'],所以我决定对其进行滚动.mean() 操作并尝试预测滚动数据df['y_roll']。现在我的模型能够预测df['y_roll'],它的名字是:df['y_roll_predicted'].

如何在此预测列上执行滚动操作的反向操作,以便将其与df['y']值进行比较?

df['y_roll_predicted']vs的情节df['y_roll']如下: 在此处输入图片说明

Gon*_*olo 5

这与这个问题cumsum 与我问的 n 移位非常相关。

使用此函数cumsum_shif(n)(该问题提供了使用称为cumsum_shift 的for 循环的实现),您可以将移动平均数反转为取决于初始值的常数,而无需反转必须具有与大小一样多的列的矩阵原系列

让我们将移动平均线y_roll = df.loc[,"y_roll"]y_estimated反向称为一个常数。假设窗口的大小为 10,win_size = 10那么如果将diff滚动平均值的'ed乘以 10 ,然后cumumsum(shift=10)您将获得原始值直至初始值。编码:

def cumsum_shift(s, shift = 1, init_values = [0]):
    s_cumsum = pd.Series(np.zeros(len(s)))
    for i in range(shift):
        s_cumsum.iloc[i] = init_values[i]
    for i in range(shift,len(s)):
        s_cumsum.iloc[i] = s_cumsum.iloc[i-shift] + s.iloc[i]
    return s_cumsum

win_size = 10
s_diffed = win_size * df['y_roll'].diff()
df['y_unrolled'] = cumsum_shift(s=s_diffed, shift = win_size, init_values= df['y'].values[:win_size])
Run Code Online (Sandbox Code Playgroud)

此代码完全恢复yy_roll因为您拥有初始值。

您可以看到它绘制了它(在我的情况下是 plotly),y并且y_unrolled完全相同(只是红色的)。 在此处输入图片说明

现在做同样的事情y_roll_predicted来获得y_predicted_unrolled.

代码:

win_size = 10
s_diffed = win_size * df['y_roll_predicted'].diff()
df['y_predicted_unrolled'] = cumsum_shift(s=s_diffed, shift = win_size, init_values= df['y'].values[:win_size])
Run Code Online (Sandbox Code Playgroud)

在这种情况下,结果并不完全相同,请注意初始值是如何产生的y,然后y_roll_predicted将噪声合并到其中,y_roll因此“展开”无法完全恢复原始值。

这里的图放大了较小的范围以更好地查看它: 在此处输入图片说明