如何在Python return中嵌入if-else,复现SQL 30/360计息CASE WHEN逻辑?
30/360计息基准下的应计利息Python函数实现
需求背景
要把SQL中30/360计息基准的日期处理逻辑整合到现有Python函数中:
- 报表日(ReportDate)日数>30时取30,否则取当日数值
- 起始日(StartDate)日数>30时取30,否则取当日数值
同时保持原函数if/elif/else搭配return的结构,在return内部用三元表达式复现SQL的CASE WHEN逻辑。
对应的SQL核心日期处理片段:
+ CASE WHEN DAY(ReportDate) > 30 THEN 30 ELSE DAY(ReportDate) END - CASE WHEN DAY(StartDate) > 30 THEN 30 ELSE DAY(StartDate) END
修改后的完整函数
# Accrued Calc for 30/360 Basis def accrued_30_360(row): # 应用30/360规则处理日数 report_day = 30 if Settlement.day > 30 else Settlement.day start_day = 30 if row['Start Date DAY'] > 30 else row['Start Date DAY'] # 计算计息天数占比(30/360基准) days_ratio = (360 * (Settlement.year - row['Start Date YEAR']) + 30 * (Settlement.month - row['Start Date MONTH']) + report_day - start_day) / 360 if row['Type'] == 'L' and row['Current Filter'] == 'Current CF': return 1 * row['Principal/GrossAmount'] * (row['All in Rate'] / 100) * days_ratio elif row['Type'] == 'D': return -1 * row['Principal/GrossAmount'] * (row['All in Rate'] / 100) * days_ratio else: return ''
关键点说明
- 日期规则映射:用Python三元表达式直接对应SQL的
CASE WHEN,逻辑完全一致,写法简洁。 - 代码冗余优化:把重复的计息天数计算抽成变量
days_ratio,避免两处return语句里写重复代码,同时修正了原函数中未闭合的括号问题。 - 逻辑对齐SQL:严格按照SQL公式实现计息天数计算,保证结果和SQL输出一致。
内容的提问来源于stack exchange,提问作者Raj Das
相关产品推荐
相关产品推荐

