0

我想问在时间序列趋势分析中做移动平均模型时,当我们在评论中做移动平均时,我们会做类似下面的代码

moving average = @movavc(data, n)

然而在python中,我们会做如下的事情:

data["mov_avc"] = data.rolling(window=n).mean()

在 eviews 中进行简单移动平均时,我们首先会丢失最后几个观察结果,在 python 中,我们只会丢失第一个观察结果。

怎么样?

4

1 回答 1

0

如果我的问题正确,您想了解为什么在python中执行窗口大小n的移动平均值不会丢失最后几个点。

查看 pandas.rolling()文档,您会看到以下注释:

默认情况下,结果设置在窗口的右边缘。可以通过设置 center=True 将其更改为窗口的中心。

这意味着默认情况下,滚动窗口不以计算平均值的值为中心。

让我们通过一个例子来看看它是如何工作的。

我们有一个简单的 DataFrame:

In [2]: ones_matrix = np.ones((5,1))
   ...: ones_matrix[:,0] = np.array([i+1 for i in range(ones_matrix.shape[0])])
   ...: index = [chr(ord('A')+i) for i in range(ones_matrix.shape[0])]
   ...: df = pd.DataFrame(data = ones_matrix,columns=['Value'],index=index)
   ...: df
Out[2]:
   Value
A    1.0
B    2.0
C    3.0
D    4.0
E    5.0

现在让我们滚动大小为3的窗口。(请注意,我明确编写了参数center=False,但这是调用 df.rolling() 的默认值)

In [3]: rolled_df = df.rolling(window=3,center=False).mean()
   ...: rolled_df
Out[3]:
   Value
A    NaN
B    NaN
C    2.0
D    3.0
E    4.0

前两行是NaN,而最后一个点仍然存在。例如,如果您注意到索引为 C的行,则滚动后的值为2。但在它之前是3。这意味着该索引的新值是对索引为 {A,B,C} 的行进行平均的结果,这些索引的值分别为 {1,2,3}。

因此,在计算该位置的平均值时,您可以看到窗口不是以索引 C 为中心,而是以索引 B 为中心。

您可以通过设置centered=True来改变它,从而输出预期的行为:

In [4]: centred_rolled_df = df.rolling(window=3,center=True).mean()
   ...: centred_rolled_df
Out[4]:
   Value
A    NaN
B    2.0
C    3.0
D    4.0
E    NaN
于 2019-08-21T11:37:02.660 回答