python - 在 Dataframe 中的滚动窗口上应用一个函数,其中将整个数据帧传递给函数

标签 python pandas dataframe apply

我有一个由 YearMo 索引的 5 列数据框:

yearmo = np.repeat(np.arange(2000, 2010) * 100, 12) + [x for x in range(1,13)] * 10 
rates = pd.DataFrame(data=np.random.random(120, 5)), 
                     index=pd.Series(data=yearmo, name='YearMo'), 
                     columns=['A', 'B','C', 'D', 'E'])

rates.head()                       
YearMo    A         B          C         D       E 
200411  0.237696  0.341937  0.258713  0.569689  0.470776
200412  0.601713  0.313006  0.221821  0.720162  0.889891
200501  0.024379  0.761315  0.225032  0.293682  0.302431
200502  0.996778  0.388783  0.026448  0.056188  0.744850
200503  0.942024  0.768416  0.484236  0.102904  0.287446

我想做的是能够应用滚动窗口并将所有五列传递给一个函数——类似于:

rates.rolling(window=60, min_periods=60).apply(lambda x: my_func(data=x, param=5)

但这种方法将函数应用于每一列。指定 axis=1 也没有任何作用....

最佳答案

Question: ... apply a rolling window and pass all five columns to a function

这将执行您想要的操作,min_periods=5, axis=1.rolling(... 窗口是列 'A':'E' 或 5 的倍数。

def f1(data=None):
    print('f1(%s, %s) data=%s' % (str(type(data)), param, data))
    return data.sum()

subRates = rates.rolling(window=60, min_periods=5, axis=1).apply(lambda x: f1( x ) )

Input:

               A         B         C         D         E
YearMo
200001  0.666744  0.569194  0.546873  0.018696  0.240783
200002  0.035888  0.853077  0.348200  0.921997  0.283177
200003  0.652761  0.076630  0.298076  0.800504  0.041231
200004  0.537397  0.968399  0.211072  0.328157  0.929783
200005  0.759506  0.702220  0.807477  0.886935  0.022587

Output:

f1(<class 'numpy.ndarray'>, None) data=[ 0.66674393  0.56919434  0.54687296  0.01869609  0.24078329]
f1(<class 'numpy.ndarray'>, None) data=[ 0.03588751  0.85307707  0.34819965  0.92199698  0.28317727]
f1(<class 'numpy.ndarray'>, None) data=[ 0.65276067  0.07663029  0.29807589  0.80050448  0.04123137]
f1(<class 'numpy.ndarray'>, None) data=[ 0.53739687  0.96839917  0.21107155  0.32815687  0.92978308]
f1(<class 'numpy.ndarray'>, None) data=[ 0.75950632  0.70222034  0.80747698  0.88693524  0.02258685]
         A   B   C   D         E
YearMo
200001 NaN NaN NaN NaN  2.042291
200002 NaN NaN NaN NaN  2.442338
200003 NaN NaN NaN NaN  1.869203
200004 NaN NaN NaN NaN  2.974808
200005 NaN NaN NaN NaN  3.178726

使用 Python:3.4.2 - pandas:0.19.2 测试

关于python - 在 Dataframe 中的滚动窗口上应用一个函数,其中将整个数据帧传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43420909/

相关文章:

python - 在 Windows(和 Linux)上播放各种音频的最佳 python 解决方案?

python - 组合 DataFrame 中的行并将值添加为列

python - 从多 channel 图像中提取 channel 名称

python - 如何使用 argparse 添加对 Python 脚本多行参数的支持?

pandas - 当输入是 Pandas 数据框时,为什么 Tensorflow 2 会发出警告(但仍然有效)?

python - 将数据框转换为 LaTeX

python - 用 pandas 计算局部导数

Python ExcelWriter 格式 'all borders'

pandas - 如何从 Pandas 中的多列计算多列

python - Networkx:从 Pandas DataFrame 中的距离矩阵绘制网络