Скользящее среднее значение с фильтрами — Python

#python #pandas #rolling-computation

Вопрос:

У меня есть база данных ( results ) результатов EPL за последние 28 лет, и я пытаюсь рассчитать среднее количество очков хозяев поля ( HPts ) в их предыдущих 5 домашних играх в текущем сезоне. Строки уже расположены в хронологическом порядке. Что я действительно ищу, так это версию исходного кода ниже, которая разбивает на разделы HomeTeam и Season и вычисляет среднее значение HPts использования окна из предыдущих 5 строк с совпадением HomeTeam и. Season Ясно, что существующий написанный код не делает того, что мне нужно (он выглядит только на последних 5 строках, независимо от команды и сезона), но просто показывает, что я имею в виду в качестве отправной точки.

              HomeTeam        AwayTeam Season Result  HPts  APts
0             Arsenal        Coventry   1993      A     0     3
1         Aston Villa             QPR   1993      H     3     0
2             Chelsea       Blackburn   1993      A     0     3
3           Liverpool  Sheffield Weds   1993      H     3     0
4            Man City           Leeds   1993      D     1     1
..                ...             ...    ...    ...   ...   ...
375         Liverpool  Crystal Palace   2020      H     3     0
376          Man City         Everton   2020      H     3     0
377  Sheffield United         Burnley   2020      H     3     0
378          West Ham     Southampton   2020      H     3     0
379            Wolves      Man United   2020      A     0     3

[10804 rows x 6 columns]

# Starting point for my code for home team avg points from last 5 home games
results['HomeLast5'] = results['HPts'].rolling(5).mean()
 

Кто-нибудь знает, как я могу добавить новую колонку с скользящими средними баллами для данной команды и сезона? Я, вероятно, мог бы придумать способ сделать это с помощью цикла, но я уверен, что это не будет самым эффективным способом решения этой проблемы.

Ответ №1:

Сгруппируйте фрейм данных по HomeTeam и Season , затем рассчитайте переход mean HPts . Затем, чтобы вернуть вычисленное среднее значение исходному фрейму данных, удалите уровни 0, 1 из индекса, чтобы выравнивание индекса работало правильно.

 g = results.groupby(['HomeTeam', 'Season'])['HPts']
results['HomeLast5'] = g.rolling(5).mean().droplevel([0, 1])
 

Комментарии:

1. Спасибо, когда я попытался это сделать, я сначала получил следующую ошибку: ValueError: cannot reindex from a duplicate axis . Это помогло мне заметить отдельную проблему в том, что я не сбросил индекс после объединения таблиц для создания своего фрейма данных — как только я reset_index() это сделал, все было в порядке. В любом случае, ваше предложение почти делает то, что мне нужно, но для дальнейшего исследования его нужно .shift() добавить после .mean() того, как среднее значение должно исключить текущую строку.