【问题标题】:How to do a reverse moving average ( in pandas, rolling().mean ) operation on predicted values? [closed]如何对预测值进行反向移动平均(在 pandas 中为 rolling().mean )操作? [关闭]
【发布时间】:2019-02-26 14:29:30
【问题描述】:

我有一个这样的 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)

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

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

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

如何对这个预测列进行反向滚动操作,以便将其与df['y'] 值进行比较?

df['y_roll_predicted']df['y_roll'] 的情节如下:

【问题讨论】:

  • 这不在stackoverflow上,但有一个很好的答案here,其中包括一个python/numpy解决方案
  • 我投票结束这个问题,因为它在stats.stackexchange.com/questions/67907/…得到了回答
  • 我认为我提出的答案是不同的,更多地关注软件实现而不是理解它的数学方式。

标签: python pandas moving-average


【解决方案1】:

这与我问的这个问题cumsum with shift of 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])

此代码完全从 y_roll 恢复 y,因为您有初始值。

您可以看到它(在我的情况下是 plotly)绘制 yy_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])

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

这里的情节放大了一个较小的范围,以便更好地看到它:

【讨论】:

    猜你喜欢
    • 2017-02-06
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2020-10-26
    • 2013-07-05
    • 2021-10-11
    • 2018-05-08
    相关资源
    最近更新 更多