Pandas 将自定义函数应用于滚动数据帧
我有一个函数(我们称之为)RBSA(df)(我目前将该函数视为一个黑盒),它接受一个数据帧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
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循环的部署在这里不是一个优雅的解决方案