我有许多人的时间序列数据,其中上一个条目对下一个条目相当重要-但不足以单独作为下一个条目的预测变量。
因此,我想为每个条目执行此操作:
(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
答案 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