У меня есть DataFrame (DF) с депозитами и снятием средств, агрегированными по дням, и я хочу знать, как быстрее всего рассчитать баланс за каждый день. Потому что он должен иметь возможность масштабироваться. Ответы как в Pandas, так и в Spark приветствуются! Вот пример того, как выглядит входной DF:
Ввод
дата
депозитвывод
2024- 01-01
100,00
0,00
2024-01-02
0,00
0,00
03.01.2024
50.00
30.00
04.01.2024
0,00
0,00
05.01.2024
0,00
200,00
06.01.2024
20.00
0,00
07.01.2024
20.000,00
08.01.2024
0,00
0,00
Эти депозиты и снятие средств осуществляются с инвестиционного счета, который приносит 10% в день. Если баланс не отрицательный. В этом случае ежедневная доходность должна быть равна нулю. Расчеты псевдокода для получения столбцов daily_return и баланса:
Движения = Баланс предыдущего дня + Депозит – Снятие
Процент = 0,1, если Движение > 0, иначе 0
Дневной доход = Движение * Процент
Баланс = Движения + Ежедневная доходность
И ниже приведен пример желаемого выходного DF:
Желаемый результат
дата
депозит
вывод
daily_returnбаланс
2024- 01-01
100,00
0,00
10,00
110,00
02.01.2024
0,00
0,00
11,00
121,00
03.01.2024
50.00
30.00
14.10
155.10
04.01.2024
0,00
0,00
15,51
170,61
05.01.2024
0,00
200,00
0,00
-29,39
06.01.2024< /td>
20,00
0,00
0,00
-9,39
07.01.2024
20.00
< td>0,00
1,06
11,67
2024-01-08
0,00
0,00
1,17
12,84
Что я есть
У меня есть решение в Pandas, которое достигает желаемого результата, однако оно перебирает каждую строку DF, т.е. оно медленное. Есть ли способ векторизовать этот расчет, чтобы ускорить его? Или, может быть, другой подход? Вот моя реализация:
import pandas as pd
df = pd.DataFrame({
"date": pd.date_range(start="2024-01-01", end="2024-01-08"),
"deposit": [100.0, 0.0, 50.0, 0.0, 0.0, 20.0, 20.0, 0.0],
"withdrawal": [0.0, 0.0, 30.0, 0.0, 200.0, 0.0, 0.0, 0.0]
})
daily_returns = []
balances = []
prev_balance = 0
for _, row in df.iterrows():
movements = prev_balance + row["deposit"] - row["withdrawal"]
interest = 0.1 if movements > 0 else 0
daily_return = movements * interest
balance = movements + daily_return
daily_returns.append(daily_return)
balances.append(balance)
prev_balance = balance
df["daily_return"] = daily_returns
df["balance"] = balances
Подробнее здесь: https://stackoverflow.com/questions/786 ... erest-in-p