File size: 3,485 Bytes
f10ec56
2c359f1
c7d0bb8
 
f10ec56
9189033
 
 
a6ee9ca
6ca4f9e
9189033
 
 
 
 
 
 
 
 
0dec30d
9189033
0dec30d
9189033
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92043a4
9189033
 
 
 
 
92043a4
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import pandas as pd
import plotly.express as px
import streamlit as st
from transformers import pipeline

# 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
    classifier = pipeline('zero-shot-classification', model='distilbert-base-uncased')
    categories = ["Groceries", "Rent", "Utilities", "Entertainment", "Dining", "Transportation"]

    # Function to categorize
    def categorize_expense(description):
        # Check raw output from the model for debugging
        result = classifier(description, candidate_labels=categories)
        st.write(f"Raw classification result for '{description}': {result}")  # Debugging line
        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 with Plotly)
    monthly_expenses_df = pd.DataFrame({
        'Actual': monthly_expenses,
        'Budget': [sum(budgets.values())] * len(monthly_expenses)  # Same budget for simplicity
    })

    fig3 = px.bar(monthly_expenses_df, x=monthly_expenses_df.index, y=["Actual", "Budget"], title="Monthly Spending vs Budget", labels={"x": "Month", "y": "Amount ($)"})
    st.plotly_chart(fig3)