Моя проблема в том, что я могу создать необходимые столбцы, но не могу понять, как перенести смоделированные подсчеты на следующий месяц, не затирая данные за текущий месяц.
Я могу создать фрейм данных Polars, заполнить его необходимыми столбцами прибылей и убытков и сгенерировать конечный баланс.
Используя сложную функцию with_columns(), я создал необходимые столбцы для начальный и конечный балансы, а затем генерировать случайные прибыли и убытки, а затем обновлять конечный баланс. Но я не могу продолжить это дело.
Код: Выделить всё
import polars as pl
import datetime as dt
from dateutil.relativedelta import relativedelta
from random import normalvariate
start_date = dt.date.today() + relativedelta(months=1, day=1)
df = pl.DataFrame(
pl.date_range(start_date, start_date + relativedelta(months=5), '1mo', eager=True).alias('date'),
)
beginning_balance = 1000.0
df = df.with_columns(
pl.lit(beginning_balance).alias('beginning_balance'),
pl.lit(beginning_balance).alias('closing_balance'),
).with_columns(
pl.when(pl.col('date') == start_date)
.then(pl.col('beginning_balance'))
.otherwise(pl.col('closing_balance').shift(1))
.alias('beginning_balance'),
pl.Series([normalvariate(100, 80) for _ in range(len(df))]).round(2).alias('profit'),
pl.Series([normalvariate(100, 75) for _ in range(len(df))]).round(2).alias('loss'),
).with_columns(
(pl.col('beginning_balance') + pl.col('profit') - pl.col('loss')).alias('closing_balance'),
)
df
Код: Выделить всё
shape: (6, 5)
┌────────────┬───────────────────┬─────────────────┬────────┬────────┐
│ date ┆ beginning_balance ┆ closing_balance ┆ profit ┆ loss │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ date ┆ f64 ┆ f64 ┆ f64 ┆ f64 │
╞════════════╪═══════════════════╪═════════════════╪════════╪════════╡
│ 2024-11-01 ┆ 1000.0 ┆ 934.95 ┆ -58.53 ┆ 6.52 │
│ 2024-12-01 ┆ 1000.0 ┆ 903.15 ┆ 69.02 ┆ 165.87 │
│ 2025-01-01 ┆ 1000.0 ┆ 1007.71 ┆ 111.21 ┆ 103.5 │
│ 2025-02-01 ┆ 1000.0 ┆ 1011.97 ┆ 209.43 ┆ 197.46 │
│ 2025-03-01 ┆ 1000.0 ┆ 998.85 ┆ 32.22 ┆ 33.37 │
│ 2025-04-01 ┆ 1000.0 ┆ 1151.32 ┆ 277.49 ┆ 126.17 │
└────────────┴───────────────────┴─────────────────┴────────┴────────┘
Я определенно могу использовать цикл (for или while) для обхода каждой строки, но это мешает оптимизации и распараллеливанию Polars. Следующее будет работать, но гораздо медленнее (особенно, когда я запускаю множество симуляций с гораздо более подробными расчетами).
Код: Выделить всё
current_tally = beginning_balance
for t in range(len(df)):
beginning_balance = current_tally
current_tally = beginning_balance + df[t, 'profit'] - df[t, 'loss']
df[t, 'beginning_balance'] = beginning_balance
df[t, 'closing_balance'] = current_tally
df
Код: Выделить всё
┌────────────┬───────────────────┬─────────────────┬────────┬────────┐
│ date ┆ beginning_balance ┆ closing_balance ┆ profit ┆ loss │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ date ┆ f64 ┆ f64 ┆ f64 ┆ f64 │
╞════════════╪═══════════════════╪═════════════════╪════════╪════════╡
│ 2024-11-01 ┆ 1000.0 ┆ 934.95 ┆ -58.53 ┆ 6.52 │
│ 2024-12-01 ┆ 934.95 ┆ 838.1 ┆ 69.02 ┆ 165.87 │
│ 2025-01-01 ┆ 838.1 ┆ 845.81 ┆ 111.21 ┆ 103.5 │
│ 2025-02-01 ┆ 845.81 ┆ 857.78 ┆ 209.43 ┆ 197.46 │
│ 2025-03-01 ┆ 857.78 ┆ 856.63 ┆ 32.22 ┆ 33.37 │
│ 2025-04-01 ┆ 856.63 ┆ 1007.95 ┆ 277.49 ┆ 126.17 │
└────────────┴───────────────────┴─────────────────┴────────┴────────┘
Подробнее здесь: https://stackoverflow.com/questions/757 ... th-becomes