2017-01-28 1 views
1

Я смотрю статистику годовой статистики бейсбола и хочу рассчитать скользящее среднее, оглядываясь назад на предыдущие 3 года работы по количеству хитов. Тем не менее, я хочу объяснить, что, хотя мой набор данных достигает более трех лет, один одиночный игрок может быть только в лиге на 1-2 года и не будет иметь 3-х летних наблюдений, из которых я могу вычислить среднее значение прокатки. Например:Как пользоваться скользящим средним Pandas без гарантированного количества наблюдений

In[6]: df = pd.DataFrame({'PLAYER_ID': ['A', 'A', 'A', 'B', 'B'], 
          'HITS': [45, 55, 50, 20, 24]}) 
In[9]: df 
Out[9]: 
    PLAYER_ID HITS 
0   A 45 
1   A 55 
2   A 50 
3   B 20 
4   B 24 

Как бы я использую GroupBy и агрегацию/преобразование (или какой-либо другой процесс), чтобы вычислить качению означает для каждого игрока с более 3 лет исторические итоги, а затем просто использовать максимальную доступную исторические наблюдения за игроком с историческими данными за период менее трех лет?

Довольно уверен, что мой ответ лежит в пакете Pandas, но будет интересоваться любым решением.

Спасибо!

+0

Вы уверены, что скользящее среднее на самом деле то, что вы хотите? Имея только один-три наблюдения за игроком, эти данные слишком скудны, чтобы среднее значение прокачки было особенно значимым. –

+0

Он был годовым для простоты объяснения. Я буду делать это на данных уровня игры вместе с некоторыми другими вещами. – Alt182

+0

Какова ваша [частота дискретизации] (http://pandas.pydata.org/pandas-docs/stable/timeseries.html#resampling)? –

ответ

1

pd.DataFrame.rolling обрабатывает эту проблему автоматически. Используя свои данные примера, df.groupby('PLAYER_ID').rolling(1).mean() даст вам:

   HITS PLAYER_ID 
PLAYER_ID 
A   0 45.0   A 
      1 55.0   A 
      2 50.0   A 
B   3 20.0   B 
      4 24.0   B 

Для примера случае я использую размер окна только 1, что означает, что мы лечим каждое отдельное наблюдение в качестве своего собственного среднего. Это не особенно интересно. С большим количеством данных вы можете использовать больший размер окна: например, если ваши данные еженедельно, rolling(5) даст вам примерно ежемесячный размер окна (или rolling(31), если ваши данные будут ежедневными, и так далее).

Два вопроса, чтобы быть в курсе при использовании этой методики:

  1. Если данные не пробы на регулярной основе (например, если он пропускает через неделю или месяц в то время), ваше скользящее среднее не будут выровнены по времени. По этой причине, если ваши данные уже не будут регулярно отбираться, вы, скорее всего, захотите их повторно сменить.
  2. Если ваши данные содержат значения NaN, они будут распространяться: каждое окно, содержащее это NaN, также будет NaN. Вам нужно будет impute those values как-то удержать это от происходящего.
+0

Не могу сказать, что это работает для меня. Когда я пытаюсь это сделать, я получаю атрибут AttributeError «Не могу получить доступ к атрибуту« перекатывание »объекта« DataFrameGroupby ». Я могу, однако, сделать это: ' В [24]: df_test.sort_values ​​(by = ['PLAYER_ID' , 'HITS'], восходящий = True, inplace = True) В [25]: df_test = df_test.groupby (['PLAYER_ID'], as_index = False) .agg ({'HITS': {'Rolling Avg HITS' : lambda x: x [-3:].значит,()}}) В работе [26]: df_test Из [26]: PLAYER_ID УДАРЯЕТ прокатный Средн УДАРЯЕТ 1 B 22' До тех пор, как его сортируют заранее не это делать то же самое ? – Alt182

+0

Какую версию 'pandas' вы используете? Объект 'roll' был введен сравнительно недавно, перед этим вместо этого вы будете использовать' roll_mean (1) ', поэтому попробуйте это. Что касается обходного пути: да, это может работать в этом конкретном экземпляре, но я не уверен, насколько хорошо он обобщил бы. –

+0

Pandas 0.18.0 Так может и быть. И еще раз спасибо за помощь. – Alt182

Смежные вопросы