CoolFace
Apppublic

ZeeshanAlihaider/Engineering-Economics-Solver

sourceHugging Facemitupdated 7mo agoView on Hugging Face
0likes
app.py112 linesDownload Raw Back to root
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.")