如何解决如何编写有效的函数来计算给定时间段内不同帐户的平均期末余额
我在金融机构工作。在交易表中,我们仅在客户交易时跟踪他们的余额。例如,如果客户在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
我需要一种能够提高计算效率的解决方案,因为您可以猜测我们数据库中有多少笔交易。如果您对此处陈述或暗示的内容不清楚,请随时提出其他问题。谢谢!
解决方法
您可以将此问题分解为几个步骤。首先,我们需要在数据框中添加一些新列:
- 查找从每个日期到结束日期的天数(在您的示例中为今天)。
- 在
"ID"
的每组中,获取先前计算的列之间的差,以获取交易之间的天数。然后,我们使用fillna
方法来填写剩余的日期差(例如,通过使用diff
可以得到行之间的差,但是我们会错过{{ 1}}和今天的日期)。这为我们建立了适当的"ID"
列 - 计算加权余额列:只需将
"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 举报,一经查实,本站将立刻删除。