Вычислить скользящую сумму, сдвинутую для каждой группы - PullRequest
0 голосов
/ 12 января 2019

Моя цель - выполнить групповую игру, затем создать скользящую общую статистику и затем сдвинуться. Мне нужно, чтобы перенести первый экземпляр каждого уникального игрока. Прямо сейчас он сдвигает весь фрейм данных один раз, а не делает это для каждого сгруппированного игрока.

Исходные данные -

    player   date          won
0   A        2016-01-11    0
1   A        2016-02-01    0
2   A        2016-02-01    1
3   A        2016-02-01    1
4   A        2016-10-24    0
5   A        2016-10-31    0
6   A        2018-10-22    0
7   B        2016-10-24    0
8   B        2016-10-24    1
9   B        2017-11-13    0  

Вещи, которые я пробовал -

1

temp = temp_master.groupby('player', sort=False)[count_fields].rolling(10, min_periods=1).sum().shift(1).reset_index(drop=True)    
temp = temp.add_suffix('_total')   
temp['won_total'].head(10)  
 0    NaN
 1    0.0
 2    0.0
 3    1.0
 4    2.0
 5    2.0
 6    2.0
 7    2.0
 8    0.0
 9    1.0

2

temp = temp_master.groupby('player', sort=False)[count_fields].shift(1).rolling(10, min_periods=1).sum().reset_index(drop=True) 
temp = temp.add_suffix('_total') 
temp['won_total'].head(10)
0    NaN
1    0.0
2    0.0
3    1.0
4    2.0
5    2.0
6    2.0
7    2.0
8    2.0
9    3.0 

3

temp = temp_master.groupby('player', sort=False)[count_fields].rolling(10, min_periods=1).sum().reset_index(drop=True)    
temp = temp.add_suffix('_total')
temp = temp.shift(1)  
temp['won_total'].head(10)  
0    NaN
1    0.0
2    0.0
3    1.0
4    2.0
5    2.0
6    2.0
7    2.0
8    0.0
9    1.0

Это то, что мне нужно, чтобы результаты были -

0    NaN
1    0.0
2    0.0
3    1.0
4    2.0
5    2.0
6    2.0
7    NaN
8    0.0
9    1.0

индекс # 7 должен равняться NaN. Это должен быть первый экземпляр игрока B, и я хочу, чтобы он перемещался в первом экземпляре каждого нового игрока, чтобы суммировать статистику игрока.

индекс 8 должен быть равен 0

индекс 9 должен равняться 1

Похоже, что попытки № 1 и № 3 близки, но это не назначает значение NaN для нового игрока. № 3 больше не играет сгруппированным игроком, поэтому я знаю, что это не сработает.

Кроме того, это будет сделано для большого количества данных (около 100K-300K строк), а столбец 'count_fields' содержит около 3K-4K столбцов, которые я вычисляю. Просто что-то, о чем нужно знать.

Какие-нибудь идеи о том, как создать статистику бега по игроку и сдвинуть вниз для каждого игрока?

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Другой вариант, если вы не хотите использовать apply, это наложить второй вызов groupby и выполнить сдвиг:

(df.groupby('player', sort=False)
   .won.rolling(10, min_periods=1)
   .sum()
   .groupby(level=0)
   .shift()
   .reset_index(drop=True))

0    NaN
1    0.0
2    0.0
3    1.0
4    2.0
5    2.0
6    2.0
7    NaN
8    0.0
9    1.0
Name: won, dtype: float64
0 голосов
/ 12 января 2019

Вам нужно apply здесь, эти две функции не являются цепями под объектом groupby, сумма находится под groupby, но shift будет реализована в результате после суммы, которая является целыми столбцами

temp = temp_master.groupby('player', sort=False)['won'].apply(lambda x : x.rolling(10, min_periods=1).sum().shift(1))\
    .reset_index(drop=True)    
temp
0    NaN
1    0.0
2    0.0
3    1.0
4    2.0
5    2.0
6    2.0
7    NaN
8    0.0
9    1.0
Name: won, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...