File size: 3,760 Bytes
f10ec56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from transformers import pipeline
from io import StringIO

# Streamlit page configuration
st.set_page_config(page_title="Smart Expense Tracker", page_icon=":money_with_wings:")

# Title
st.title("Smart Expense Tracker :money_with_wings:")

# File uploader to upload CSV
st.sidebar.header("Upload your expense data")
uploaded_file = st.sidebar.file_uploader("Choose a CSV file", type=["csv"])

# Check if file is uploaded
if uploaded_file is not None:
    # Read CSV
    df = pd.read_csv(uploaded_file)

    # Display first few rows of the uploaded data
    st.write("### Uploaded Data", df.head())

    # Ensure correct column names
    if 'Date' not in df.columns or 'Description' not in df.columns or 'Amount' not in df.columns:
        st.error("CSV file should contain 'Date', 'Description', and 'Amount' columns.")
    else:
        # Initialize Hugging Face pipeline for text classification (expense categorization)
        expense_classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")

        # Function to categorize transactions
        def categorize_transaction(description):
            candidate_labels = ["Groceries", "Entertainment", "Rent", "Utilities", "Dining", "Transportation", "Shopping", "Others"]
            result = expense_classifier(description, candidate_labels)
            return result["labels"][0]

        # Apply categorization to the descriptions
        df['Category'] = df['Description'].apply(categorize_transaction)

        # Show categorized data
        st.write("### Categorized Expense Data", df.head())

        # Visualizations

        # Pie chart for Category-wise spending
        category_spending = df.groupby("Category")['Amount'].sum()
        st.write("### Category-wise Spending")
        fig, ax = plt.subplots()
        category_spending.plot(kind='pie', autopct='%1.1f%%', ax=ax, figsize=(8, 8))
        ax.set_ylabel('')
        st.pyplot(fig)

        # Monthly spending trends (Line plot)
        df['Date'] = pd.to_datetime(df['Date'])
        df['Month'] = df['Date'].dt.to_period('M')
        monthly_spending = df.groupby('Month')['Amount'].sum()

        st.write("### Monthly Spending Trends")
        fig, ax = plt.subplots()
        monthly_spending.plot(kind='line', ax=ax, figsize=(10, 6))
        ax.set_ylabel('Amount ($)')
        ax.set_xlabel('Month')
        ax.set_title('Monthly Spending Trends')
        st.pyplot(fig)

        # Budget Tracker
        st.sidebar.header("Budget Tracker")
        category_list = df['Category'].unique()
        budget_dict = {}

        for category in category_list:
            budget_dict[category] = st.sidebar.number_input(f"Set budget for {category}", min_value=0, value=500)

        # Budget vs Actual Spending (Bar chart)
        st.write("### Budget vs Actual Spending")
        budget_spending = {category: [budget_dict[category], category_spending.get(category, 0)] for category in category_list}

        budget_df = pd.DataFrame(budget_spending, index=["Budget", "Actual"]).T
        fig, ax = plt.subplots()
        budget_df.plot(kind='bar', ax=ax, figsize=(10, 6))
        ax.set_ylabel('Amount ($)')
        ax.set_title('Budget vs Actual Spending')
        st.pyplot(fig)

        # Suggestions for saving
        st.write("### Suggested Savings Tips")
        for category, actual in category_spending.items():
            if actual > budget_dict.get(category, 500):
                st.write(f"- **{category}**: Over budget by ${actual - budget_dict.get(category, 500)}. Consider reducing this expense.")

else:
    st.write("Upload a CSV file to start tracking your expenses!")