2014-08-29 209 views
1

我有雅虎股票的數據,我想操縱,像這樣,大熊貓在數據幀滾動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 

對於任何給定的日期,我想期待2天,找到最低報價爲了它。因此,對於2010-1-4,正確的答案是112.85。

現在,我可以用for循環遍歷所有日期並獲得我想要的。但我想弄清楚我是否可以用矢量化的方式來做到這一點。也許通過使用rolling_apply lambda函數。這是我迄今所做的......

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 2014-08-29 19:41:38

+0

是的,它確實解決了我的問題。謝謝 – nitin 2014-08-29 20:19:47

+0

我應該發佈答案嗎? – EdChum 2014-08-29 20:21:38

回答

2

而不是在整個數據幀調用rolling_apply,只是把它感興趣的列,並調用min

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

有趣的是,全球min功能優於給出的numpy的min,也許並不奇怪,所有的我們正在做的是找到一個2元素數組的最低值:

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