私は同様の回答hereに従っていますが、sklearnとローリングを使用するときにいくつか質問があります。私は、Zスコアを作成しようと適用ローリングでPCAを行うが、私はrolling
のコマンドを使用している場合、私はデータフレームPandas Rolling Apply custom
from sklearn.preprocessing import StandardScaler
import pandas as pd
import numpy as np
sc=StandardScaler()
tmp=pd.DataFrame(np.random.randn(2000,2)/10000,index=pd.date_range('2001-01-01',periods=2000),columns=['A','B'])
を作成する前の例に続いて'only length-1 arrays can be converted to Python scalars' error.
を取得し続けています:
をtmp.rolling(window=5,center=False).apply(lambda x: sc.fit_transform(x))
TypeError: only length-1 arrays can be converted to Python scalars
このエラーが発生します。私は問題のない平均と標準偏差を持つ関数を作成することができます。
def test(df):
return np.mean(df)
tmp.rolling(window=5,center=False).apply(lambda x: test(x))
私がz-スコアの現在の値で平均を差し引いているときにエラーが発生すると思います。
def test2(df):
return df-np.mean(df)
tmp.rolling(window=5,center=False).apply(lambda x: test2(x))
only length-1 arrays can be converted to Python scalars
PCAを最初に標準化して実行するには、sklearnでカスタムローリング関数を作成するにはどうすればよいですか?
編集: 私の質問は正確ではなかったので、もう一度やり直してください。私は自分の値を標準化し、PCAを実行して各要因によって説明される分散量を取得したいと思います。ローリングせずにこれを行うのはかなり簡単です。
testing=sc.fit_transform(tmp)
pca=decomposition.pca.PCA() #run pca
pca.fit(testing)
pca.explained_variance_ratio_
array([ 0.50967441, 0.49032559])
ローリング時にはこの同じ手順を使用できません。 @piRSquaredのローリングzscore関数を使用すると、zscoresが得られます。 sklearnのPCAはローリング適用カスタム機能と互換性がないようです。実際には、これはほとんどのSklearnモジュールの場合と思われます。私は単なる次元のアイテムである説明された分散を取得しようとしていますが、このコードではNaNの束が返されます。
def test3(df):
pca.fit(df)
return pca.explained_variance_ratio_
tmp.rolling(window=5,center=False).apply(lambda x: test3(x))
しかし、自分で説明した分散関数を作成することもできますが、これも機能しません。
def test4(df):
cov_mat=np.cov(df.T) #need covariance of features, not observations
eigen_vals,eigen_vecs=np.linalg.eig(cov_mat)
tot=sum(eigen_vals)
var_exp=[(i/tot) for i in sorted(eigen_vals,reverse=True)]
return var_exp
tmp.rolling(window=5,center=False).apply(lambda x: test4(x))
このエラーは0-dimensional array given. Array must be at least two-dimensional
です。
要約すると、ローリングzスコアを実行し、各ロールで説明された分散を出力するpcaをローリングしたいと思います。私はローリングZスコアを下げましたが、分散は説明しませんでした。
あなたは出力がする何を期待していますか?パンダローリング関数は、入力の塊から単一のスカラー値を生成すると考えられています。あなたがチャンク上でより複雑な操作をしたい場合、あなた自身のロールをロールバックする必要があります。 – BrenBarn