более быстрый способ расчета средневзвешенного значения на основе смещения качения

#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()