gpt4 book ai didi

python - 如何对预测值进行反向移动平均(在 pandas 中,rolling().mean)操作?

转载 作者:行者123 更新时间:2023-12-02 03:28:45 28 4
gpt4 key购买 nike

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

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

df['y']的情节如下: Improve this question

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

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

df['y_roll_predicted']df['y_roll'] 的关系图如下: plot of y

最佳答案

这和这个问题很有关系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完全相同(只是红色的)。 enter image description here

现在对 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 因此“展开”无法完全恢复原始状态。

这里将图放大到较小的范围以便看得更清楚: enter image description here

关于python - 如何对预测值进行反向移动平均(在 pandas 中,rolling().mean)操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52456267/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com