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.