Каков самый быстрый способ расчета ежедневного баланса со сложными процентами в Pandas или Spark?Python

Программы на Python
Anonymous
Каков самый быстрый способ расчета ежедневного баланса со сложными процентами в Pandas или Spark?

Сообщение Anonymous »

У меня есть 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

Вернуться в «Python»