Скользящее среднее, вычисляющее некоторые значения, не должно? - PullRequest
0 голосов
/ 25 апреля 2020

Отходя от моего вопроса здесь Я был перенаправлен в другой поток и смог манипулировать кодом, представленным в этом ответе, чтобы попасть туда, где я хочу быть. Сейчас я сталкиваюсь с одной проблемой, и меня немного смущает то, как она возникает.

Мой информационный фрейм по сути выглядит следующим образом:

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)

Теперь вот две проблемы, которые вызывает у меня этот код.

  1. shift (1) там, потому что я хочу, чтобы код скользящего среднего был последним 3 совпадения, НЕ последние 2 совпадения + текущая строка. Тем не менее, одна странная вещь, которая происходит , как вы можете видеть , заключается в том, что сдвиг приносит значения в первые 10 строк кадра данных, чего не должно происходить, и я не уверен, почему. Первые 30 строк или около того этого фрейма данных должны все рассчитываться как NaN, потому что не существует 3 уникальных наблюдений на группу до примерно этой точки. По какой-то причине, shift (1) помещает значения в первые 10 строк (но не в следующие 20). Если я изменю его на shift (0), это исчезнет ... но, конечно, скользящее среднее вычисляет не предыдущие 3 игры так, как я хочу, а вместо последних 2 + текущую строку.

  2. У меня есть несколько сезонов в этом кадре данных. В начале нового сезона на датафрейме всегда будет 3 новые команды, для которых не было игр. Так что, если в первый день сезона 2011 года команда AAA играет команду CCC, а команда CCC не была в лиге в прошлом сезоне (2010 год, первый год набора данных), то команда CCC не должна была иметь скользящее среднее рассчитывается для них и должно быть NaN, пока в наборе данных не будет сыграно 3 игры. Команда ААА была в чемпионате в прошлом сезоне, поэтому для них было бы хорошо рассчитать скользящее среднее По какой-то причине мой код назначает команде CCC скользящее среднее значение сразу.

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

...