Pandas 滚动应用函数到整个窗口数据框

Yai*_*aon 5 python apply pandas rolling-computation

我想将一个函数应用于滚动窗口。我在这里看到的所有答案都集中在应用于单行/列,但我想将我的功能应用于整个窗口。这是一个简化的示例:

import pandas as pd
data = [ [1,2], [3,4], [3,4], [6,6], [9,1], [11,2] ]
df = pd.DataFrame(columns=list('AB'), data=data)
Run Code Online (Sandbox Code Playgroud)

这是df

    A   B
0   1   2
1   3   4
2   3   4
3   6   6
4   9   1
5   11  2
Run Code Online (Sandbox Code Playgroud)

取一些函数应用于整个窗口:

df.rolling(3).apply(lambda x: x.shape)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我想得到类似的东西:

    some_name   
0   NA  
1   NA  
2   (3,2)   
3   (3,2)   
4   (3,2)   
5   (3,2)   
Run Code Online (Sandbox Code Playgroud)

当然,这里以形状为例说明f将整个窗口作为计算对象,而不仅仅是一行/列。我尝试使用axis关键字 forrolling以及raw关键字 forapply但没有成功。其他方法 ( agg, transform) 似乎也没有提供。

当然,我可以通过列表理解来做到这一点。只是认为有一种更简单/更清洁的方法来做到这一点。

Ouy*_* Ze 9

不是pd.DataFrame.rolling.... 该函数被迭代地应用于列,接收一系列浮点数/NaN,并一个接一个地返回一系列浮点数/NaN。我认为你的直觉会更好......

def rolling_pipe(dataframe, window, fctn):
    return pd.Series([dataframe.iloc[i-window: i].pipe(fctn) 
                      if i >= window else None 
                      for i in range(1, len(dataframe)+1)],
                     index = dataframe.index) 

df.pipe(rolling_pipe, 3, lambda x: x.shape)
Run Code Online (Sandbox Code Playgroud)

  • 还有两个注意事项:1,这里的“fctn”是一个函数,它需要“pd.DataFrame”作为输入,然后假设一个不可迭代的输出,例如数字或字符串。这个函数有一个版本可以返回数据帧而不是系列,只是不像上面写的那样。2,自从这篇文章以来,我遇到了一个名为“pd.rolling_apply”的类似函数,但缺乏它的文档,所以你必须自己测试它,看看它是否与“rolling_pipe”做同样的事情。 (4认同)
  • 当然——“pd.DataFrame.pipe”是一个非常有用的方法。它以一个函数作为参数。该函数的第一个输入是 pd.DataFrame。为了从“pipe”获得最大的能力,您通常希望它返回一个“Series”或“DataFrame”对象,以便您可以将这些管道链接在一起......但这是一个单独的主题。 (2认同)
  • 在这种情况下,我们知道我们想要将函数“滚动应用”到数据帧的子集,从我们将使用“window”参数定义的数据帧的第一个“剪切”开始,获取从“返回”的值fctn` 在数据帧的那个切口上(使用 `.iloc[..].pipe(fctn)`,然后以这种方式继续滚动数据帧(使用列表理解)。在这种情况下,我们想要的明显对象返回是一个 pd.Series 对象,其索引(`index=dataframe.index`)与输入数据帧相同。 (2认同)