在pandas中理解滚动相关性

4

我正在尝试理解pandas.rolling_corr如何计算滚动相关性。到目前为止,我一直使用numpy进行操作。由于速度和易用性,我更喜欢使用pandas,但是我无法获得与以前相同的滚动相关性。

我从两个numpy数组开始:

c = np.array([1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1])
d = np.array([8,9,8])

现在我想计算数组c的长度为3的窗口的交叉相关性。我定义了一个滚动窗口函数:

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

我需要计算我生成的每个窗口和第二个原始数据集之间的相关性。这种方法可以很好地实现:

for win in rolling_window(c, len(d)):
    print(np.correlate(win, d))

输出:

[50]
[75]
[100]
[125]
[150]
[175]
[200]
[209]
[200]
[175]
[150]
[125]
[100]
[75]
[50]

如果我尝试使用pandas来解决它:

a = pd.DataFrame([1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1])
b = pd.DataFrame([8,9,8])

无论我使用DataFrame rolling_corr:
a.rolling(window=3, center=True).corr(b)

或者使用Pandas的rolling_corr函数:
pd.rolling_corr(a, b, window=1, center=True)

我只看到了一堆 NaN:

      0
0   NaN
1   0.0
2   NaN
3   NaN
4   NaN
5   NaN
6   NaN
7   NaN
8   NaN
9   NaN
10  NaN
11  NaN
12  NaN
13  NaN
14  NaN
15  NaN
16  NaN

有人能帮我一下吗?我可以通过将从转换Pandas DataFrame获得的NumPy数组展平来解决NumPy问题。

a.values.ravel()

然而,我希望完全使用pandas解决计算问题。我已经查阅了文档,但没有找到我想要的答案。我错过了什么或者理解有误?

非常感谢您提前的帮助。

D.

1个回答

2
你正在尝试进行的计算可以视为对以下数据帧进行操作:
pd.concat([a, b], axis=1)

    0   0
0   1   8
1   2   9
2   3   8
3   4 NaN
4   5 NaN
5   6 NaN
6   7 NaN
7   8 NaN
8   9 NaN
9   8 NaN
10  7 NaN
11  6 NaN
12  5 NaN
13  4 NaN
14  3 NaN
15  2 NaN
16  1 NaN

如果您使用window=3,它会将b中的前三个值与a中的前三个值相关联,其余值为NaN,并将该值放置在窗口的中心(center=True)。
您可以尝试:
pd.rolling_apply(a, window=3, func=lambda x: np.correlate(x, b[0]))

输出:

      0
0   NaN
1   NaN
2    50
3    75
4   100
5   125
6   150
7   175
8   200
9   209
10  200
11  175
12  150
13  125
14  100
15   75
16   50

如果您愿意,可以在这里添加center=True。

(我使用的是pandas 0.17.0版本)


非常感谢您,先生。 - mosegui
为什么在func=lambda x: np.correlate(x, b[0])中使用b [0]? - Victor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接