#python #pandas
Вопрос:
У меня есть пример, который мне нравится df = pd.DataFrame({'price': [100, 101, 99, 95, 97, 88], 'qty': [12, 5, 1, 3, 1, 3]})
. Я хочу рассчитать скользящее среднее значение 5 кол-во (цена * кол-во / кол-во), и желаемый результат таков 100, 101, 100.6, 97, 96.2, 91.2
.
У меня нет хорошего способа рассчитать это в настоящее время, к сожалению, у меня есть медленный способ, который приближается, который заключается в вычислении совокупной суммы кол — во, а затем df.qty_cumsum[(df.qty_cumsum<= x.qty_cumsum- 5)].argmax()
возвращает максимальный аргумент кол-во-5, затем я могу использовать это для расчета средневзвешенного значения на втором шаге.
Спасибо
Комментарии:
1. Я действительно не понимаю, о чем вы просите, в среднем за 5 кол -во.
2. таким образом, среднее значение первой строки, конечно, равно 100, потому что кол-во равно 12, вторая строка равна 101, третья строка равна (99 * 1 101 * 4)/5, четвертый ряд-это (3 * 95 99 * 1 101 * 1)/5, и так далее.
Ответ №1:
Один из вариантов-повторить price
, затем взять rolling
со строками и groupby
проиндексировать, взяв last
:
np.repeat(df['price'], df['qty']).rolling(5).mean().groupby(level=0).last()
Выход:
0 100.0
1 101.0
2 100.6
3 97.0
4 96.2
5 91.2
Name: price, dtype: float64
P.S. И если у вас большие qty
значения, также, вероятно, имеет смысл сделать его более эффективным, обрезав qty
до 5 (так как нет разницы, например, 5 или 12):
np.repeat(df['price'], np.clip(df['qty'], 0, 5)
).rolling(5).mean().groupby(level=0).last()