File size: 4,108 Bytes
f10ec56
2c359f1
c7d0bb8
 
118b9d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22552d5
118b9d7
e57fb31
9189033
 
 
a6ee9ca
6ca4f9e
9189033
 
 
118b9d7
 
9189033
 
118b9d7
9189033
 
 
 
 
 
e57fb31
118b9d7
 
 
9189033
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118b9d7
9189033
 
118b9d7
9189033
 
 
 
 
118b9d7
9189033
 
 
 
118b9d7
 
 
9189033
118b9d7
 
9189033
e6dd97e
118b9d7
 
 
 
 
 
 
 
 
 
 
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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"""
        <style>
        .stApp {{
            background-image: url("{image_url}");
            background-size: cover;
            background-position: center center;
            background-repeat: no-repeat;
        }}
        </style>
        """,
        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/top-view-finance-business-elements.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)