import streamlit as st import pandas as pd import plotly.express as px from datetime import datetime # Initialize session state for persistent data if 'expenses' not in st.session_state: st.session_state.expenses = [] if 'salary' not in st.session_state: st.session_state.salary = 0 # Set page title st.title("Expense Tracker") # Sidebar for user inputs with st.sidebar: st.header("Enter Your Salary") salary = st.number_input("Monthly Salary", value=st.session_state.salary, step=100) st.session_state.salary = salary st.header("Add Expense") expense_date = st.date_input("Date", datetime.now()) expense_category = st.selectbox("Category", ["Food", "Transport", "Entertainment", "Bills", "Other"]) expense_amount = st.number_input("Amount", min_value=0.0, step=0.01) add_expense = st.button("Add Expense") # Add expense to session state if add_expense: st.session_state.expenses.append({ "date": expense_date, "category": expense_category, "amount": expense_amount }) # Convert expenses to DataFrame df = pd.DataFrame(st.session_state.expenses) # Calculate total expenses and current balance total_expenses = df["amount"].sum() if not df.empty else 0 current_balance = st.session_state.salary - total_expenses # Main dashboard st.header("Dashboard") # Display current balance st.metric(label="Current Balance", value=f"{current_balance:,.2f}") # Show expenses DataFrame st.subheader("Expenses") if not df.empty: st.dataframe(df) # Plot expenses by category fig = px.pie(df, names='category', values='amount', title='Expenses by Category') st.plotly_chart(fig) # Plot expenses over time df['date'] = pd.to_datetime(df['date']) fig = px.bar(df, x='date', y='amount', color='category', title='Expenses Over Time') st.plotly_chart(fig) else: st.write("No expenses added yet.") # Allow user to clear all data if st.button("Clear All Data"): st.session_state.expenses = [] st.experimental_rerun() # Additional creativity: Monthly budget and savings goals st.sidebar.header("Monthly Budget and Savings Goals") monthly_budget = st.sidebar.number_input("Monthly Budget", min_value=0, value=0, step=100) savings_goal = st.sidebar.number_input("Savings Goal", min_value=0, value=0, step=100) # Display budget and savings status st.sidebar.metric(label="Total Expenses", value=f"${total_expenses:,.2f}") st.sidebar.metric(label="Monthly Budget Remaining", value=f"${monthly_budget - total_expenses:,.2f}") st.sidebar.metric(label="Savings Towards Goal", value=f"${current_balance - (monthly_budget - total_expenses):,.2f}") st.sidebar.text("Tip: Adjust your expenses to meet your savings goal!")