Pandas 将自定义函数应用于滚动数据帧

Pandas 将自定义函数应用于滚动数据帧,pandas,dataframe,Pandas,Dataframe,我有一个函数(我们称之为)RBSA(df)(我目前将该函数视为一个黑盒),它接受一个数据帧 DATE RETURN STYLE1 STYLE2 STYLE3 STYLE4 2020-09-01 0.01 100 251 300 211 2020-09-02 0.04 106 248 310 210 2020-09-03 0.03 104

我有一个函数(我们称之为)RBSA(df)(我目前将该函数视为一个黑盒),它接受一个数据帧

   DATE      RETURN    STYLE1    STYLE2    STYLE3    STYLE4
2020-09-01    0.01      100       251       300       211
2020-09-02    0.04      106       248       310       210
2020-09-03    0.03      104       251       308       211
2020-09-03    0.02      110       258       306       212
...
并返回如下数据帧

DATE       STYLE1    STYLE2    STYLE3    STYLE4    R2
2020        0.01      85        10        4.99     68
现在,我希望能够在滚动的基础上将该函数应用于初始数据库,窗口为30,这样dataframe看起来就像这样

  DATE       STYLE1    STYLE2    STYLE3    STYLE4    R2
2020-09       0.01      85        10        4.99     68   #applied date range would be 09-01 to 09-30
2020-09       0.99      80        15        4.01     77   #applied date range would be 09-02 to 10-01
2020-09       3.93      80        10        6.07     89   #applied date range would be 09-03 to 10-02
到目前为止,我已经尝试使用了
df.rolling(30).apply(RBSA)
,但是从我所知道的情况来看,rolling.apply函数通过将每个窗口变成
numpy.ndarray来应用该函数。但是,由于我将
RBSA()
函数视为一个黑盒,因此我不希望将
RBSA()
函数更改为具有
numpy.ndarray
作为输入

我的第二个想法是创建一个for循环,将每个数据帧
append()
附加到一个最初为空的数据帧。但是,我不确定如何使用while循环模拟滚动窗口

def rolling30(df):
   count = len(count) - 30
   ret = []
   while (count > 0):
      count = count - 1
      df2 = df[count:count + 30]
      df2 = style(df2)
      ret.append(df2)
但是,与手动将数据帧附加在一起不同,由于某种原因,当我将数据帧附加在一起时,它似乎创建了如下输出(注意逗号)

现在,当使用while循环找到解决方案时,我感觉自己是最接近的。虽然它不像使用
rolling.apply那样优雅


更新:刚刚做了一个
isinstance(rolling30(df),pd.DataFrame)
并且它返回了
False
,所以我假设问题是在某个地方它正在将它还原为一个非数据帧的东西。

所以我找到了
循环问题的解决方案。意识到最初的
ret
是一个列表,并将其更改为
ret=pd.DataFrame()
,然后追加到
ret

def rolling30(df):
   count = len(count) - 30
   ret = pd.DataFrame()
   while (count > 0):
      count = count - 1
      df2 = df[count:count + 30]
      df2 = style(df2)
      ret = ret.append(df2)

我仍然想看看其他人用什么方法解决这个问题,因为我觉得While循环的部署在这里不是一个优雅的解决方案。

所以我找到了解决我的
While
循环问题的方法。意识到最初的
ret
是一个列表,并将其更改为
ret=pd.DataFrame()
,然后追加到
ret

def rolling30(df):
   count = len(count) - 30
   ret = pd.DataFrame()
   while (count > 0):
      count = count - 1
      df2 = df[count:count + 30]
      df2 = style(df2)
      ret = ret.append(df2)
我仍然想看看其他人用什么方法解决这个问题,因为我觉得While循环的部署在这里不是一个优雅的解决方案