Отходя от моего вопроса здесь Я был перенаправлен в другой поток и смог манипулировать кодом, представленным в этом ответе, чтобы попасть туда, где я хочу быть. Сейчас я сталкиваюсь с одной проблемой, и меня немного смущает то, как она возникает.
Мой информационный фрейм по сути выглядит следующим образом:
Date HomeTeam AwayTeam HGoals AGoals HGRollA AGRollA
1/1 AAA BBB 4 2 2.67 1.67
Ссылка к более подробному изображению указанного кадра данных с некоторыми дополнительными столбцами.
В основном, каждая строка имеет:
- дату матча
- домашнюю и выездную команды
- голы, забитые в этот день домашними и выездными командами
- И 2 столбца, которые я добавил, в которых рассчитывается скользящее среднее количество голов, забитых хозяевами и гостями в последних 3 соответствующих матчах, НЕ включая текущий ряд. Таким образом, в приведенном выше примере команда ААА забила в среднем 2,67 мяча в последних 3 матчах (дома или в гостях), ДО того, чтобы обыграть команду ВВВ 4-2 в тот день.
Код, который я использовал для расчета скользящего среднего: следующим образом:
dfrollavg = (df[['HGoals','AGoals']]
.stack()
.groupby(df[['HomeTeam','AwayTeam']].stack().values)
.rolling(3, min_periods = 3).mean().shift(1)
.reset_index(level=0, drop=True)
.unstack()
.add_prefix('Avg_')
Это дает мне фрейм данных, содержащий только скользящие средние и никакой другой информации, поэтому я помещаю эти столбцы обратно в исходный фрейм данных, чтобы получить желаемый результат.
df['HGRollA'] = dfrollavg['Avg_HGoals'].round(2)
df['AGoalRA'] = dfrollavg['Avg_AGoals'].round(2)
Теперь вот две проблемы, которые вызывает у меня этот код.
shift (1) там, потому что я хочу, чтобы код скользящего среднего был последним 3 совпадения, НЕ последние 2 совпадения + текущая строка. Тем не менее, одна странная вещь, которая происходит , как вы можете видеть , заключается в том, что сдвиг приносит значения в первые 10 строк кадра данных, чего не должно происходить, и я не уверен, почему. Первые 30 строк или около того этого фрейма данных должны все рассчитываться как NaN, потому что не существует 3 уникальных наблюдений на группу до примерно этой точки. По какой-то причине, shift (1) помещает значения в первые 10 строк (но не в следующие 20). Если я изменю его на shift (0), это исчезнет ... но, конечно, скользящее среднее вычисляет не предыдущие 3 игры так, как я хочу, а вместо последних 2 + текущую строку.
У меня есть несколько сезонов в этом кадре данных. В начале нового сезона на датафрейме всегда будет 3 новые команды, для которых не было игр. Так что, если в первый день сезона 2011 года команда AAA играет команду CCC, а команда CCC не была в лиге в прошлом сезоне (2010 год, первый год набора данных), то команда CCC не должна была иметь скользящее среднее рассчитывается для них и должно быть NaN, пока в наборе данных не будет сыграно 3 игры. Команда ААА была в чемпионате в прошлом сезоне, поэтому для них было бы хорошо рассчитать скользящее среднее По какой-то причине мой код назначает команде CCC скользящее среднее значение сразу.
Если бы мне пришлось угадывать, я бы сказал, что это либо мой код, вычисляющий скользящее среднее значение, что-то не так, или, может быть, когда я вставлю этот код обратно в виде столбцов в исходном кадре данных?