Pandas Groupby с расчетом EWM не работает, как ожидалось

1

Скажем, у меня есть dataframe, как показано ниже.

import pandas as pd

data = {'team': ['team1','team1','team1','team1','team1','team1','team1','team1','team1','team1','team1','team1','team1','team1',
              'team2','team2','team2','team2','team2','team2','team2','team2','team2','team2','team2','team2','team2','team2',],
     'score': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,1,2,3,4,5,6,7,8,9,10,11,12,13,14],
     'yards': [10,20,30,40,50,60,70,80,90,100,110,120,130,140,10,20,30,40,50,60,70,80,90,100,110,120,130,140]}

df = pd.DataFrame.from_dict(data)

Я пытаюсь вычислить ewm, используя этот ручной метод, найденный на этом посту, (ли Pandas вычисляет ewm неправильно?), Для столбцов "оценка" и "ярды", но я заметил, что мой диапазон не работает так, как это было запланировано для каждой сгруппированной команды. Это то, что у меня есть для моего кода

ema_features = df[['team']].copy()

for feature_name in df[['score','yards']]:
    span=10
    feature_ema = (df.groupby('team')[feature_name].rolling(window=span, min_periods=span).mean()[:span])
    rest = df[feature_name][span:]
    x = pd.concat([feature_ema, rest]).ewm(span=span, adjust=False).mean()


    ema_features[feature_name] = x

вывод этого выглядит следующим образом

ema_features

    team    score   yards
0   team1   NaN NaN
1   team1   NaN NaN
2   team1   NaN NaN
3   team1   NaN NaN
4   team1   NaN NaN
5   team1   NaN NaN
6   team1   NaN NaN
7   team1   NaN NaN
8   team1   NaN NaN
9   team1   NaN NaN
10  team1   6.500000    65.000000
11  team1   7.500000    75.000000
12  team1   8.500000    85.000000
13  team1   9.500000    95.000000
14  team2   7.954545    79.545455
15  team2   6.871901    68.719008
16  team2   6.167919    61.679189
17  team2   5.773752    57.737518
18  team2   5.633070    56.330696
19  team2   5.699784    56.997843
20  team2   5.936187    59.361871
21  team2   6.311426    63.114258
22  team2   6.800257    68.002575
23  team2   7.382029    73.820289
24  team2   8.039842    80.398418
25  team2   8.759871    87.598706
26  team2   9.530803    95.308032
27  team2   10.343384   103.433844

Мой вопрос заключается в том, как сделать свой диапазон применимым к команде 2? Вместо вышеназванного вывода, где команда 2 ewm рассчитывается с командой 1. Я бы хотел, чтобы каждая команда была выбрана отдельно друг от друга, что требует применения правильного диапазона, а затем рассчитывается, как и то, что я ожидаю ниже.

   ema_features

        team    score   yards
    0   team1   NaN NaN
    1   team1   NaN NaN
    2   team1   NaN NaN
    3   team1   NaN NaN
    4   team1   NaN NaN
    5   team1   NaN NaN
    6   team1   NaN NaN
    7   team1   NaN NaN
    8   team1   NaN NaN
    9   team1   NaN NaN
    10  team1   6.500000    65.000000
    11  team1   7.500000    75.000000
    12  team1   8.500000    85.000000
    13  team1   9.500000    95.000000
    14  team2   NaN NaN
    15  team2   NaN NaN
    16  team2   NaN NaN
    17  team2   NaN NaN
    18  team2   NaN NaN
    19  team2   NaN NaN
    20  team2   NaN NaN
    21  team2   NaN NaN
    22  team2   NaN NaN
    23  team2   6.500000    65.000000
    24  team2   7.500000    75.000000
    25  team2   8.500000    85.000000
    26  team2   9.500000    95.000000
  • 0
    Похоже, что вы используете только смещение из первой группы, поэтому он просто продолжает вычисление. Вам, вероятно, нужно рассчитать для каждой группы
  • 0
    Извините, я понимаю, что вы говорите, но не на 100%, так как я совсем новичок в использовании Groupby и Pandas в целом. Вы могли бы объяснить немного больше с кодом? Заранее спасибо.
Показать ещё 2 комментария
Теги:
pandas
pandas-groupby

1 ответ

2
Лучший ответ

Вы можете попробовать использовать GroupBy.apply с пользовательской функцией. Поэтому, адаптируя цикл for, попробуйте что-то вроде этого:

def team_ema(team, span=10):
    feature_ema = team.rolling(window=span, min_periods=span).mean()[:span]
    rest = team[span:]
    return pd.concat([feature_ema, rest]).ewm(span=span, adjust=False).mean()

df.groupby('team').apply(team_ema)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню