File size: 3,647 Bytes
f10ec56 2c359f1 c7d0bb8 8959e5f e57fb31 9189033 a6ee9ca 6ca4f9e 9189033 8959e5f 9189033 8959e5f 9189033 e57fb31 9189033 8959e5f 9189033 8959e5f 9189033 8959e5f 9189033 8959e5f 9189033 8959e5f 9189033 e6dd97e 9189033 8959e5f e6dd97e |
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 |
import pandas as pd
import plotly.express as px
import streamlit as st
from transformers import pipeline
import datetime
# 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):
result = classifier(description, candidate_labels=categories)
return result['labels'][0] # Most probable category
# Apply categorization
df['Category'] = df['Description'].apply(categorize_expense)
# 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
}
# Add a date slider for start and end date (default is the last month)
today = datetime.date.today()
last_month = today - pd.DateOffset(months=1)
start_date = st.sidebar.date_input("Start Date", last_month)
end_date = st.sidebar.date_input("End Date", today)
# Filter data by date range
df['Date'] = pd.to_datetime(df['Date'])
df_filtered = df[(df['Date'] >= pd.to_datetime(start_date)) & (df['Date'] <= pd.to_datetime(end_date))]
# Track if any category exceeds its budget
df_filtered['Budget_Exceeded'] = df_filtered.apply(lambda row: row['Amount'] > budgets.get(row['Category'], 0), axis=1)
# Show categories that exceeded their budget
exceeded_budget = df_filtered[df_filtered['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_filtered.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_filtered['Month'] = df_filtered['Date'].dt.to_period('M').astype(str) # Convert Period to string for Plotly compatibility
monthly_expenses = df_filtered.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
})
fig3 = monthly_expenses_df.plot(kind='bar', figsize=(10, 6))
st.pyplot(fig3)
|