Как в pandas без цикла подсчитать средневзвешенное значения для каждой строки по данным из столбцов (рекурсивно)?

Как в pandas без цикла подсчитать средневзвешенное значения для каждой строки по данным из столбцов (рекурсивно)?

   price  volume
0    0.1     100
1    0.5      50
2    0.3     200
3    0.4     400

По данным выше нужно отсортировать данные, далее для каждой строки таблиц рекурсивно подсчитать значение vwap. Правило подсчета приведены ниже.

Для первой строки vwap = подсчет по первой строке
Для второй строки vwap = подсчет по первой, второй строке
Для третьей строки vwap = подсчет по первой, второй и третьей строке. И т.д.

Ответы (1 шт):

Автор решения: Yuriy Tigiev

Два варианта решения. Первый на случай если нужно получить результат промежуточных вычислений.

import itertools as iter 
import pandas as pd

print('# Первый вариант') 
df = pd.DataFrame({'price':[0.1, 0.5, 0.3, 0.4], 'volume':[100,50,200,400] })

df = df.sort_values(['price'])
df['cost'] = df.volume * df.price
df['cost_cumsum'] = df['cost'].cumsum()
df['volume_cumsum'] = df['volume'].cumsum()
df['vwap_cumulative'] = df['cost_cumsum'] / df['volume_cumsum']
print(df)

print('# Второй вариант') 
df = pd.DataFrame({'price':[0.1, 0.5, 0.3, 0.4], 'volume':[100,50,200,400] })

df = df.sort_values(['price'])
df['vwap_cumulative'] = (df.volume * df.price).cumsum()/df.volume.cumsum()
print(df)

Результат

# Первый вариант
   price  volume   cost  cost_cumsum  volume_cumsum  vwap_cumulative
0    0.1     100   10.0         10.0            100         0.100000
2    0.3     200   60.0         70.0            300         0.233333
3    0.4     400  160.0        230.0            700         0.328571
1    0.5      50   25.0        255.0            750         0.340000
# Второй вариант
   price  volume  vwap_cumulative
0    0.1     100         0.100000
2    0.3     200         0.233333
3    0.4     400         0.328571
1    0.5      50         0.340000
→ Ссылка