Как эффективно рассчитать среднее значение всех последующих строк в пандах? - PullRequest
1 голос
/ 23 октября 2019

Для данного кадра данных, который выглядит примерно так:

date,score
2019-10-01,5
2019-10-02,4
2019-10-03,3
2019-10-04,6

Как мне рассчитать среднее значение score, используя последующие / следующие строки, чтобы он выглядел / вел себя так:

date,score
2019-10-01,5,(5+4+3+6)/4
2019-10-02,4,(4+3+6)/3
2019-10-03,3,(3+6)/2
2019-10-04,6,6

Это очень просто в SQL, где я пытаюсь перевести это, где в SQL я могу написать:

select avg(score) over(order by date) ...

Но явозникли проблемы с попыткой выяснить это в пандах.

Любое руководство будет с благодарностью.

Спасибо!

Ответы [ 3 ]

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

Используйте cumsum снизу вверх и делите на arange

df['cummean'] = df.score[::-1].cumsum()[::-1] / np.arange(len(df), 0, -1)

         date  score   cummean
0  2019-10-01      5  4.500000
1  2019-10-02      4  4.333333
2  2019-10-03      3  4.500000
3  2019-10-04      6  6.000000
1 голос
/ 23 октября 2019

Попробуйте expanding на обратной серии

df['calc_mean'] = df.score[::-1].expanding(1).mean()

Out[228]:
         date  score  calc_mean
0  2019-10-01      5   4.500000
1  2019-10-02      4   4.333333
2  2019-10-03      3   4.500000
3  2019-10-04      6   6.000000
0 голосов
/ 23 октября 2019

cumsum на обратной серии:

df['cum_mean'] = (df[::-1].assign(c=1)
                    .agg({'score':'cumsum', 'c':'cumsum'})
                    .assign(cum_mean = lambda x: x['score']/x['c'])
                    ['cum_mean']
                 )

Выход:

         date  score  cum_mean
0  2019-10-01      5  4.500000
1  2019-10-02      4  4.333333
2  2019-10-03      3  4.500000
3  2019-10-04      6  6.000000
...