Найти скользящее среднее, равное - PullRequest
3 голосов
/ 07 февраля 2020

Допустим, у меня есть некоторые данные, связанные с футболом

Date   Home     Away  HomeGoal AwayGoal TotalGoal
2019   Arsenal  MU     5        1        6
2019   MCity    Liv    2        2        4
2019   MU       Liv    3        4        7
2019   MCity    MU     0        0        0

Я хочу создать столбец данных, который показывает средние цели этой команды в последних 2 играх. Например, в последнем ряду я хочу включить столбец, который показывает среднюю цель MU в последних двух играх, которая = (1 + 3) / 2 = 2.

Есть ли какие-либо функции в python может этого добиться?

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

По вашему требованию вас не волнует, находится ли команда дома или в гостях, только сколько голов она забила за матч. Попробуйте это:

# Rename the columns to make the unstacking operation a bit easier
# Always a good idea to specify an explicit `copy` when you intend
# to change the dataframe structure
>>> tmp = df[['Home', 'Away', 'HomeGoal', 'AwayGoal']].copy()

# Arrange the columns into a MultiIndex to make stacking easier
>>> tmp.columns = pd.MultiIndex.from_product([['Team', 'Goal'], ['Home', 'Away']])

# This is what `tmp` look like:

           Team      Goal     
      Home Away Home Away
0  Arsenal   MU    5    1
1    MCity  Liv    2    2
2       MU  Liv    3    4
3    MCity   MU    0    0

# And now the magic
>>> tmp.stack() \
        .groupby('Team').rolling(2).mean() \
        .groupby('Team').tail(1) \
        .droplevel([1,2])

# Result
         Goal
Team         
Arsenal   NaN
Liv       3.0
MCity     1.0
MU        1.5

Вот как это работает:

  • stack unpivots Home и Away, так что для каждого совпадения у нас есть 2 строки для Teams и Goal
  • groupby('Team').rolling(2).mean() получает скользящее среднее количество голов, забитых за последние 2 игры в команде
  • groupby('Team').tail(1) получает последнее из этих скользящих средних для команды
  • К этому времени переходный информационный фрейм имеет 3 уровня в своем индексе: название команды, номер матча и индикатор «домой / в гостях» последней сыгранной игры. Мы заботимся только о первом, поэтому мы отбросим остальные 2.
1 голос
/ 07 февраля 2020

Попробуйте следующим образом:

Разделите на два кадра данных в соответствии с их Home и Away Целями

df1=df[['Date','Home','HomeGoal']]
df2 = df[['Date','Away','AwayGoal']]

all_dfs=[df1,df2]

Назовите столбцы

for dfs in all_dfs:
    dfs.columns = ['Date','Team', 'Goal']

Сконцентрируйте два ДФС вместе

new_df=pd.concat(all_dfs,ignore_index=True).reset_index(drop=True)

результат:

Date       Team    Goal
0   2019    Arsenal 5
1   2019    Mcity   2
2   2019    MU      3
3   2019    Mcity   0
4   2019    MU      1
5   2019    Liv     2
6   2019    Liv     4
7   2019    MU      0

Среднее за последние две игры:

new_df[new_df['Team'] == 'MU'].sort_values('Date')['Goal'][:2].sum()/2

Общее количество голов в команде как в выездном, так и в домашнем матчах

new_df.groupby('Team')['Goal'].sum() 

Выход:

Team
Arsenal    5
Liv        6
MU         4
Mcity      2

...