3

pandas.rolling_corr が実際にローリング相関を計算する方法を理解しようとしています。これまでのところ、私は常に numpy でそれを行ってきました。速度と使いやすさからパンダを使用することを好みますが、以前のようにローリング相関を取得できません。

2 つの 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)

生成された各ウィンドウと 2 番目の元のデータセットの間の相関を計算します。このアプローチは問題なく機能します。

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)

またはパンダの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.

4

1 に答える 1