了解大熊猫中的滚动相关性

时间:2017-12-19 15:42:35

标签: python pandas correlation rolling-computation

我试图了解pandas.rolling_corr如何实际计算滚动相关性。到目前为止,我一直都是用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]

如果我尝试用熊猫解决它:

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()

但是,我想用熊猫完全解决这个问题。我搜索了文档,但没有找到我要找的答案。我错过了什么或者没有理解?

非常感谢你。

d

1 个答案:

答案 0 :(得分: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,并将值放在一起在窗口的中心(中心=真)。

您可以尝试:

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。

(我正在使用熊猫0.17.0)