根据条件滚动应用 lambda 函数

Rolling apply lambda function based on condtion

我有一个数据框,其中包含 18 个产品(列)的标准化(至 100)returns。我想应用一个 lambda 函数,它将下一行乘以上一行。

我能做到:

 df= df.rolling(2).apply(lambda x: (x[0]*x[1]),raw=True)

但是我的一些专栏在第 1 行没有值(它们在第 4 行上线)。所以我需要:

  1. 有一个仅从第 4 行开始但适用于整个 df 的 lambda 函数。我可以手动创建前 4 行。

  2. 因为我的值是 100 直到“实时”,我可以让 lambda 函数仅在值不等于 100 时应用。

我都试过了:

1.

df.iloc[3:,:] = df.iloc[3:,:].rolling(2).apply(lambda x: (x[0]*x[1]),raw=True)
   df= df.rolling(2).apply(lambda x: (x[0]*x[1]) if x[0] != 100 else x,raw=True)

但都以失败告终。

欢迎任何建议 - 我花了几个小时浏览网站,但尚未找到适合这种情况的任何结果。

因此,鉴于缺少回复,我想出了一个解决方案,将我的 df 分成两部分,然后将它们重新组合在一起。

我的 lambda 函数也是垃圾我需要类似的东西:

df2 = df.copy()
    for i in range(df2.index.size):
    if not i:
        continue
    df2.iloc[i] = (df2.iloc[i - 1] * (df.iloc[i])) 
df2

真正实现我所追求的目标。