|
|
import streamlit as st |
|
|
import pandas as pd |
|
|
import numpy as np |
|
|
from datetime import datetime |
|
|
from dateutil.relativedelta import relativedelta |
|
|
|
|
|
def main(): |
|
|
st.title("Кредитный калькулятор") |
|
|
|
|
|
income = get_required_input("Введите совокупный доход заемщика (BYN): ") |
|
|
loan_payments = get_optional_input("Введите платежи по кредитам (если нет, то 0): ") |
|
|
has_guarantors = get_optional_input("Наличие поручителей (0 - нет, 1 - да): ") == 1 |
|
|
loan_term = int(get_required_input("Введите срок кредита (мес.): ")) |
|
|
interest_rate = get_percentage_input("Введите процентную ставку (%): ") |
|
|
preferential_rate = get_percentage_input("Введите льготную ставку (если имеется, 0 если нет): ") |
|
|
desired_loan_amount = get_required_input("Введите желаемую сумму кредита (BYN): ") |
|
|
payment_type = get_payment_type() |
|
|
|
|
|
|
|
|
max_loan_amount = calculate_max_loan_amount(income, loan_payments, interest_rate, loan_term) |
|
|
max_monthly_payment = calculate_max_monthly_payment(income, loan_payments) |
|
|
|
|
|
if payment_type.lower() == "annuity": |
|
|
monthly_payment = calculate_annuity_payment(desired_loan_amount, interest_rate, loan_term) |
|
|
elif payment_type.lower() == "differentiated": |
|
|
monthly_payment = calculate_differentiated_payment(desired_loan_amount, interest_rate, loan_term) |
|
|
else: |
|
|
monthly_payment_annuity = calculate_annuity_payment(desired_loan_amount, interest_rate, loan_term) |
|
|
monthly_payment_differentiated = calculate_differentiated_payment(desired_loan_amount, interest_rate, loan_term) |
|
|
st.write(f"Ежемесячный платеж (Аннуитетный): {monthly_payment_annuity:.2f} BYN") |
|
|
monthly_payment = monthly_payment_differentiated |
|
|
|
|
|
start_date = datetime.now() |
|
|
end_date = start_date + relativedelta(months=loan_term) |
|
|
|
|
|
|
|
|
save_to_file(income, loan_payments, has_guarantors, loan_term, interest_rate, preferential_rate, |
|
|
monthly_payment, start_date, end_date, desired_loan_amount, |
|
|
max_monthly_payment, max_loan_amount, payment_type) |
|
|
|
|
|
def get_required_input(prompt): |
|
|
while True: |
|
|
try: |
|
|
value = st.number_input(prompt, min_value=0.0) |
|
|
if value <= 0: |
|
|
raise ValueError("Значение должно быть больше нуля.") |
|
|
return value |
|
|
except ValueError as e: |
|
|
st.error(str(e)) |
|
|
|
|
|
def get_optional_input(prompt): |
|
|
value = st.number_input(prompt, min_value=0.0) |
|
|
return value |
|
|
|
|
|
def get_percentage_input(prompt): |
|
|
while True: |
|
|
input_value = st.number_input(prompt, min_value=0.0) |
|
|
return input_value |
|
|
|
|
|
def get_payment_type(): |
|
|
return st.selectbox("Введите тип платежа", ["Annuity", "Differentiated", "All"]) |
|
|
|
|
|
def calculate_max_loan_amount(income, loan_payments, interest_rate, loan_term): |
|
|
max_monthly_payment = calculate_max_monthly_payment(income, loan_payments) |
|
|
return calculate_loan_amount_from_monthly_payment(max_monthly_payment, interest_rate, loan_term) |
|
|
|
|
|
def calculate_max_monthly_payment(income, loan_payments): |
|
|
return (income / 3) - loan_payments |
|
|
|
|
|
def calculate_loan_amount_from_monthly_payment(monthly_payment, interest_rate, loan_term): |
|
|
monthly_rate = (interest_rate / 100) / 12 |
|
|
return monthly_payment * (np.power(1 + monthly_rate, loan_term) - 1) / (monthly_rate * np.power(1 + monthly_rate, loan_term)) |
|
|
|
|
|
def calculate_annuity_payment(loan_amount, interest_rate, loan_term): |
|
|
monthly_rate = (interest_rate / 100) / 12 |
|
|
return loan_amount * (monthly_rate * np.power(1 + monthly_rate, loan_term)) / (np.power(1 + monthly_rate, loan_term) - 1) |
|
|
|
|
|
def calculate_differentiated_payment(loan_amount, interest_rate, loan_term): |
|
|
monthly_rate = (interest_rate / 100) / 12 |
|
|
total_payment = 0 |
|
|
principal_payment = loan_amount / loan_term |
|
|
|
|
|
for month in range(1, loan_term + 1): |
|
|
interest_payment = (loan_amount - (principal_payment * (month - 1))) * monthly_rate |
|
|
total_payment += principal_payment + interest_payment |
|
|
|
|
|
return total_payment / loan_term |
|
|
|
|
|
def save_to_file(income, loan_payments, has_guarantors, loan_term, interest_rate, |
|
|
preferential_rate, monthly_payment, start_date, end_date, |
|
|
desired_loan_amount, max_monthly_payment, max_loan_amount, payment_type): |
|
|
|
|
|
data = { |
|
|
"Сумма кредита": [desired_loan_amount], |
|
|
"Срок (мес.)": [loan_term], |
|
|
"Процентная ставка (%)": [interest_rate], |
|
|
"Ежемесячный платеж": [monthly_payment], |
|
|
"Дата начала": [start_date], |
|
|
"Дата окончания": [end_date], |
|
|
"Максимальный ежемесячный платеж": [max_monthly_payment], |
|
|
"Максимальная сумма кредита": [max_loan_amount], |
|
|
"Тип платежа": [payment_type], |
|
|
"Доход": [income], |
|
|
"Платежи по кредиту": [loan_payments], |
|
|
"Есть поручители": [has_guarantors], |
|
|
"Преференциальная ставка": [preferential_rate], |
|
|
} |
|
|
|
|
|
df = pd.DataFrame(data) |
|
|
|
|
|
|
|
|
csv = df.to_csv(index=False) |
|
|
|
|
|
|
|
|
st.download_button( |
|
|
label="Скачать результаты", |
|
|
data=csv, |
|
|
file_name='loan_calculation_results.csv', |
|
|
mime='text/csv' |
|
|
) |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |
|
|
|