2016-12-04 37 views
2

私は同様の回答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スコアを下げましたが、分散は説明しませんでした。

+0

あなたは出力がする何を期待していますか?パンダローリング関数は、入力の塊から単一のスカラー値を生成すると考えられています。あなたがチャンク上でより複雑な操作をしたい場合、あなた自身のロールをロールバックする必要があります。 – BrenBarn

答えて

3

@BrenBarnがコメントしたように、ローリング関数はベクトルを単一の数値に減らす必要があります。以下はあなたがやろうとしていたことに相当し、問題を強調するのに役立ちます。 zscore関数で

zscore = lambda x: (x - x.mean())/x.std() 
tmp.rolling(5).apply(zscore) 
TypeError: only length-1 arrays can be converted to Python scalars 

x.mean()x.std()が低下、減少、しかしxはアレイです。したがって、全体が配列です。


これを回避するには、問題を引き起こす部分ではなく、それを必要とするzスコア計算の部分をロールバックすることです。

(tmp - tmp.rolling(5).mean())/tmp.rolling(5).std() 

enter image description here

+0

z-scoreの部分をありがとう。私は、PCAセクションのために何の役にも立たないようにしました。ラムダはPCAを台無しにしているのですか?私は多くの行だけではなく、それをやっているからですか? –

関連する問題