如何编写有效的函数来计算给定时间段内不同帐户的平均期末余额

如何解决如何编写有效的函数来计算给定时间段内不同帐户的平均期末余额

我在金融机构工作。在交易表中,我们仅在客户交易时跟踪他们的余额。例如,如果客户在10月1日以200美元开设了一个帐户,然后在10月8日提取了50美元,那么他在交易表中将只有两个条目,一个条目为2020/10/01,另一个条目为2020/10/8。现在,这个问题的重点是期末余额。以此类推,如果我们使用今天作为截止日期,您将同意客户在7天(2020/10/8-2020/10/1)的期末余额为200美元,而在7天的期末余额为150美元。剩下的29天。

现在,我不确定如何编写此函数。我一直遇到错误,如果有人可以帮助我解决python代码和相应的注释,这对我来说是一种有效的学习经验,我将不胜感激。

这是我拥有的数据集的示例:

sample_df = pd.DataFrame({'ID': [15,16,15,17,16],'Calendar_Date': ['2020-10-10','2020-10-12','2020-10-22','2020-10-28','2020-10-30','2020-11-03','2020-11-04'],'Closing_Balance': [10000,3000,6000,5100,14500,25000,13000,9000]}) 

这是我期望的结果:

result_df = pd.DataFrame({'ID':[15,17],'Total_Days': [26,24,6],'Average_Account_Balance': [5823.08,6375.00,19000]})

为清楚起见:这就是我得出result_df的方式:

当ID = 15时,总天数 =(2 + 10 + 15)= 27; Average_Account_Balance =((10000 * 2)+(6000 * 10)+(5100 * 15))/ 27 = 156500/27 = 5796.3

当ID = 16时,总天数 =(16 + 7 + 2)= 25; Average_Account_Balance =((3000 * 16)+(14500 * 7)+(9000 * 2))/ 25 = 167500/25 = 6700.00

当ID = 17时,总天数 =(4 + 3)= 7;
Average_Account_Balance =((25000 * 4)+(13000 * 3))/ 7 = 139000/7 = 19857.14

我需要一种能够提高计算效率的解决方案,因为您可以猜测我们数据库中有多少笔交易。如果您对此处陈述或暗示的内容不清楚,请随时提出其他问题。谢谢!

解决方法

您可以将此问题分解为几个步骤。首先,我们需要在数据框中添加一些新列:

  1. 查找从每个日期到结束日期的天数(在您的示例中为今天)。
  2. "ID"的每组中,获取先前计算的列之间的差,以获取交易之间的天数。然后,我们使用fillna方法来填写剩余的日期差(例如,通过使用diff可以得到行之间的差,但是我们会错过{{ 1}}和今天的日期)。这为我们建立了适当的"ID"
  3. 计算加权余额列:只需将"days between transaction"“交易间隔天数”列乘以
"Closing_Balance" by the newly created 

现在我们已经创建了其他列,我们可以执行sample_df["days_from_today"] = (pd.to_datetime("11/06/2020").normalize() - sample_df["Calendar_Date"]).dt.days sample_df["days_between_transactions"] = (sample_df.groupby("ID")["days_from_today"] .diff(-1) .fillna(sample_df["days_from_today"]) .astype(int)) sample_df["weighted_balance"] = sample_df["Closing_Balance"] * sample_df["days_between_transactions"] print(sample_df) ID Calendar_Date Closing_Balance days_from_today days_between_transactions weighted_balance 0 15 2020-10-10 10000 27 2 20000 1 16 2020-10-12 3000 25 16 48000 2 15 2020-10-12 6000 25 10 60000 3 15 2020-10-22 5100 15 15 76500 4 16 2020-10-28 14500 9 7 101500 5 17 2020-10-30 25000 7 4 100000 6 17 2020-11-03 13000 3 3 39000 7 16 2020-11-04 9000 2 2 18000 操作来获得groupby -> aggregation列的sum并将其除以"weighted_balance"每个唯一的max

"days_from_today"
"ID"

我注意到我们的结果存在细微差异,我相信这可能是由于我们时区的差异(今天对我来说是11/6/2020,不确定您是什么时间/一天) “ total_days”可能有所不同。

此外,如果您的数据非常大,我建议使用aggregated_df = sample_df.groupby("ID").agg( weighted_total_account_balance=("weighted_balance","sum"),total_days=("days_from_today","max") ) aggregated_df["average_account_balance"] = aggregated_df["weighted_total_account_balance"] / aggregated_df["total_days"] print(aggregated_df) weighted_total_account_balance total_days average_account_balance ID 15 156500 27 5796.296296 16 167500 25 6700.000000 17 139000 7 19857.142857 进行算术运算。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res