首页 > 解决方案 > 如何在 df.rolling.apply 中生成多个输出?

问题描述

data = pd.DataFrame(np.random.random((200, 10)), columns=[*'ABCDEFGHIJ'])

============================

     A         B         C  ...         H         I         J
0    0.037608  0.301907  0.392480  ...  0.933584  0.183160  0.704827
1    0.916830  0.419919  0.890444  ...  0.683593  0.004465  0.750646
2    0.631486  0.234803  0.723553  ...  0.960028  0.303452  0.692989
3    0.357510  0.506667  0.928800  ...  0.707072  0.429867  0.993928
4    0.933780  0.083027  0.164354  ...  0.463918  0.291948  0.498712
..        ...       ...       ...  ...       ...       ...       ...
195  0.229429  0.960220  0.321908  ...  0.825912  0.405020  0.230486
196  0.733413  0.226747  0.707638  ...  0.746275  0.865566  0.579064
197  0.792347  0.440722  0.640206  ...  0.128993  0.161051  0.327097
198  0.399510  0.909695  0.361036  ...  0.604576  0.132304  0.929926
199  0.065853  0.833491  0.526684  ...  0.049173  0.693042  0.196375

============================

def foo(arr):
    return pd.Series([*'XYZ'], index=[*'RST'])

============================

data.agg({'A': foo, 'B': foo})

     A        B      
     R  S  T  R  S  T
0    X  Y  Z  X  Y  Z
1    X  Y  Z  X  Y  Z
2    X  Y  Z  X  Y  Z
3    X  Y  Z  X  Y  Z
4    X  Y  Z  X  Y  Z
..  .. .. .. .. .. ..
195  X  Y  Z  X  Y  Z
196  X  Y  Z  X  Y  Z
197  X  Y  Z  X  Y  Z
198  X  Y  Z  X  Y  Z
199  X  Y  Z  X  Y  Z
-----------------------------
data.rolling(10).agg({'A': foo, 'B': foo})

TypeError: cannot convert the series to <class 'float'>

看来rolling apply,rolling agg只接受单一输出,而且必须是float。

有没有办法像 data.agg 那样生成具有多索引的列?

我需要在滚动窗口上计算一些统计数据,它们共享一些中间变量。因此,一次计算它们可以节省大量时间。

例如,如果我想要偏度和峰度,那么我可以重用中间变量,如二阶矩、均值等。如果我分别为偏度和峰度编写独立函数,则计算过程将是多余的。

标签: pythonpandasalgorithm

解决方案


IIUC,这有效:

df = pd.DataFrame({'A':np.arange(100),
                   'B':np.arange(100,10001,100), 
                   'C':np.arange(1000,100001,1000)})

df.rolling(3).agg(['max','min','std'])

输出:

     A                 B                      C                
   max  min  std     max    min    std      max     min     std
0  NaN  NaN  NaN     NaN    NaN    NaN      NaN     NaN     NaN
1  NaN  NaN  NaN     NaN    NaN    NaN      NaN     NaN     NaN
2  2.0  0.0  1.0   300.0  100.0  100.0   3000.0  1000.0  1000.0
3  3.0  1.0  1.0   400.0  200.0  100.0   4000.0  2000.0  1000.0
4  4.0  2.0  1.0   500.0  300.0  100.0   5000.0  3000.0  1000.0
5  5.0  3.0  1.0   600.0  400.0  100.0   6000.0  4000.0  1000.0
6  6.0  4.0  1.0   700.0  500.0  100.0   7000.0  5000.0  1000.0
7  7.0  5.0  1.0   800.0  600.0  100.0   8000.0  6000.0  1000.0
8  8.0  6.0  1.0   900.0  700.0  100.0   9000.0  7000.0  1000.0
9  9.0  7.0  1.0  1000.0  800.0  100.0  10000.0  8000.0  1000.0

推荐阅读