Python固定利率抵押贷款计算器:如何接入用户输入并输出还款表
固定利率抵押贷款计算器输入改造方案
核心逻辑
不需要修改原有还款计算的核心代码,仅需将硬编码的参数替换为input获取的用户输入值即可,同时可以补充简单的输入合法性校验避免程序崩溃。
完整可运行代码
import pandas as pd import numpy_financial as npf from datetime import date # ------------ 以下为用户输入获取部分 ------------ # 贷款金额 while True: try: mortgage = float(input("请输入贷款总额(元):\n")) if mortgage <= 0: print("贷款金额必须大于0,请重新输入") continue break except ValueError: print("输入格式错误,请输入数字") # 年利率 while True: try: interest_input = float(input("请输入贷款年利率(如2.5代表年化2.5%):\n")) interest = interest_input / 100 if interest < 0: print("利率不能为负,请重新输入") continue break except ValueError: print("输入格式错误,请输入数字") # 贷款年限 while True: try: years = int(input("请输入贷款年限(年):\n")) if years <= 0: print("贷款年限必须大于0,请重新输入") continue break except ValueError: print("输入格式错误,请输入整数") # 每年还款次数(默认按月还款即12次,可根据需求改成用户输入) payments_year = 12 # 还款起始日期 while True: try: start_date_str = input("请输入还款起始日期,格式为YYYY-MM-DD:\n") year, month, day = map(int, start_date_str.split("-")) start_date = date(year, month, day) break except ValueError: print("日期格式错误,请按照要求重新输入") # ------------ 以下为原有计算逻辑(仅修正了一处笔误) ------------ rng = pd.date_range(start_date, periods=years * payments_year, freq='MS') rng.name = "Payment Date" df = pd.DataFrame(index=rng, columns=['Payment', 'Principal Paid', 'Interest Paid', 'Ending Balance'], dtype='float') df.reset_index(inplace=True) df.index += 1 df.index.name = "Period" df["Payment"] = -1 * npf.pmt(interest/12, years*payments_year,mortgage) df["Interest Paid"] = -1 * npf.ipmt(interest/payments_year, df.index, years*payments_year,mortgage) df["Principal Paid"] = -1 * npf.ppmt(interest/payments_year, df.index, years*payments_year,mortgage) df["Ending Balance"] = 0 df.loc[1, "Ending Balance"] = mortgage - df.loc[1, "Principal Paid"] df = df.round(2) for period in range(2, len(df)+1): previous_balance = df.loc[period-1, "Ending Balance"] principal_paid = df.loc[period, "Principal Paid"] if previous_balance == 0: # 修正原有代码的笔误:双等号改为单等号完成赋值 df.loc[period, ['Payment', 'Principal Paid', 'Interest Paid', 'Ending Balance']] = 0 continue elif principal_paid <= previous_balance: df.loc[period, "Ending Balance"] = previous_balance - principal_paid print(df)
说明
- 新增了输入校验逻辑,避免用户输入非数字、格式错误的内容导致程序直接退出
- 利率输入做了适配,用户输入
2.5会自动转换为0.025的年化利率,符合普通用户的使用习惯 - 修正了原有代码中的一处笔误:原来循环中对剩余期数赋值时误用了双等号
==,改为单等号=实现正确赋值 - 如果需要支持按季度/年度还款,可将
payments_year也改为用户输入项即可
内容的提问来源于stack exchange,提问作者user17530453
相关产品推荐
相关产品推荐

