2016-08-09 3 views
3

롤링 윈도우 내의 열로 백분위 순위 데이터를 계산하려고합니다.팬더 롤링 윈도우 백분위 순위

test=pd.DataFrame(np.random.randn(20,3),pd.date_range('1/1/2000',periods=20),['A','B','C']) 

test 
Out[111]: 
        A   B   C 
2000-01-01 -0.566992 -1.494799 0.462330 
2000-01-02 -0.550769 -0.699104 0.767778 
2000-01-03 -0.270597 0.060836 0.057195 
2000-01-04 -0.583784 -0.546418 -0.557850 
2000-01-05 0.294073 -2.326211 0.262098 
2000-01-06 -1.122543 -0.116279 -0.003088 
2000-01-07 0.121387 0.763100 3.503757 
2000-01-08 0.335564 0.076304 2.021757 
2000-01-09 0.403170 0.108256 0.680739 
2000-01-10 -0.254558 -0.497909 -0.454181 
2000-01-11 0.167347 0.459264 -1.247459 
2000-01-12 -1.243778 0.858444 0.338056 
2000-01-13 -1.070655 0.924808 0.080867 
2000-01-14 -1.175651 -0.559712 -0.372584 
2000-01-15 -0.216708 -0.116188 0.511223 
2000-01-16 0.597171 0.205529 -0.728783 
2000-01-17 -0.624469 0.592436 0.0 
2000-01-18 0.259269 0.665585 0.126534 
2000-01-19 1.150804 0.575759 -1.335835 
2000-01-20 -0.909525 0.500366 2.120933 

나는 .apply와 .rolling 사용하려하지만 난 뭔가를 놓친 거지.

pctrank = lambda x: x.rank(pct=True) 
rollingrank=test.rolling(window=10,centre=False).apply(pctrank) 

열 A의 최종 값에서 2000년 1월 11일 2000년 1월 20일에 길이 = 10 윈도우 내의 -0.909525의 백분위 것이다. 어떤 아이디어?

답변

3

내 람다는 팬더의 인 — .rank 방법이없는 NumPy와 어레이 수신 Series하고있다 DataFrame. 당신은 따라서

pctrank = lambda x: pd.Series(x).rank(pct=True).iloc[-1] 

으로 변경할 수 있습니다 또는 당신은 this SO answer의 라인을 따라 순수 NumPy와를 사용할 수 있습니다 완벽

def pctrank(x): 
    n = len(x) 
    temp = x.argsort() 
    ranks = np.empty(n) 
    ranks[temp] = (np.arange(n) + 1)/n 
    return ranks[-1] 
+0

를, 내가 찾던 그냥 뭐. 고맙습니다. 그래서 rank()를 적용하기 전에 x를 팬더 시리즈로 정의하지 못했습니다. 내 람다가 왜 열등한 배열을 받는지 설명해 주시겠습니까? .rolling() 및 .apply()는 모두 팬더 데이터 프레임 'test'에서 작동하는 팬더 함수입니다. – user6435943

+0

* 왜 내 람다는 질 낮은 배열을 받습니까? * 나는 이유를 모른다. 나는 그 오류가 "''numpy.ndarray''가''rank'"메서드를 가지고 있지 않다는 것을 말한 것을 알고 있습니다. '롤링 '은 판다'시리즈'와'데이터 프레임'의 한 방법입니다. '적용'은 여러 다른 화신을 가지고있다. [split-apply-combine] (http://pandas.pydata.org/pandas-docs/stable/groupby.html) 문서를 살펴보십시오. –