Pandas在数据框上滚动

2024-04-19 19:50:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有雅虎的股票数据,我想操纵,就像这样

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循环遍历所有的日期,得到我想要的。但我想弄清楚我是否可以用矢量化的方式来做。也许可以使用一个滚动的λ函数。这就是我到目前为止所做的。。。你知道吗

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

这不起作用,因为应用程序在一个系列上工作,并且不能访问数据帧上的其他列。你知道吗

这有什么好办法吗?你知道吗


Tags: 数据ioimportwebpandasclosedatafoo
1条回答
网友
1楼 · 发布于 2024-04-19 19:50:59

与其在整个数据帧上调用rolling_apply,不如在感兴趣的列上调用它并调用min

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

有趣的是,global 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

相关问题 更多 >