【问题标题】:understanding rolling correlation in pandas了解熊猫的滚动相关性
【发布时间】:2019-02-18 07:12:53
【问题描述】:

我试图了解 pandas.rolling_corr 是如何实际计算滚动相关性的。到目前为止,我一直在用 numpy 做这件事。由于速度和易用性,我更喜欢使用 pandas,但我无法像以前那样获得滚动相关性。

我从两个 numy 数组开始:

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.

【问题讨论】:

    标签: python pandas correlation rolling-computation


    【解决方案1】:

    您尝试进行的计算可以被认为是在以下数据帧上运行:

    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)

    【讨论】:

    • 非常感谢您,先生
    • 为什么在 func=lambda x: np.correlate(x, b[0]) 中使用 b[0]?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2019-07-25
    • 2019-08-03
    • 1970-01-01
    • 2018-06-26
    • 2017-03-30
    相关资源
    最近更新 更多