我有雅虎股票数据,我想像这样操作,
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 循环迭代所有日期并得到我想要的。但我想知道是否可以以矢量化的方式做到这一点。也许通过使用 roll_apply lambda 函数。这就是我到目前为止所做的...
def foo(x):
today = x[0]
forward = x[1:]
return (forward.min())
pd.rolling_apply(data,2,foo)
这不起作用,因为rolling_apply适用于系列并且无法访问数据框上的其他列。
这是一些巧妙的方法吗?
最佳答案
无需在整个数据帧上调用 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
关于python - pandas 滚动应用于数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25575062/