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)
|