所以在我的数据框中,我有一个名为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)
但这将包括负值,从而扭转移动平均线。是否有一个简单的修复我可以添加只使用正值?
编辑:添加更多行/预期输出
答案 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