最多X个值的平均值,又取最后一个值的平均值?

时间:2020-11-05 10:07:56

标签: python python-3.x pandas pandas-groupby

我有许多人的时间序列数据,其中上一个条目对下一个条目相当重要-但不足以单独作为下一个条目的预测变量。

因此,我想为每个条目执行此操作:

(1)计算同一个人中最多5个先前条目的平均值(例如,在我的df中,该条目可以更少)

(2)抓住同一个人的最后一个条目

(3)计算(1)和(2)的平均值(均等加权)作为我对下一项的预测值

我的数据如下:

df = pd.DataFrame({'date':[
    '01.01.2020','02.01.2020','03.01.2020','10.01.2020', 
    '01.01.2020','04.02.2020','20.02.2020','21.02.2020', 
    '01.02.2020','10.02.2020','20.02.2020','20.03.2020'],
    'user':[1,1,1,1,2,2,2,2,3,3,3,3],
    'days_until_next_event':[1,1,7,NaN,3,16,1,NaN,9,10,29,NaN]})

我想预测的列是'days_until_next_event',因此例如对于用户3,我将具有以下数据:1、9、10、29。计算公式为:((((1 + 9 + 10 + 29)/ 4)+ 29)/ 2,结果为20.625。

我很难安排好解决方案(初学者!)。.这就是我现在的位置:

def weightavg(df, group, num_avg):
  average = df.groupby('user').mean()
  latest = ? # Here I'd need to grab the value from the prior row?
  prediction = (average + latest) / 2 

用户1的预期输出:

date         user        days_until_next_event     predicted
01.01.2020   1           1                         NaN
02.01.2020   1           1                         1
03.01.2020   1           7                         1
10.01.2020   1           NaN                       5

最后一行的5将来自所有先前值(1 + 1 + 7)/ 3 = 3的平均值,并取自最后一个值7的平均值。因此:((((1 + 1 + 7)/ 3)+ 7)/ 2

1 个答案:

答案 0 :(得分:1)

我相信您需要每组Series.rolling,并向mean添加最后一个值,最后除以2

g = (df.assign(new = df['days_until_next_event'])
       .set_index(['date','days_until_next_event'])
       .groupby('user')['new']
       .rolling(5, min_periods=1))

df1 = (g.mean().add(g.apply(lambda x: x.iat[-1])).div(2)
        .groupby(level=0)
        .shift()
        .reset_index(name='predicted'))
    
print (df1)
    user        date  days_until_next_event  predicted
0      1  01.01.2020                    1.0        NaN
1      1  02.01.2020                    1.0   1.000000
2      1  03.01.2020                    7.0   1.000000
3      1  10.01.2020                    NaN   5.000000
4      2  01.01.2020                    3.0        NaN
5      2  04.02.2020                   16.0   3.000000
6      2  20.02.2020                    1.0  12.750000
7      2  21.02.2020                    NaN   3.833333
8      3  01.02.2020                    9.0        NaN
9      3  10.02.2020                   10.0   9.000000
10     3  20.02.2020                   29.0   9.750000
11     3  20.03.2020                    NaN  22.500000