Как сказал @Wen: вы можете рассчитывать mean_a
, используя функцию прокрутки:
df['mean_a'] = df['Price'].rolling(3).mean()
df['mean_b']
просто df['mean_a']
смещено на -2
df['mean_b'] = df['mean_a'].shift(-2)
Этовозвращает:
# Price mean_a mean_b
0 0 1.00 NaN 5.490000
1 1 12.23 NaN 9.380000
2 2 3.24 5.490000 55.296667
3 3 12.67 9.380000 60.876667
4 6 149.98 55.296667 684.396667
5 7 19.98 60.876667 635.066667
6 8 1883.23 684.396667 630.036667
7 9 1.99 635.066667 5.623333
8 10 4.89 630.036667 9.290000
9 11 9.99 5.623333 13.736667
10 12 12.99 9.290000 16.403333
11 13 18.23 13.736667 18.400000
12 14 17.99 16.403333 18.360000
13 15 18.98 18.400000 18.730000
14 16 18.11 18.360000 19.170000
15 17 19.10 18.730000 646.900000
16 18 20.30 19.170000 7397.200000
17 19 1901.30 646.900000 NaN
18 20 20270.00 7397.200000 NaN
РЕДАКТИРОВАТЬ:
Если вы хотите, чтобы некоторые значения не были NA, вам нужно использовать параметр min_periods
.Мы можем создать mean_a
по df['mean_a'] = df['Price'].rolling(3, min_periods = 1).mean()
, но теперь мы не можем создать mean_b
путем сдвига - я не мог придумать другого простого способа, кроме метода @ Wen для этого.(переворачивая серию price
подраздела, где df['mean_b']
равно na
:
df['mean_b'] = df['mean_a'].shift(-2)
df['mean_b'][df['mean_b'].isna()] = df['Price']df['mean_b'].isna()].iloc[::-1].rolling(3,min_periods =1).mean()
; но тогда это могло бы быть менее сложным, если бы мы просто перевернули всю серию в первую очередь.