Pandas 移动平均线 - 下降负值?

Pandas moving average - drop negative values?

所以在我的数据框中,我有一个名为 diff 的列,其中包含正值和负值。

date, id, diff, moving_avg
2017-01-01, 123, 5, 5
2017-01-02, 123, -3, 5
2017-01-03, 123, 4, (5+4)/2 = 4.5
2017-01-04, 123, 6, (4+6)/2 = 5
2017-01-05, 123, 3, (4+6+3)/3 = 4.33 

我目前将 3 天移动平均线计算为:

df['mov_avg_diff'] = df.groupby(['id'], as_index=False)[['diff']].rolling(
        3, min_periods=1).mean().fillna(0).reset_index(0, drop=True)

但这将包括负值,从而使移动平均线发生偏差。有没有我可以添加的简单修复程序以仅使用正值?

编辑:添加了更多 rows/expected 输出

我相信您可以使用像 df[df > 0] 这样的布尔数组将负值替换为 NaN。根据文档,NaN 将由 pandas' 方法正确处理:https://pandas.pydata.org/pandas-docs/stable/missing_data.html

输入(pandas_data.csv):

date,id,diff
2017-01-01,123,5
2017-01-02,123,-3
2017-01-03,123,4
2017-01-04,123,6
2017-01-05,123,3
2017-01-01,124,7
2017-01-02,124,1
2017-01-03,124,-4
2017-01-04,124,6
2017-01-05,124,2

代码:

import pandas as pd

df = pd.read_csv('pandas_data.csv', header=0)

df['mov_avg_diff'] = (
    df[df > 0]
    .groupby(['id'], as_index=False)['diff']
    .rolling(3, min_periods=1)
    .mean()
    .fillna(0)
    .reset_index(0, drop=True)).transpose()

结果:

df

         date   id  diff  mov_avg_diff
0  2017-01-01  123     5      5.000000
1  2017-01-02  123    -3      5.000000
2  2017-01-03  123     4      4.500000
3  2017-01-04  123     6      5.000000
4  2017-01-05  123     3      4.333333
5  2017-01-01  124     7      7.000000
6  2017-01-02  124     1      4.000000
7  2017-01-03  124    -4      4.000000
8  2017-01-04  124     6      3.500000
9  2017-01-05  124     2      4.000000