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): # Создание DataFrame с результатами расчета 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 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()