使用 Polars 生成运行记录,其中一个月的期末余额将成为下个月的期初余额

2023-12-25

我想在给定初始期初余额的情况下生成一段时间内的运行计数模拟。例如,一个虚构的企业从 1000 美元开始,在任何一个月内都会经历随机的盈利和亏损。 12 个月后,这家企业可能会赚多少钱? 我的问题是,我可以生成所需的列,但无法弄清楚如何在不破坏当月数据的情况下将模拟计数延续到下个月。

我可以创建一个 Polars 数据框,并用所需的损益列填充该数据框,并生成期末余额。 使用堆叠的“with_columns()”,我为期初余额和期末余额创建了所需的列,然后生成一些随机利润和损失,然后更新期末余额。但我无法让这件事继续下去。

import polars as pl
import datetime as dt
from dateutil.relativedelta import relativedelta
start_date = dt.date.today() + relativedelta(months=1, day=1)
df = pl.DataFrame(
    pl.date_range(start_date, start_date + relativedelta(months=5), '1mo').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
2023-04-01  1000.0  909.61  72.97   163.36
2023-05-01  1000.0  1072.29     212.84  140.55
2023-06-01  1000.0  974.54  82.75   108.21
2023-07-01  1000.0  824.08  -60.69  115.23
2023-08-01  1000.0  940.71  155.6   214.89
2023-09-01  1000.0  994.5   94.23   99.73

请注意,第一个月的期末余额 (909.61) 并未转入下个月,下个月仍为 1000.00,因此不会发生运行计数。

我绝对可以使用循环(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
 shape: (6, 5)
date    beginning_balance   closing_balance     profit  loss
date    f64     f64     f64     f64
2023-04-01  1000.0  1063.13     115.49  52.36
2023-05-01  1063.13     1224.37     184.62  23.38
2023-06-01  1224.37     1258.02     114.68  81.03
2023-07-01  1258.02     1323.73     239.12  173.41
2023-08-01  1323.73     1341.33     102.18  84.58
2023-09-01  1341.33     1329.88     19.9    31.35

我该怎么做within Polars?


我认为替代解决方案更有效(因为.cumulative_eval多次进行大量添加):

开始数据框date和随机的profit and loss:

import polars as pl
import datetime as dt
from dateutil.relativedelta import relativedelta

num_months = 6
start_date = dt.date.today() + relativedelta(months=1, day=1)
df = pl.DataFrame().with_columns([
    pl.date_range(start_date, start_date + relativedelta(months=num_months - 1), '1mo').alias('date'),
    pl.Series([normalvariate(100, 80) for _ in range(num_months)]).round(2).alias('profit'),
    pl.Series([normalvariate(100, 75) for _ in range(num_months)]).round(2).alias('loss'),
])

基于列构建新列profit and loss:

beginning_balance = 1000.0
df = df.with_columns(
    (beginning_balance + (pl.col('profit') - pl.col('loss')).cumsum())
    .alias('closing_balance')
).with_columns(
    pl.col('closing_balance').shift_and_fill(1, beginning_balance)
    .alias('beginning_balance')
)

The tally通过使用计算.cumsum()关于之间的区别profit and loss.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Polars 生成运行记录,其中一个月的期末余额将成为下个月的期初余额 的相关文章

随机推荐

  • Android 应用程序正在安装两个启动器图标

    This is not的副本Android 应用程序创建两个启动器图标 https stackoverflow com questions 8697943 android application creating two launcher
  • 如何从我们的 Android 应用程序中删除其他应用程序缓存?

    我正在尝试开发一个可以删除其他应用程序缓存数据的Android应用程序 我尝试浏览所有博客 但没有一个对我有用 我可以通过以下代码清除我的应用程序的缓存 File cache getCacheDir File appDir new File
  • 用户警告的堆栈跟踪

    我在日志中看到这样的警告 py warnings init WARNING bs4 init py 219 UserWarning foo looks like a filename not markup You should probab
  • func 中返回空,golang 中返回值[重复]

    这个问题在这里已经有答案了 我正在阅读一些编写的代码Golang在Github上发现了一段非常有趣的代码 我把它简化得更清楚了 func Insert docs interface err error for i 0 i lt 3 i er
  • Android SDK-camera2-在TextureView上绘制矩形

    我是 android 开发的新手 我发现很难在camera2 api 上找到好的例子 我慢慢地解决了大多数问题 但在这个问题上我陷入了困境 在默认相机中 当您触摸屏幕进行对焦时 屏幕会短暂显示一个矩形的对焦区域 我想做类似的事情 或者在这种
  • 组合两个 foreach 循环

    我有两个 foreach 循环 第一个 foreach items as key gt item keywords explode qsvarus title key preg replace b implode keywords b lt
  • 使用 Pandas 读取 GPS RINEX 数据

    我正在阅读 RINEX 3 02 第 60 页 观测数据文件来进行一些基于时间的卫星 ID 过滤 并最终将在稍后重建它 这将使我能够更好地控制卫星的选择 随着时间的推移 我可以通过 RTK 后处理为位置解决方案做出贡献 不过 特别是对于这一
  • 当用户关闭 Chrome 时关闭 Native Host

    我正在开发一个使用 C 本机主机的 Chrome 扩展 在background js 脚本 持久设置为 false 中 我使用 chrome onstartup 事件创建与 C 主机的连接 我希望只要用户积极使用 Chrome 我的主机就能
  • 关闭QMainWindow的正确方法

    我最近从 tkinter 更改为 Pyqt5 因为我正在 Python 3 7 8 中开发一个半大型应用程序 每次我不得不关闭窗口时我都会使用该方法self destroy 并且有一个很小的机会 当我关闭所有程序并且没有窗口时 解释器仍在运
  • 如何设置可跨文本视图之间的边距?

    我正在尝试创建可扩展的文本视图并在 EditText 中显示它 因此 用户可以在 EditText 中输入一些内容 如果用户按下键盘的 Enter 按钮 那么我会将此文本转换为可跨文本视图 此用户可以再次开始输入并按键盘的 Enter 按钮
  • Lucene:从索引中删除,基于多个字段

    我需要从 lucene 搜索索引中删除文档 标准方法 indexReader deleteDocuments new Term field name field value 不会成功 我需要根据多个字段执行删除 我需要这样的东西 pseud
  • 如何仅向 NSDate 添加工作日?

    我有一个与 Objective C 中计算工作日相关的问题 我需要添加X给定的工作日NSDate 例如 如果我有一个约会 2010 年 10 月 22 日星期五 我添加2工作日 我应该得到 2010 年 10 月 26 日星期二 提前致谢
  • 如何在 Android 中从 ArrayList 填充的列表视图中选择多个项目

    我正在尝试编写一个程序来选择我填充的列表视图中的多个项目 但我很难选择多个项目 请让我知道该怎么做 下面是我填充数组列表的方式 并且我有一个带有复选框的自定义行 我需要在按钮单击事件上获取所选项目 名称 编号 先感谢您 我试图理解其他帖子
  • Laravel 子域路由不起作用

    我正在尝试拥有一个管理子域 像这样 https laravel com docs 5 1 routing route group sub domain routing Route group domain gt admin localhos
  • HikariCP 和 maxLifetime

    我将我的项目移至HikariCP https github com brettwooldridge HikariCP 到目前为止一切都很顺利 但在一种设置下我遇到了麻烦 这是 setMaxLifetime 30 1000 HikariCon
  • 使用资源中的几何图形的 WPF 自定义按钮

    有没有办法使用这样的 PathGeometry 集合 路径1 F1 中号 170 255 178 837L 170 255 221 158C 170 255 228 917 164 174 230 777 156 745 225 286L
  • 如何处理 AJAX 中的预期错误(包括向用户公开它们)

    预期错误是我在代码中预期甚至自己提出的来自服务器的错误 例如 当用户尝试执行他没有足够权限的操作时 我会提出PermissionError 一个习俗Exception 并带有描述错误的消息 我一直在寻找一种好方法来处理 AJAX 情况下的预
  • 如何以声明方式管理 Kafka 主题?

    我们正在使用 Apache Kafka 并且有很多手动创建的主题 使用自定义主题配置 我们希望像代码一样管理我们的主题 就像我们的基础设施 配置的其余部分一样 我们如何以编程方式和声明方式管理我们的主题 什么是理智的方法 以下是可能适合您正
  • Rails:PG :: UndefinedTable:错误:关系“...”不存在

    迁移时我收到以下错误消息 PG UndefinedTable ERROR relation actioncodes does not exist ALTER TABLE organizations ADD CONSTRAINT fk rai
  • 使用 Polars 生成运行记录,其中一个月的期末余额将成为下个月的期初余额

    我想在给定初始期初余额的情况下生成一段时间内的运行计数模拟 例如 一个虚构的企业从 1000 美元开始 在任何一个月内都会经历随机的盈利和亏损 12 个月后 这家企业可能会赚多少钱 我的问题是 我可以生成所需的列 但无法弄清楚如何在不破坏当