Как в 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