首页 文章

熊猫移动平均值 - 下降负值?

提问于
浏览
1

所以在我的数据框中,我有一个名为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)

但这将包括负值,从而扭转移动平均线 . 是否有一个简单的修复我可以添加只使用正值?

编辑:添加更多行/预期输出

1 回答

  • 3

    我相信你可以使用像df [df> 0]这样的布尔数组用NaN替换负值 . 根据文档,大熊猫的方法将正确处理NaN: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
    

相关问题