私はパンダrolling
の機能を使用して回転多因子回帰を実行するよう動機づけられました(この多項式回帰多因子回帰についてはNOTです)。私は、df.rolling(2)
の後にapply
を使用し、結果としてpd.DataFrame
を取って、.values
でndarrayを抽出し、必要な行列乗算を実行することを期待しました。そんなことはできませんでした。ここで なぜパンダローリングは1次元のndarrayを使用するのですか
print "\ndf = \n", df
print "\nX = \n", X
print "\ndf.shape =", df.shape, ", X.shape =", X.shape
df =
A B
0 0.44 0.41
1 0.46 0.47
2 0.46 0.02
3 0.85 0.82
4 0.78 0.76
X =
[[ 0.93]
[ 0.83]]
df.shape = (5, 2) , X.shape = (2L, 1L)
行列の乗算が正常に動作します:
df.values.dot(X)
array([[ 0.7495],
[ 0.8179],
[ 0.4444],
[ 1.4711],
[ 1.3562]])
行ドットで行を実行するために適用する使用のような物体が見える何
import pandas as pd
import numpy as np
np.random.seed([3,1415])
df = pd.DataFrame(np.random.rand(5, 2).round(2), columns=['A', 'B'])
X = np.random.rand(2, 1).round(2)
製品は期待どおりに動作します。
df.apply(lambda x: x.values.dot(X)[0], axis=1)
0 0.7495
1 0.8179
2 0.4444
3 1.4711
4 1.3562
dtype: float64
GROUPBY - >私が期待するように動作し適用します。
df.groupby(level=0).apply(lambda x: x.values.dot(X)[0, 0])
0 0.7495
1 0.8179
2 0.4444
3 1.4711
4 1.3562
dtype: float64
をしかし、私は実行すると:
df.rolling(1).apply(lambda x: x.values.dot(X))
私が手:
AttributeError: 'numpy.ndarray' object has no attribute 'values'
オクラホマので、パンダれますそのrolling
の実装内にストレートndarray
を使用します。私はそれを処理することができます。代わりにndarray
を取得するために.values
を使用しての、試してみましょう:
df.rolling(1).apply(lambda x: x.dot(X))
shapes (1,) and (2,1) not aligned: 1 (dim 0) != 2 (dim 0)
待って!何?!
私はローリングが何をしているかを見るカスタム関数を作成しました。
def print_type_sum(x):
print type(x), x.shape
return x.sum()
はその後走っ:
print df.rolling(1).apply(print_type_sum)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
A B
0 0.44 0.41
1 0.46 0.47
2 0.46 0.02
3 0.85 0.82
4 0.78 0.76
を私はpd.DataFrame
を結果としてそれは良いことだ、と同じです。しかし、それは10個の一次元のndarray
オブジェクトを印刷しました。何rolling(2)
について
print df.rolling(2).apply(print_type_sum)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
A B
0 NaN NaN
1 0.90 0.88
2 0.92 0.49
3 1.31 0.84
4 1.63 1.58
同じこと、出力を期待するが、それは8つのndarray
オブジェクトを印刷。 rolling
は、ndarray
の形状のndarray
であると予想されたものとは対照的に、各列に対して長さがwindow
の単一のndarray
を生成している。(window, len(df.columns))
。
質問はなぜですか?
私は現在、ローリングマルチファクタ回帰を簡単に実行する方法がありません。
これは、[既知の問題](ですhttp:// stackoverflow.com/a/21026837/5276797)。私は最近、ジェフに尋ねました。コメントで彼の答えを読むことができます! – IanS
パンダ0.20の最先端のソリューションとは何ですか?多くの改良が施されたようです。 OPの目的はrolling()。apply()を使って達成可能か? – Zhang18