У меня есть фрейм данных со следующей структурой:
date player_id win
1 2018-08-01 1 0
2 2018-08-01 2 1
13 2018-08-01 2 1
37 2018-08-01 2 1
46 2018-08-01 1 0
54 2018-08-01 2 0
2074 2018-08-04 2 0
2082 2018-08-04 1 0
2093 2018-08-04 2 0
2094 2018-08-04 2 0
2109 2018-08-04 1 0
2118 2018-08-04 2 0
4419 2018-08-06 2 0
4427 2018-08-06 2 0
4492 2018-08-06 2 0
13361 2018-08-18 2 0
13375 2018-08-18 2 0
13395 2018-08-18 2 1
13412 2018-08-18 2 0
23963 2018-09-01 2 0
23976 2018-09-01 2 0
23988 2018-09-01 2 0
24001 2018-09-01 2 0
32695 2018-09-12 1 1
35355 2018-09-15 2 0
35361 2018-09-15 2 0
Мне нужно иметь возможность получить скользящую N-дневную сумму столбца выигрыша для каждого player_id.
Пока что яЯ посмотрел ответ здесь и попытался изменить его в соответствии с моими потребностями.
скользящая сумма панд за последние пять минут
foo = pd.DataFrame( {'date': {1: '2018-08-01', 2: '2018-08-01', 13: '2018-08-01', 37: '2018-08-01', 46: '2018-08-01', 54: '2018-08-01', 2074: '2018-08-04', 2082: '2018-08-04', 2093: '2018-08-04', 2094: '2018-08-04', 2109: '2018-08-04', 2118: '2018-08-04', 4419: '2018-08-06', 4427: '2018-08-06', 4492: '2018-08-06', 13361: '2018-08-18', 13375: '2018-08-18', 13395: '2018-08-18', 13412: '2018-08-18', 23963: '2018-09-01', 23976: '2018-09-01', 23988: '2018-09-01', 24001: '2018-09-01', 32695: '2018-09-12', 35355: '2018-09-15', 35361: '2018-09-15'}, 'player_id': {1: 10946, 2: 24223, 13: 24223, 37: 24223, 46: 10946, 54: 24223, 2074: 24223, 2082: 10946, 2093: 24223, 2094: 24223, 2109: 10946, 2118: 24223, 4419: 24223, 4427: 24223, 4492: 24223, 13361: 24223, 13375: 24223, 13395: 24223, 13412: 24223, 23963: 24223, 23976: 24223, 23988: 24223, 24001: 24223, 32695: 10946, 35355: 24223, 35361: 24223}, 'win': {1: 0, 2: 1, 13: 1, 37: 1, 46: 0, 54: 0, 2074: 0, 2082: 0, 2093: 0, 2094: 0, 2109: 0, 2118: 0, 4419: 0, 4427: 0, 4492: 0, 13361: 0, 13375: 0, 13395: 1, 13412: 0, 23963: 0, 23976: 0, 23988: 0, 24001: 0, 32695: 1, 35355: 0, 35361: 0}} )
foo
foo['date'] = pd.to_datetime(foo['date'])
foo['end_index'] = np.arange(len(foo))
start_dates = foo['date'] - pd.Timedelta(days=30)
foo['start_index'] = foo['date'].values.searchsorted(start_dates, side='right')
bar = foo[foo['player_id'] == 2]
def sum_window(row):
return bar['win'].iloc[row['start_index']:row['end_index']+1].sum()
bar['rolling_wins'] = bar.apply(sum_window, axis=1)
bar['rolling_wins'] = bar.groupby('player_id')['rolling_wins'].shift(1)
bar
, что дает
date player_id win end_index start_index rolling_wins
2 2018-08-01 2 1 1 0 NaN
13 2018-08-01 2 1 2 0 2.0
37 2018-08-01 2 1 3 0 3.0
54 2018-08-01 2 0 5 0 3.0
2074 2018-08-04 2 0 6 0 3.0
2093 2018-08-04 2 0 8 0 3.0
2094 2018-08-04 2 0 9 0 3.0
2118 2018-08-04 2 0 11 0 3.0
4419 2018-08-06 2 0 12 0 3.0
4427 2018-08-06 2 0 13 0 3.0
4492 2018-08-06 2 0 14 0 4.0
13361 2018-08-18 2 0 15 0 4.0
13375 2018-08-18 2 0 16 0 4.0
13395 2018-08-18 2 1 17 0 4.0
13412 2018-08-18 2 0 18 0 4.0
23963 2018-09-01 2 0 19 6 4.0
23976 2018-09-01 2 0 20 6 1.0
23988 2018-09-01 2 0 21 6 1.0
24001 2018-09-01 2 0 22 6 1.0
35355 2018-09-15 2 0 24 15 1.0
35361 2018-09-15 2 0 25 15 0.0
Это хорошо работает и дает скользящие суммы всего за bar
.Мне нужно добавить столбец для подсчета количества подвижных игр N *. 1017 *
Кроме того, мне нужно обернуть все это в красивую аккуратную функцию, чтобы я мог запустить foo.groupby('player_id').apply(func)
Я пыталсяэтот подход выше, но столкнулся с проблемами с ним.Я думаю, что скорость будет проблемой, так как набор данных, который мне нужен для этого, содержит тысячи игроков и сотни тысяч игр.
Любые предложения / помощь приветствуются и приветствуются.
ВидС уважением,
Люк