import pandas as pd import plotly.express as px import streamlit as st from transformers import pipeline import matplotlib.pyplot as plt # Function to add custom background image from a URL def add_bg_from_url(image_url): st.markdown( f""" """, unsafe_allow_html=True ) # Add the background image using the provided URL background_image_url = 'https://huggingface.co/spaces/engralimalik/Smart-Expense-Tracker/resolve/main/colorful-abstract-textured-background-design.jpg' add_bg_from_url(background_image_url) # File upload uploaded_file = st.file_uploader("Upload your expense CSV file", type=["csv"]) if uploaded_file: df = pd.read_csv(uploaded_file) # Display Dataframe st.write(df.head()) # Initialize Hugging Face model for zero-shot classification (using a better model like roberta-large-mnli) classifier = pipeline('zero-shot-classification', model='roberta-large-mnli') categories = ["Groceries", "Rent", "Utilities", "Entertainment", "Dining", "Transportation"] # Function to categorize expenses based on the description def categorize_expense(description): result = classifier(description, candidate_labels=categories) return result['labels'][0] # Most probable category # Apply categorization df['Category'] = df['Description'].apply(categorize_expense) # Display categorized data st.write("Categorized Data", df) # Sidebar for setting the monthly budget using sliders st.sidebar.header("Set Your Monthly Budget") groceries_budget = st.sidebar.slider("Groceries Budget", 0, 1000, 300) rent_budget = st.sidebar.slider("Rent Budget", 0, 5000, 1000) utilities_budget = st.sidebar.slider("Utilities Budget", 0, 500, 150) entertainment_budget = st.sidebar.slider("Entertainment Budget", 0, 1000, 100) dining_budget = st.sidebar.slider("Dining Budget", 0, 1000, 150) transportation_budget = st.sidebar.slider("Transportation Budget", 0, 500, 120) # Store the updated budget values budgets = { "Groceries": groceries_budget, "Rent": rent_budget, "Utilities": utilities_budget, "Entertainment": entertainment_budget, "Dining": dining_budget, "Transportation": transportation_budget } # Track if any category exceeds its budget df['Budget_Exceeded'] = df.apply(lambda row: row['Amount'] > budgets.get(row['Category'], 0), axis=1) # Show categories that exceeded their budget exceeded_budget = df[df['Budget_Exceeded'] == True] st.write("Categories that exceeded the budget:", exceeded_budget[['Date', 'Category', 'Amount']]) # Visualizations # 1. Pie Chart for expense distribution by category category_expenses = df.groupby('Category')['Amount'].sum() fig1 = px.pie(category_expenses, values=category_expenses.values, names=category_expenses.index, title="Expense Distribution by Category") st.plotly_chart(fig1) # 2. Monthly Spending Trends (Line Chart) df['Date'] = pd.to_datetime(df['Date']) df['Month'] = df['Date'].dt.to_period('M').astype(str) # Convert Period to string for Plotly compatibility monthly_expenses = df.groupby('Month')['Amount'].sum() fig2 = px.line(monthly_expenses, x=monthly_expenses.index, y=monthly_expenses.values, title="Monthly Expenses", labels={"x": "Month", "y": "Amount ($)"}) st.plotly_chart(fig2) # 3. Monthly Spending vs Budget (Bar Chart) monthly_expenses_df = pd.DataFrame({ 'Actual': monthly_expenses, 'Budget': [sum(budgets.values())] * len(monthly_expenses) # Same budget for simplicity }) # Create a matplotlib figure for the bar chart fig3, ax = plt.subplots(figsize=(10, 6)) monthly_expenses_df.plot(kind='bar', ax=ax) ax.set_title('Monthly Spending vs Budget') ax.set_ylabel('Amount ($)') st.pyplot(fig3)