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

时间:2017-12-18 16:12:49

标签: python pandas moving-average

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

答案 0 :(得分:3)

我相信你可以使用像df这样的布尔数组替换NaN的负值[df> 0]。根据文件,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