Скользящая средняя по столбцу / году - питон, панды - PullRequest
0 голосов
/ 30 октября 2019

Мне нужно построить скользящее среднее по столбцу «total_medals» по стране [noc] за все предыдущие годы - мои данные выглядят так:

 medal     Bronze  Gold  Medal  Silver  **total_medals**
    noc year                                           
    ALG 1984     2.0   NaN    NaN     NaN           2.0
        1992     4.0   2.0    NaN     NaN           6.0
        1996     2.0   1.0            4.0           7.0
    ANZ 1984     2.0  15.0    NaN     2.0          19.0
        1992     3.0   5.0    NaN     2.0          10.0
        1996     1.0   2.0            2.0           5.0
    ARG 1984     2.0   6.0    NaN     3.0          11.0
        1992     5.0   3.0    NaN    24.0          32.0
        1992     3.0   7.0    NaN     5.0          15.0

Я хочу получить скользящее среднее по стране и году(т. е. для ALG: 1984 Avg (total_medals) = 2,0; 1992 Avg (total_medals) = (2,0 + 6,0) / 2 = 4,0; 1996 Acg (total_medals) = (2,0 + 6,0 + 7,0) / 3 = 5,0) - скользящее среднеедолжен появиться в новом столбце (рядом с total_medals).

Кроме того, для каждой комбинации страны и года в новом столбце под названием «эффективность» должна быть доля «total_medals», деленная на «скользящее среднее»

1 Ответ

1 голос
/ 30 октября 2019

Пример кадра данных :

print(df)

          medal  Bronze  Gold  Medal  Silver 
noc year                                     
ALG 1984    2.0     NaN   NaN    NaN     2.0 
    1992    4.0     2.0   NaN    NaN     6.0 
    1996    2.0     1.0   NaN    4.0     7.0 
ANZ 1984    2.0    15.0   NaN    2.0    19.0 
    1992    3.0     5.0   NaN    2.0    10.0 
    1996    1.0     2.0   NaN    2.0     5.0 
ARG 1984    2.0     6.0   NaN    3.0    11.0 
    1992    5.0     3.0   NaN   24.0    32.0 
    1992    3.0     7.0   NaN    5.0    15.0 

Использование DataFrame.groupby + expanding:

df['total_mean']=df.groupby(level=0,sort=False).Silver.apply(lambda x: x.expanding(1).mean())
print(df)

          medal  Bronze  Gold  Medal  Silver  total_medals 
noc year                                                 
ALG 1984    2.0     NaN   NaN    NaN     2.0    2.000000 
    1992    4.0     2.0   NaN    NaN     6.0    4.000000 
    1996    2.0     1.0   NaN    4.0     7.0    5.000000 
ANZ 1984    2.0    15.0   NaN    2.0    19.0   19.000000 
    1992    3.0     5.0   NaN    2.0    10.0   14.500000 
    1996    1.0     2.0   NaN    2.0     5.0   11.333333 
ARG 1984    2.0     6.0   NaN    3.0    11.0   11.000000 
    1992    5.0     3.0   NaN   24.0    32.0   21.500000 
    1992    3.0     7.0   NaN    5.0    15.0   19.333333 

bonze lagged

s=df.groupby('noc').apply(lambda x: x['Bronze']/x['total_medals'].shift())
s.index=s.index.droplevel()
df['bronze_lagged']=s

Вы можете создать функцию для этого ...

def lagged_medals(type_of_medal):
    s=df.groupby('noc').apply(lambda x: x[type_of_medal]/x['total_medals'].shift())
    s.index=s.index.droplevel()
    df[f'{type_of_medal}_lagged']=s

lagged_medals('Silver')
#print(df)
...