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'],所以我决定对其进行滚动.mean() 操作并尝试预测滚动数据df['y_roll']。现在我的模型能够预测df['y_roll'],它的名字是:df['y_roll_predicted'].
如何在此预测列上执行滚动操作的反向操作,以便将其与df['y']值进行比较?
使用此函数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)
此代码完全恢复y,y_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因此“展开”无法完全恢复原始值。
| 归档时间: |
|
| 查看次数: |
1970 次 |
| 最近记录: |