如何在信号上重置 Pandas DataFrame 滚动平均值?

我正在尝试根据信号条件重置滚动平均值。从条件为真开始,应忽略先前的值。这可以通过用信号处的当前值替换先前值的历史记录来实现。

mmap

在此示例中,value2 是信号触发后应计算移动平均线的值,而 ma2 将是指数 2000-01-06 以后的预期结果。到 2000-01-05 为止,它应该保持原始的 'ma' 值。 (信号之前的值不应该受到影响)

我在 pandas rolling average with a rolling mask / excluding entries 处发现了一个类似的请求,它可能很有用,但我不知道如何将其应用到我的需要中。

as3861701 回答:如何在信号上重置 Pandas DataFrame 滚动平均值?

  • 实际上您希望为每个 apply() groupby()
  • groupby() 使用 信号 cumsum() 在您的示例中生成两个组。这假设信号 很重要
  • 您的示例不完整输出和代码工作方式之间存在差异。 rolling(4) 将为每个滚动均值计算生成 3 个 NaN
df.loc[:,["ma","ma2"]] = df.groupby(df["signal"].cumsum()).apply(lambda d: d.loc[:,["value","value2"]].rolling(4).mean()).values
df
value 信号 ma value2 ma2
2000-01-01 00:00:00 0 0 nan 0 nan
2000-01-02 00:00:00 1 0 nan 5 nan
2000-01-03 00:00:00 2 0 nan 5 nan
2000-01-04 00:00:00 3 0 1.5 5 3.75
2000-01-05 00:00:00 4 0 2.5 5 5
2000-01-06 00:00:00 5 1 nan 5 nan
2000-01-07 00:00:00 6 0 nan 6 nan
2000-01-08 00:00:00 7 0 nan 7 nan
2000-01-09 00:00:00 8 0 6.5 8 6.5
2000-01-10 00:00:00 9 0 7.5 9 7.5
2000-01-11 00:00:00 10 0 8.5 10 8.5
,

Rob 使用 df.groupby(df["signal"].cumsum()) 的回答很好。如果您的问题是剩余的 NaN,则可以通过了解 pd.rolling 函数轻松解决。请参阅docs here

听起来你想要一个无限的窗口大小,即使只有一个输入也能计算出来。因此,您只需要将 rolling(4) 替换为:

rolling(df.shape[0],min_periods=1)

其中 df.shape[0] 是数据帧中的条目数,以确保滚动窗口可以与数据帧的大小一样大。

(作为答案发布,因为我没有足够的声誉发表评论......)

本文链接:https://www.f2er.com/1486.html

大家都在问