У меня есть фрейм данных pandas формы (2000,1), и я хотел бы вычислить средние значения прокатки, но также сохранить предыдущие значения как запаздывающую переменную.
Предполагая серию:
1
2
3
4
5
6
7
8
9
10
с скользящим окном 3 я бы хотел:
1,2,3,mean(4,5,6)
4,5,6,mean(7,8,9)
Я могу использовать функцию прокатки:
train_ds=train_ds.var1.rolling(3).mean()
но это не создает для меня указанную выше структуру, поскольку я не могу сложить предыдущие значения.
Я не уверен в ожидаемом результате, но вы можете преобразовать серию в фрейм данных с тремя столбцами, а затем получить среднее значение смещенных строк в четвертом столбце:
n = 3
df = pd.DataFrame(s.to_numpy()[: len(s) - len(s) % n].reshape(-1, n))
df["mean"] = df.agg("mean", axis=1).shift(-1)
0 1 2 mean
0 1 2 3 5.0
1 4 5 6 8.0
2 7 8 9 NaN
Или, если вам нужна серия строк в качестве результата:
s = df.astype(str).agg(", ".join, axis=1)
0 1, 2, 3, 5.0
1 4, 5, 6, 8.0
2 7, 8, 9, nan
@mozway Так выглядит лучше. Хорошее замечание по поводу shift
, спасибо!
спасибо @e-motta — не знаю, почему я не подумал изменить его форму. еще раз спасибо.
Возможное решение (mergesort
необходимо, чтобы гарантировать, что равные элементы сохраняют свое относительное положение):
N = 3 # number of elements in each group
idx = len(df) % N # to remove the last block with less than N elements
d = df[N:-idx]
# for each group of N elements, calculates the mean
d2 = (d.groupby( ((d.index % N) == 0).cumsum() )['var1'].mean()
# adjusts the indexes to have the positions where the means are to be
# inserted
.set_axis(d.index[d.index % N == N - 1] - N))
pd.concat([df[:-idx], d2]).sort_index(kind='mergesort')
Выход:
var1
0 1.0
1 2.0
2 3.0
2 5.0
3 4.0
4 5.0
5 6.0
5 8.0
6 7.0
7 8.0
8 9.0
Я бы выбрал
a = s.values[:len(s)//3*3].reshape(-1, 3) ; out = pd.DataFrame(a[:-1]) ; out['mean'] = a[1:].mean(axis=1)
, если вы продолжите смену, я бы предложилshift
послеmean
для эффективности;)