Spaces:
Runtime error
Runtime error
| 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!") | |