You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:36:03