2014-08-29 3 views
1

dataframe에 appy 수 롤링 팬더, 주어진 날짜에 대한나는과 같이 조작하고 싶다고, 야후 주식 데이터를

import pandas as pd 
import pandas.io.data as web 
data = web.DataReader('SPY','yahoo') 
data.head() 


Out[13]: 
      Open High Low  Close Volume Adj Close 
Date       
2010-01-04 112.37 113.39 111.51 113.33 118944600 103.44 
2010-01-05 113.26 113.68 112.85 113.63 111579900 103.71 
2010-01-06 113.52 113.99 113.43 113.71 116074400 103.79 
2010-01-07 113.50 114.33 113.18 114.19 131091100 104.23 
2010-01-08 113.89 114.62 113.66 114.57 126402800 104.57 

, 나는 앞으로 이일을보고 가장 낮은 견적을 찾을 싶습니다 그것을 위해. 따라서 2010-1-4 년 동안 정답은 112.85입니다.

이제 for 루프를 사용하여 모든 날짜를 반복하고 원하는 것을 얻을 수 있습니다. 그러나 나는 이것을 벡터화 된 방식으로 할 수 있는지 알고 싶습니다. 아마도 rolling_apply 람다 함수를 사용하면 될 것입니다. 이 ...

def foo(x): 
    today = x[0] 
    forward = x[1:] 
    return (forward.min()) 
pd.rolling_apply(data,2,foo) 

rolling_apply이 시리즈에서 작동하며 데이터 프레임의 다른 컬럼에 액세스 할 수 없기 때문에이 작동하지 않는 내가 지금까지 한 일이다.

이 방법이 조금 깔끔한가요?

+1

'pd.rolling_apply (data [ 'Low'], 2, min)'원하는 것은 무엇입니까? – EdChum

+0

예. 내 문제를 해결합니다. 감사합니다. – nitin

+0

답변으로 게시해야합니까? – EdChum

답변

2

오히려 전체 dataframe에 rolling_apply를 호출하는 대신, 단지 관심있는 열을 호출 및 통화 min :

pd.rolling_apply(data['Low'],2,min) 

흥미롭게 글로벌 min 함수가 주어진 아마도 그 놀라운하지 NumPy와 min을 능가하는 우리 모두 두 요소 배열의 가장 낮은 값을 찾는 것입니다 :

In [26]: 

%timeit pd.rolling_apply(data['Low'],2,np.min) 
%timeit pd.rolling_apply(data['Low'],2,min) 
10 loops, best of 3: 15.4 ms per loop 
1000 loops, best of 3: 1.44 ms per loop 
관련 문제