creitcalc / app.py
5digit's picture
Update app.py
708cf04 verified
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()