我正在尝试根据信号条件重置滚动平均值。从条件为真开始,应忽略先前的值。这可以通过用信号处的当前值替换先前值的历史记录来实现。
mmap
在此示例中,value2 是信号触发后应计算移动平均线的值,而 ma2 将是指数 2000-01-06 以后的预期结果。到 2000-01-05 为止,它应该保持原始的 'ma' 值。 (信号之前的值不应该受到影响)
我在 pandas rolling average with a rolling mask / excluding entries 处发现了一个类似的请求,它可能很有用,但我不知道如何将其应用到我的需要中。
答案 0 :(得分:0)
apply()
groupby()
groupby()
使用 信号 cumsum()
在您的示例中生成两个组。这假设信号 零很重要rolling(4)
将为每个滚动均值计算生成 3 个 NaNdf.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 |
答案 1 :(得分:0)
Rob 使用 df.groupby(df["signal"].cumsum())
的回答很好。如果您的问题是剩余的 NaN,则可以通过了解 pd.rolling
函数轻松解决。请参阅docs here。
听起来你想要一个无限的窗口大小,即使只有一个输入也能计算出来。因此,您只需要将 rolling(4)
替换为:
rolling(df.shape[0], min_periods=1)
其中 df.shape[0]
是数据帧中的条目数,以确保滚动窗口可以与数据帧的大小一样大。
(作为答案发布,因为我没有足够的声誉发表评论......)