ZeeshanAlihaider/Engineering-Economics-Solver
0
1import streamlit as st2import numpy_financial as npf3 4class CashFlowSolver:5 def __init__(self, interest_rate):6 self.i = interest_rate7 8 def future_given_present(self, P, n):9 return P * ((1 + self.i) ** n)10 11 def present_given_future(self, F, n):12 return F / ((1 + self.i) ** n)13 14 def present_given_annual(self, A, n):15 return A * (((1 + self.i) ** n - 1) / (self.i * (1 + self.i) ** n))16 17 def annual_given_present(self, P, n):18 return P * ((self.i * (1 + self.i) ** n) / ((1 + self.i) ** n - 1))19 20 def present_given_gradient(self, G, n):21 term1 = ((1 + self.i) ** n - 1) / (self.i * (1 + self.i) ** n)22 term2 = n / ((1 + self.i) ** n)23 return (G / self.i) * (term1 - term2)24 25 def net_present_value(self, cash_flows):26 return sum(cf / ((1 + self.i) ** t) for t, cf in enumerate(cash_flows))27 28 @staticmethod29 def internal_rate_of_return(cash_flows):30 return npf.irr(cash_flows)31 32# --- Web App Interface ---33st.set_page_config(page_title="Engineering Economics Solver", layout="centered")34 35st.title("๐ Engineering Economics Cash Flow Solver")36st.markdown("Easily calculate Present Worth (P), Future Worth (F), Annual Series (A), and NPV.")37 38# Sidebar for inputs39st.sidebar.header("1. Global Settings")40interest_rate_input = st.sidebar.number_input("Interest Rate (i) in %", min_value=0.0, value=8.0, step=0.1)41interest_rate = interest_rate_input / 100.042solver = CashFlowSolver(interest_rate)43 44st.sidebar.header("2. Problem Type")45problem_type = st.sidebar.radio(46 "Select what you are solving for:",47 ("Single Amounts (Ch 1)", "Uniform Series (Ch 2)", "Gradient Series (Ch 2)", "Uneven Cash Flows (Ch 3)")48)49 50# Main Screen Logic51if problem_type == "Single Amounts (Ch 1)":52 st.subheader("Single Amount Factors (P and F)")53 calc_choice = st.radio("Choose calculation:", ("Find F given P", "Find P given F"))54 n = st.number_input("Number of periods (n)", min_value=1, value=5, step=1)55 56 if calc_choice == "Find F given P":57 P = st.number_input("Enter Present Worth (P)", value=1000.0)58 if st.button("Calculate Future Worth"):59 F = solver.future_given_present(P, n)60 st.success(f"**Future Worth (F):** ${F:,.2f}")61 62 elif calc_choice == "Find P given F":63 F = st.number_input("Enter Future Worth (F)", value=1000.0)64 if st.button("Calculate Present Worth"):65 P = solver.present_given_future(F, n)66 st.success(f"**Present Worth (P):** ${P:,.2f}")67 68elif problem_type == "Uniform Series (Ch 2)":69 st.subheader("Uniform Series Factors (Annuities)")70 calc_choice = st.radio("Choose calculation:", ("Find P given A", "Find A given P"))71 n = st.number_input("Number of periods (n)", min_value=1, value=10, step=1)72 73 if calc_choice == "Find P given A":74 A = st.number_input("Enter Annual Amount (A)", value=500.0)75 if st.button("Calculate Present Worth"):76 P = solver.present_given_annual(A, n)77 st.success(f"**Present Worth (P):** ${P:,.2f}")78 79 elif calc_choice == "Find A given P":80 P = st.number_input("Enter Present Worth (P)", value=10000.0)81 if st.button("Calculate Annual Amount"):82 A = solver.annual_given_present(P, n)83 st.success(f"**Annual Uniform Amount (A):** ${A:,.2f}")84 85elif problem_type == "Gradient Series (Ch 2)":86 st.subheader("Arithmetic Gradient Series")87 n = st.number_input("Number of periods (n)", min_value=1, value=5, step=1)88 base_A = st.number_input("Base Amount in Year 1", value=100.0)89 G = st.number_input("Gradient (Increase per year)", value=50.0)90 91 if st.button("Calculate Total Present Worth"):92 P_base = solver.present_given_annual(base_A, n)93 P_grad = solver.present_given_gradient(G, n)94 st.success(f"**Total Present Worth:** ${(P_base + P_grad):,.2f}")95 st.info(f"(Base P: ${P_base:,.2f} | Gradient P: ${P_grad:,.2f})")96 97elif problem_type == "Uneven Cash Flows (Ch 3)":98 st.subheader("Net Present Value (NPV) & IRR")99 st.write("Enter cash flows separated by commas. Year 0 is usually a negative cost.")100 cf_input = st.text_input("Cash Flows (e.g., -5000, 1500, 2000)", "-5000, 1500, 2000, 2500")101 102 if st.button("Calculate NPV & IRR"):103 try:104 cash_flows = [float(x.strip()) for x in cf_input.split(",")]105 npv = solver.net_present_value(cash_flows)106 irr = CashFlowSolver.internal_rate_of_return(cash_flows)107 108 st.success(f"**Net Present Value (NPV):** ${npv:,.2f}")109 if irr is not None:110 st.success(f"**Internal Rate of Return (IRR):** {irr * 100:.2f}%")111 except ValueError:112 st.error("Please enter valid numbers separated by commas.")