python - pandas 滚动应用于数据框

标签 python pandas

我有雅虎股票数据,我想像这样操作,

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/

相关文章:

python - 根据另一个字符串向字符串添加符号

python - 找不到满足我自己模块要求的版本

python - 使用 map : A value is trying to be set on a copy of a slice from a DataFrame 时的 Pandas 警告

python - 在 Pandas 中计算 YTD 总数

python - 从 C 调用 IPython.embed() 方法时为 "ValueError: call stack is not deep enough"

python - __init__ 函数似乎在定义时执行,而不是实例化

python - 用 Python 加密

python - 如何展平 Pandas 数据框列中的列表?

Python - 分类的最低方差的箱大小

python - 根据另一列更改 pandas 列