#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()
того, как среднее значение должно исключить текущую строку.