File size: 25,569 Bytes
5584f4a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
import matplotlib.pyplot as plt
import numpy_financial as npf
import streamlit as st
import pandas as pd
import numpy as np

def calculate_loan_shift_savings(current_balance, current_rate, new_rate, remaining_term, processing_fee):
    # Calculate monthly interest rates
    monthly_current_rate = current_rate / 12 / 100
    monthly_new_rate = new_rate / 12 / 100

    # Calculate monthly payments for current and new loan
    current_monthly_payment = npf.pmt(monthly_current_rate, remaining_term, -current_balance)
    new_monthly_payment = npf.pmt(monthly_new_rate, remaining_term, -current_balance)

    # Calculate total payments for current and new loan
    total_current_payment = current_monthly_payment * remaining_term
    total_new_payment = new_monthly_payment * remaining_term + processing_fee

    # Calculate savings
    savings = total_current_payment - total_new_payment
    return savings

def loan_shift_decision_tab():
    st.header("Should I Shift My Loan Calculator")

    current_balance = st.number_input("Current Loan Balance", min_value=0.0)
    current_rate = st.number_input("Current Interest Rate (Annual %)", min_value=0.0)
    new_rate = st.number_input("New Interest Rate (Annual %)", min_value=0.0)
    remaining_term = st.number_input("Remaining Term of Loan (Months)", min_value=1)
    processing_fee = st.number_input("Processing Fee for New Loan", min_value=0.0)

    if st.button("Calculate Savings"):
        savings = calculate_loan_shift_savings(current_balance, current_rate, new_rate, remaining_term, processing_fee)
        if savings > 0:
            st.success(f"Shifting your loan saves you ${savings:,.2f} over the remaining term of the loan.")
        else:
            st.error(f"Shifting your loan does not save money. It costs you an additional ${-savings:,.2f}.")


def calculate_real_future_values(principal, interest_rate, inflation_rate, years):
    return np.array([principal * ((1 + interest_rate / 100) ** year) / ((1 + inflation_rate / 100) ** year) for year in np.arange(1, years + 1)])

def inflation_calculator_tab():
    st.header("Multiple Investments Growth Calculator with Inflation")
    st.write("Calculate and compare the real value growth of multiple investments considering inflation.")

    # Dynamic input fields for multiple amounts, rates, and inflation rate
    entries = []
    n_entries = st.number_input("Number of Investments", min_value=1, max_value=10, value=1, step=1)
    for i in range(n_entries):
        col1, col2 = st.columns(2)
        with col1:
            amount = st.number_input(f"Amount {i+1}", min_value=0.0, value=1000.0, format="%.2f")
        with col2:
            rate = st.number_input(f"Interest Rate {i+1} (%)", min_value=0.0, value=5.0, format="%.2f")
        entries.append((amount, rate))

    inflation_rate = st.number_input("Annual Inflation Rate (%)", min_value=0.0, value=2.0, format="%.2f")
    years = st.number_input("Number of Years:", min_value=1, max_value=100, step=1)

    if st.button('Calculate and Plot'):
        plt.figure(figsize=(10, 6))
        combined_future_value = np.zeros(years)

        for i, (amount, rate) in enumerate(entries):
            real_future_values = calculate_real_future_values(amount, rate, inflation_rate, years)
            combined_future_value += real_future_values
            plt.plot(range(1, years + 1), real_future_values, label=f'Investment {i+1}')

        plt.plot(range(1, years + 1), combined_future_value, label='Combined Investment (Adjusted for Inflation)', color='black', linestyle='--')
        plt.title('Investment Real Value Growth Over Time Considering Inflation')
        plt.xlabel('Years')
        plt.ylabel('Real Future Value')
        plt.legend()
        st.pyplot(plt)


def calculate_emi(principal, annual_interest_rate, tenure_years):
    monthly_interest_rate = annual_interest_rate / (12 * 100)
    total_payments = tenure_years * 12
    emi = principal * monthly_interest_rate / (1 - (1 + monthly_interest_rate) ** -total_payments)
    return emi

def emi_breakdown(principal, annual_interest_rate, tenure_years):
    monthly_interest_rate = annual_interest_rate / (12 * 100)
    total_payments = tenure_years * 12
    emi = calculate_emi(principal, annual_interest_rate, tenure_years)
    balance = principal
    emi_data = []

    for month in range(1, total_payments + 1):
        interest = balance * monthly_interest_rate
        principal_payment = emi - interest
        balance -= principal_payment
        emi_data.append([month, emi, principal_payment, interest, balance])

    return pd.DataFrame(emi_data, columns=["Month", "EMI", "Principal", "Interest", "Balance"])

def plot_emi_data(emi_df):
    plt.figure(figsize=(10, 5))
    plt.plot(emi_df['Month'], emi_df['Principal'], label='Principal Component')
    plt.plot(emi_df['Month'], emi_df['Interest'], label='Interest Component')
    plt.xlabel('Month')
    plt.ylabel('Amount')
    plt.title('EMI Components Over Time')
    plt.legend()
    st.pyplot(plt)

    plt.figure(figsize=(10, 5))
    plt.plot(emi_df['Month'], emi_df['Balance'], label='Remaining Balance')
    plt.xlabel('Month')
    plt.ylabel('Amount')
    plt.title('Loan Balance Over Time')
    plt.legend()
    st.pyplot(plt)

def emi_calculator_tab():
    st.header("EMI Calculator")
    loan_amount = st.number_input("Loan Amount", min_value=0.0, value=100000.0, step=1000.0)
    annual_interest_rate = st.number_input("Annual Interest Rate (%)", min_value=0.0, value=8.0, step=0.1)
    tenure_years = st.number_input("Tenure (Years)", min_value=1, value=10, step=1)

    if st.button('Calculate EMI'):
        emi = calculate_emi(loan_amount, annual_interest_rate, tenure_years)
        st.success(f"Monthly EMI: ₹ {emi:.2f}")

        emi_df = emi_breakdown(loan_amount, annual_interest_rate, tenure_years)
        plot_emi_data(emi_df)
        st.write(emi_df)

def calculate_compound_interest(principal, annual_rate, compounding_frequency, years):
    """
    Calculate the compound interest based on the given parameters.
    """
    factor = {
        "Monthly": 12,
        "Quarterly": 4,
        "Yearly": 1
    }
    n = factor[compounding_frequency]
    amount = principal * ((1 + annual_rate/(100 * n)) ** (n * years))
    return amount

def plot_growth(principal, annual_rate, compounding_frequency, years):
    """
    Plot the returns of the investment over time.
    """
    factor = {
        "Monthly": 12,
        "Quarterly": 4,
        "Yearly": 1
    }
    n = factor[compounding_frequency]
    times = np.linspace(0, years, years * n + 1)
    future_values = principal * ((1 + annual_rate/(100 * n)) ** (n * times))
    returns = future_values - principal

    plt.figure(figsize=(10, 6))
    plt.plot(times, returns, color='purple', linestyle='-', linewidth=2, label='Investment Returns')
    plt.fill_between(times, returns, color='blue', alpha=0.3)
    plt.title('Investment Returns Over Time')
    plt.xlabel('Years')
    plt.ylabel('Returns (Future Value - Principal)')
    plt.legend()
    st.pyplot(plt)


def plot_growth_old(principal, annual_rate, compounding_frequency, years):
    """
    Plot the growth of the investment over time.
    """
    factor = {
        "Monthly": 12,
        "Quarterly": 4,
        "Yearly": 1
    }
    n = factor[compounding_frequency]
    times = np.linspace(0, years, years * n + 1)
    values = principal * ((1 + annual_rate/(100 * n)) ** (n * times))

    plt.figure(figsize=(10, 6))
    plt.plot(times, values, color='purple', linestyle='-', linewidth=2, label='Investment Growth')
    plt.fill_between(times, values, color='blue', alpha=0.3)
    plt.title('Compound Interest Growth Over Time')
    plt.xlabel('Years')
    plt.ylabel('Future Value')
    plt.legend()
    st.pyplot(plt)

def compound_interest_calculator():
    st.header("Compound Interest Calculator")
    st.write("Calculate the future value of your investment with compound interest.")

    principal = st.number_input("Enter the principal amount:", min_value=0.0, value=10000.0, format="%.2f")
    annual_rate = st.number_input("Enter the annual interest rate (%):", min_value=0.0, value=5.0, format="%.2f")
    compounding_frequency = st.selectbox("Select the compounding frequency:", ["Monthly", "Quarterly", "Yearly"])
    years = st.number_input("Enter the number of years:", min_value=1, max_value=50, value=10, step=1)

    if st.button('Calculate and Plot'):
        future_value = calculate_compound_interest(principal, annual_rate, compounding_frequency, years)
        st.success(f"The future value of your investment is: ₹ {future_value:.2f}")

        plot_growth(principal, annual_rate, compounding_frequency, years)

def calculate_fire_number(monthly_expenses, withdrawal_rate):
    """
    Calculate the FIRE Number based on monthly expenses and withdrawal rate.
    Annual expenses are derived by multiplying monthly expenses by 12.
    """
    annual_expenses = monthly_expenses * 12
    fire_number = annual_expenses / (withdrawal_rate / 100)
    return fire_number

def fire_number_calculator():
    st.header("FIRE Number Calculator")
    st.write("Calculate the amount you need to achieve Financial Independence and Retire Early (FIRE) based on your monthly expenses.")

    monthly_expenses = st.number_input("Enter your monthly expenses:", min_value=0.0, value=5000.0, format="%.2f")
    withdrawal_rate = st.number_input("Enter your desired withdrawal rate (%):", min_value=1.0, max_value=10.0, value=4.0, format="%.2f")

    if st.button('Calculate FIRE Number'):
        fire_number = calculate_fire_number(monthly_expenses, withdrawal_rate)
        st.success(f"Your FIRE Number is: ₹ {fire_number:.2f}")

def project_fd_value(principal, annual_rate, years):
    return np.array([principal * ((1 + annual_rate) ** year) for year in range(1, years + 1)])

def plot_projections_with_fd(years, best_case_values, worst_case_values, fd_values):
    plt.figure(figsize=(10, 6))
    plt.plot(range(1, years + 1), best_case_values, label='Best Case', color='#1f77b4')  # Blue
    plt.plot(range(1, years + 1), worst_case_values, label='Worst Case', color='#ff7f0e')  # Orange
    plt.plot(range(1, years + 1), fd_values, label='FD Return', color='#2ca02c')  # Green
    plt.xlabel('Years')
    plt.ylabel('Projected Value (₹)')
    plt.yscale('log')  # Set the y-axis to a logarithmic scale
    plt.title('Investment Projections Over Time (Log Scale)')
    plt.legend()
    st.pyplot(plt)

def investment_projections(investment_amount, risk_appetite, years):
    # Defining return rates for best and worst cases
    if risk_appetite >= 75:  # High Risk
        best_case_rate = 0.15  # 15% optimistic annual return
        worst_case_rate = -0.05  # -5% pessimistic annual return
    elif 25 < risk_appetite < 75:  # Medium Risk
        best_case_rate = 0.10  # 10% optimistic annual return
        worst_case_rate = 0.00  # 0% pessimistic annual return
    else:  # Low Risk
        best_case_rate = 0.05  # 5% optimistic annual return
        worst_case_rate = 0.01  # 1% pessimistic annual return

    # Projecting future values
    best_case_value = project_future_value(investment_amount, best_case_rate, years)
    worst_case_value = project_future_value(investment_amount, worst_case_rate, years)

    return best_case_value, worst_case_value

def plot_projections(years, best_case_values, worst_case_values):
    plt.figure(figsize=(10, 6))
    plt.plot(range(1, years + 1), best_case_values, label='Best Case', color='#1f77b4')  # Blue
    plt.plot(range(1, years + 1), worst_case_values, label='Worst Case', color='#ff7f0e')  # Orange
    plt.xlabel('Years')
    plt.ylabel('Projected Value (₹)')
    plt.title('Investment Projections Over Time')
    plt.legend()
    st.pyplot(plt)

def project_future_value(principal, annual_rate, years):
    return np.array([principal * ((1 + annual_rate) ** year) for year in range(1, years + 1)])

def investment_advice(income, expenses, age, risk_appetite):
    # Calculate the disposable income (income - expenses)
    disposable_income = income - expenses

    # Emergency Fund Recommendation
    emergency_fund = expenses * 6  # 6 months of expenses

    # Retirement Savings Recommendation (simplified example)
    retirement_savings = disposable_income * 0.15  # 15% of disposable income

    # Investment Allocation
    if risk_appetite >= 75:  # High Risk
        stocks = disposable_income * 0.5  # 50% in stocks
        bonds = disposable_income * 0.2  # 20% in bonds
        mutual_funds = disposable_income * 0.3  # 30% in mutual funds
    elif 25 < risk_appetite < 75:  # Medium Risk
        stocks = disposable_income * 0.3  # 30% in stocks
        bonds = disposable_income * 0.4  # 40% in bonds
        mutual_funds = disposable_income * 0.3  # 30% in mutual funds
    else:  # Low Risk
        stocks = disposable_income * 0.1  # 10% in stocks
        bonds = disposable_income * 0.6  # 60% in bonds
        mutual_funds = disposable_income * 0.3  # 30% in mutual funds

    return {
        "Emergency Fund": emergency_fund,
        "Retirement Savings": retirement_savings,
        "Stocks": stocks,
        "Bonds": bonds,
        "Mutual Funds": mutual_funds
    }

def investment_advisor():
    st.title("Smart Income Investment Advisor")

    income = st.number_input("Enter your monthly income:", min_value=0.0, format="%.2f")
    expenses = st.number_input("Enter your monthly expenses:", min_value=0.0, format="%.2f")
    age = st.number_input("Enter your age:", min_value=18, max_value=100, step=1)
    risk_appetite = st.slider("Select your risk appetite (0 = Low, 100 = High):", 0, 100, 50)

    fd_rate = st.number_input("Enter FD Interest Rate:", min_value = 0.1, max_value = 10.0, format="%.2f")

    years = st.number_input("Investment Time Horizon (Years):", min_value=1, max_value=30, step=1)

    if st.button("Get Investment Advice"):
        advice = investment_advice(income, expenses, age, risk_appetite)
        st.write(advice)

        total_investment = advice["Stocks"] + advice["Bonds"] + advice["Mutual Funds"]
        best_case_values, worst_case_values = investment_projections(total_investment, risk_appetite, years)
        
        fd_values = project_fd_value(total_investment, fd_rate / 100, years)

        st.write("Projection for your total investment:")
        st.write(f"Best-case scenario (in {years} years): ₹ {best_case_values[-1]:.2f}")
        st.write(f"Worst-case scenario (in {years} years): ₹ {worst_case_values[-1]:.2f}")
        st.write(f"Fixed Deposit scenario (in {years} years): ₹ {fd_values[-1]:.2f}")

        # Plot the projections with FD
        plot_projections_with_fd(years, best_case_values, worst_case_values, fd_values)

def calculate_sip_returns(sip_amount, duration_years, rd_fd_rate, mf_rate, index_fund_rate):
    # Convert annual rates to monthly rates
    monthly_rd_fd_rate = rd_fd_rate / 12 / 100
    monthly_mf_rate = mf_rate / 12 / 100
    monthly_index_fund_rate = index_fund_rate / 12 / 100

    # Total months
    total_months = duration_years * 12

    # RD/FD Returns Calculation (Compounded Monthly for simplification)
    rd_fd_total = 0
    for month in range(total_months):
        rd_fd_total *= (1 + monthly_rd_fd_rate)
        rd_fd_total += sip_amount

    # Mutual Funds and Index Funds Returns Calculation (Compounded Monthly)
    mf_total = 0
    index_fund_total = 0
    for month in range(total_months):
        mf_total *= (1 + monthly_mf_rate)
        mf_total += sip_amount
        index_fund_total *= (1 + monthly_index_fund_rate)
        index_fund_total += sip_amount

    return rd_fd_total, mf_total, index_fund_total

def sip_return_comparator_tab():
    st.header("SIP Return Comparator")
    st.write("Compare the returns from different investment options based on your SIP.")

    sip_amount = st.number_input("Enter your monthly SIP amount:", min_value=500.0, value=5000.0, format="%.2f")
    duration_years = st.number_input("Enter the investment duration (in years):", min_value=1, max_value=30, value=5, step=1)

    # Optional: Allow users to modify the default interest rates
    rd_fd_rate = st.number_input("Enter RD/FD Interest Rate (% per annum):", min_value=0.0, value=6.0, format="%.2f")
    mf_rate = st.number_input("Enter Mutual Funds Return Rate (% per annum):", min_value=0.0, value=12.0, format="%.2f")
    index_fund_rate = st.number_input("Enter Index Funds Return Rate (% per annum):", min_value=0.0, value=10.0, format="%.2f")

    if st.button('Calculate SIP Returns'):
        rd_fd_returns, mf_returns, index_fund_returns = calculate_sip_returns(sip_amount, duration_years, rd_fd_rate, mf_rate, index_fund_rate)
        st.success(f"RD/FD Returns: ₹ {rd_fd_returns:.2f}\nMutual Funds Returns: ₹ {mf_returns:.2f}\nIndex Funds Returns: ₹ {index_fund_returns:.2f}")

        # Optional: Plotting the results for a visual comparison
        labels = ['RD/FD', 'Mutual Funds', 'Index Funds']
        returns = [rd_fd_returns, mf_returns, index_fund_returns]
        colors = [(0.1, 0.2, 0.5, 0.7), (0.2, 0.6, 0.2, 0.7), (1.0, 0.5, 0.0, 0.7)]  # RGBA format
        plt.figure(figsize=(10, 6))
        plt.bar(labels, returns, color=colors)
        plt.title('SIP Returns Comparison')
        plt.ylabel('Total Returns in ₹')
        st.pyplot(plt)


def calculate_emi(principal, interest_rate, years):
    monthly_interest_rate = interest_rate / (12 * 100)
    total_payments = years * 12
    emi = principal * monthly_interest_rate * ((1 + monthly_interest_rate) ** total_payments) / ((1 + monthly_interest_rate) ** total_payments - 1)
    return emi

def calculate_loan_eligibility(net_monthly_income, other_emis, interest_rate, tenure_years, income_multiplier=5):
    # Assuming the bank allows a maximum of 50% of net income towards EMI
    max_emi_allowed = net_monthly_income * 0.5 - other_emis
    monthly_interest_rate = interest_rate / (12 * 100)
    total_payments = tenure_years * 12
    max_loan_amount = max_emi_allowed / (monthly_interest_rate * ((1 + monthly_interest_rate) ** total_payments) / ((1 + monthly_interest_rate) ** total_payments - 1))
    return max_loan_amount * income_multiplier

def estimate_tax_savings(interest_paid_annually, principal_paid_annually, income_tax_slab, co_purchaser):
    max_deduction_interest = 200000  # Section 24(b)
    max_deduction_principal = 150000  # Section 80C
    interest_deduction = min(interest_paid_annually, max_deduction_interest)
    principal_deduction = min(principal_paid_annually, max_deduction_principal)
    tax_savings = (interest_deduction + principal_deduction) * income_tax_slab / 100
    if co_purchaser == "Yes":
        tax_savings *= 2  # Double the tax savings if there's a co-purchaser
    return tax_savings

def calculate_profit_timeline(total_loan_amount, emi, tax_savings, initial_investment, rental_income, rental_increase_rate, inflation_rate, property_appreciation_rate, years):
    monthly_rental_income = rental_income
    cumulative_rental_income = 0
    cumulative_investment = initial_investment
    property_value = total_loan_amount + initial_investment  # Initial total property value
    profit_timeline = []

    for year in range(1, years + 1):
        annual_rental_income = 0
        property_value *= (1 + property_appreciation_rate)  # Update property value for the year

        for month in range(1, 13):
            adjusted_rental_income = monthly_rental_income / ((1 + inflation_rate) ** (year - 1))
            annual_rental_income += adjusted_rental_income
            cumulative_rental_income += adjusted_rental_income
            cumulative_investment += emi - tax_savings / 12

        # Update rental income for the next year
        monthly_rental_income *= (1 + rental_increase_rate)

        # Record data for the timeline
        profit_timeline.append((year, cumulative_rental_income, cumulative_investment, property_value))

    return pd.DataFrame(profit_timeline, columns=["Year", "Cumulative Rental Income", "Cumulative Investment", "Estimated Property Value"])


def loan_eligibility_calculator():
    st.header("Loan Eligibility Calculator")
    st.write("Calculate your loan eligibility based on your monthly income and other factors.")

    net_monthly_income = st.number_input("Enter your net monthly income:", min_value=0.0, value=50000.0, format="%.2f")
    other_emis = st.number_input("Enter total EMI of other existing loans (if any):", min_value=0.0, value=0.0, format="%.2f")
    interest_rate = st.number_input("Expected loan interest rate (%):", min_value=0.0, value=8.0, format="%.2f")
    tenure_years = st.number_input("Expected loan tenure (years):", min_value=1, max_value=30, value=20, step=1)

    if st.button('Calculate Loan Eligibility'):
        loan_eligibility = calculate_loan_eligibility(net_monthly_income, other_emis, interest_rate, tenure_years)
        st.success(f"Based on the provided details, your estimated loan eligibility is: ₹ {loan_eligibility:.2f}")

def emi_rental_profit_calculator():
    # User Inputs
    cost_of_property = st.number_input("Enter the cost of the property:", min_value=100000.0, value=5000000.0, format="%.2f")
    renovation_cost = st.number_input("Enter the renovation cost:", min_value=0.0, value=500000.0, format="%.2f")
    down_payment = st.number_input("Enter the down payment:", min_value=0.0, value=1000000.0, format="%.2f")
    loan_amount = cost_of_property + renovation_cost - down_payment
    st.text(f"Total Loan Amount: {loan_amount}")
    
    interest_rate = st.number_input("Enter the home loan interest rate (%):", min_value=0.0, value=8.0, format="%.2f")
    years = st.number_input("Enter the number of years for the loan:", min_value=1, max_value=30, value=20, step=1)
    co_purchaser = st.selectbox("Is there a co-purchaser?", ["No", "Yes"])
    income_tax_slab = st.number_input("Enter your income tax slab rate (%):", min_value=0.0, max_value=30.0, value=10.0, format="%.2f")
    initial_rental_income = st.number_input("Enter initial monthly rental income:", min_value=0.0, value=20000.0, format="%.2f")
    rental_increase_rate = st.number_input("Enter annual rental increase rate (%):", min_value=0.0, max_value=10.0, value=5.0, format="%.2f") / 100
    inflation_rate = st.number_input("Enter annual inflation rate (%):", min_value=0.0, max_value=10.0, value=4.0, format="%.2f") / 100
    property_appreciation_rate = st.number_input("Enter annual property value appreciation rate (%):", min_value=0.0, max_value=10.0, value=3.0, format="%.2f") / 100
    
    # Calculation Button
    if st.button('Calculate'):
        emi = calculate_emi(loan_amount, interest_rate, years)
        st.text(f"Monthly EMI: {emi:.2f}")
    
        # Assuming the entire EMI is considered for tax savings calculation
        annual_emi = emi * 12
        tax_savings = estimate_tax_savings(annual_emi, annual_emi, income_tax_slab, co_purchaser)
        st.text(f"Annual Tax Savings: {tax_savings:.2f}")
    
        # Calculate profit timeline
        profit_df = calculate_profit_timeline(loan_amount, emi, tax_savings, down_payment, initial_rental_income, rental_increase_rate, inflation_rate, property_appreciation_rate, years)
        st.write(profit_df)
    
        # Plotting the results
        plt.figure(figsize=(10, 4))
        plt.plot(profit_df['Year'], profit_df['Cumulative Rental Income'], label='Cumulative Rental Income')
        plt.plot(profit_df['Year'], profit_df['Cumulative Investment'], label='Cumulative Investment')
        plt.plot(profit_df['Year'], profit_df['Estimated Property Value'], label='Estimated Property Value')
        plt.xlabel('Year')
        plt.ylabel('Amount')
        plt.title('Profit Timeline')
        plt.legend()
        st.pyplot(plt)

def main():
    st.title("Personal Finance Assistance")

    # Sidebar for navigation
    st.sidebar.title("Navigation")

    options = ["Personal Finance Assistance Tools", "Loan Eligibility Calculator", "EMI and Rental Profit Calculator", "SIP Return Comparator", "How to invest my income?", "FIRE Number Calculator", "Compound Interest Calculator", "Loan EMI Calculator"]
    options.append("Debt Payoff Calculator")
    options.append("How are my investments changing over time considering inflation ?")
    options.append("Should I Shift My Loan Calculator")
    
    choice = st.sidebar.radio("Choose a Calculator:", options)

    if choice == "Personal Finance Assistance Tools":
        st.text("This Space container various tools to clarify few personal finances.")
        st.text("Choose from left sidebar and proceed.")
        st.text("Suggestion are welcome, please contact at [email protected] for collaboration!")
    elif choice == "Loan Eligibility Calculator":
        loan_eligibility_calculator()
    elif choice == "EMI and Rental Profit Calculator":
        emi_rental_profit_calculator()
    elif choice == "SIP Return Comparator":
        sip_return_comparator_tab()
    elif choice == "How to invest my income?":
        investment_advisor()
    elif choice == "FIRE Number Calculator":
        fire_number_calculator()
    elif choice == "Compound Interest Calculator":
        compound_interest_calculator()
    elif choice == "Loan EMI Calculator":
        emi_calculator_tab()
    elif choice == "How are my investments changing over time considering inflation ?":
        inflation_calculator_tab()
    elif choice == "Should I Shift My Loan Calculator":
        loan_shift_decision_tab()
        

if __name__ == "__main__":
    main()