2014-08-29 202 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