2016-12-04 4 views
2

나는 비슷한 대답을 here에 따라 왔지만, sklearn과 롤링을 사용할 때 몇 가지 질문이 있습니다. 나는 Z-점수를 생성하고 적용 롤링과 PCA을 위해 노력하고 있어요,하지만 난 rolling 명령을 사용하는 경우 나는 내가 dataframe팬더 롤링 사용자 정의

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 

어떻게 먼저 표준화 sklearn와 사용자 정의 롤링 기능을 만든 다음 PCA를 실행?

편집 : 나는 내 질문이 정확히 명확하지 않아서 다시 시도해야한다고 생각합니다. 내 가치관을 표준화하고 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 = lambda x: (x - x.mean())/x.std() 
tmp.rolling(5).apply(zscore) 
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를 엉망으로 만든다는 이유는 내가 한 줄뿐만 아니라 여러 줄을 사용하기 때문입니다. –

관련 문제