Используйте Groupby для расчета среднего, если Дата <X - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь использовать фрейм данных, который включает в себя историческую статистику игры, например, приведенный ниже df1, и создать второй фрейм данных, который показывает, как различные средние значения столбцов были в каждой игре (как я показываю в df2). Как я могу использовать grouby или что-то еще, чтобы найти различные средние значения для каждой команды , но только для игр, в которых есть дата, предшествующая дате в указанной строке c. Пример столбец исторических игр:

Df1    =     Date         Team      Opponent     Points     Points Against   1st Downs      Win?    
             4/16/20      Eagles    Ravens       10         20               10             0
             2/10/20      Eagles    Falcons      30         40               8              0
             12/15/19     Eagles    Cardinals    40         10               7              1
             11/15/19     Eagles    Giants       20         15               5              1
             10/12/19     Jets      Giants       10         18               2              1

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

Df2    =     Date         Team      Opponent     Avg Pts    Avg Pts Against  Avg 1st Downs      Win %   
             4/16/20      Eagles    Ravens       25.0       21.3             7.5                75%
             2/10/20      Eagles    Falcons      30.0       12.0             6.0                100%
             12/15/19     Eagles    Cardinals    20.0       15.0             5.0                100%
             11/15/19     Eagles    Giants       NaN        NaN              NaN                NaN               
             10/12/19     Jets      Giants       NaN        NaN              NaN                NaN

Дайте мне знать, если что-то выше неясно, оцените помощь.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Определите свою собственную функцию

def aggs_under_date(df, date):
    first_team = df.Team.iloc[0]
    first_opponent= df.Opponent.iloc[0]

    if df.date.iloc[0] <= date:
        avg_points = df.Points.mean()
        avg_againts = df['Points Against'].mean()
        avg_downs = df['1st Downs'].mean()
        win_perc = f'{win_perc.sum()/win_perc.count()*100} %'

        return [first_team, first_opponent, avg_points, avg_againts, avg_downs, win_perc]
    else:
        return [first_team, first_opponent, np.nan, np.nan, np.nan, np.nan]

И выполните groupby, применяя только что определенную вами функцию

 date_max = pd.to_datetime('11/15/19')
 Df1.groupby(['Date']).agg(aggs_under_date, date_max)
0 голосов
/ 17 апреля 2020

Самый простой способ - превратить ваш фрейм данных во временной ряд. Запустите это для файла:

data=pd.read_csv(r'C:\Users\...csv',index_col='Date',parse_dates=True)

Это пример с файлом CSV. Вы можете запустить это после:

data[:'#The Date you want to have all the dates before it']

Если вы хотите построить серию с индексированным временем:

index=pd.DatetimeIndex(['2014-07-04',...,'2015-08-04'])
data=pd.Series([0, 1, 2, 3], index=index)
...