#python #pandas
#python #pandas
Вопрос:
У меня есть фрейм данных сделки с тремя столбцами, и я отсортировал его по типу и дате, это выглядит так:
type date price
A 2020-05-01 4
A 2020-06-04 6
A 2020-06-08 8
A 2020-07-03 5
B 2020-02-01 3
B 2020-04-02 4
Существует много типов (A, B, C, D, E …), я хочу рассчитать предыдущую среднюю цену продукта того же типа. Например: значение pre_mean_price третьей строки A равно (4 6)/2=5. Я хочу получить такой фрейм данных:
type date price pre_mean_price
A 2020-05-01 4 .
A 2020-06-04 6 4
A 2020-06-08 8 5
A 2020-07-03 5 6
B 2020-02-01 3 .
B 2020-04-02 4 3
Как я могу вычислить pre_mean_price? Большое спасибо!
Ответ №1:
Вы можете использовать expanding().mean()
after groupby для каждой группы, затем сдвинуть значения.
df['pre_mean_price'] = df.groupby("type")['price'].apply(lambda x:
x.expanding().mean().shift())
print(df)
type date price pre_mean_price
0 A 2020-05-01 4 NaN
1 A 2020-06-04 6 4.0
2 A 2020-06-08 8 5.0
3 A 2020-07-03 5 6.0
4 B 2020-02-01 3 NaN
5 B 2020-04-02 4 3.0
Ответ №2:
Что-то вроде
df['pre_mean_price'] = df.groupby('type').expanding().mean().groupby('type').shift(1)['price'].values
который выдает
type date price pre_mean_price
0 A 2020-05-01 4 NaN
1 A 2020-06-04 6 4.0
2 A 2020-06-08 8 5.0
3 A 2020-07-03 5 6.0
4 B 2020-02-01 3 NaN
5 B 2020-04-02 4 3.0
Краткое объяснение
Идея состоит в том, чтобы
- Первая
"type"
группа с.groupby()
помощью . Это необходимо сделать, поскольку мы хотим вычислить (инкрементные) средние значения внутри группы «тип». - Затем вычислите инкрементное среднее значение с
expanding().mean()
помощью . Вывод в этой точке
price
type
A 0 4.00
1 5.00
2 6.00
3 5.75
B 4 3.00
5 3.50
- Затем снова сгруппируйте by
"type"
и сдвиньте элементы внутри групп на одну строку сshift(1)
помощью . - Затем просто извлеките значения
price
столбца (инкрементные средние) - Примечание: предполагается, что ваши данные отсортированы по дате. Это не так, позвоните
df.sort_values('date', inplace=True)
раньше.