- 实际上您希望为每个
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