我有Yahoo Stock数据,我想这样处理,
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适用于Series,并且无权访问数据框上的其他列。
这是一些整洁的方法吗?
与其调用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句