Personal Finance Manager
To upload files, please first save the app
import streamlit as st
import pandas as pd
import plotly.express as px
from datetime import datetime
from sqlalchemy import create_engine, Column, Integer, Float, String, Date
from sqlalchemy.orm import DeclarativeBase, Session
# Database setup
class Base(DeclarativeBase):
pass
class Transaction(Base):
__tablename__ = 'transactions'
id = Column(Integer, primary_key=True)
date = Column(Date, nullable=False)
category = Column(String, nullable=False)
amount = Column(Float, nullable=False)
description = Column(String)
# Create database and tables
engine = create_engine('sqlite:///finance.sqlite')
Base.metadata.create_all(bind=engine)
# Page config
st.set_page_config(page_title="Personal Finance Manager", layout="wide")
st.title("Personal Finance Manager 💰")
# Sidebar for adding transactions
with st.sidebar:
st.header("Add New Transaction")
# Transaction form
with st.form("transaction_form"):
date = st.date_input("Date", datetime.now())
category = st.selectbox(
"Category",
["Food", "Transportation", "Housing", "Entertainment", "Shopping", "Healthcare", "Other"]
)
amount = st.number_input("Amount", min_value=0.0, step=0.01)
description = st.text_input("Description")
submit = st.form_submit_button("Add Transaction")
if submit:
with Session(engine) as session:
transaction = Transaction(
date=date,
category=category,
amount=amount,
description=description
)
session.add(transaction)
session.commit()
st.success("Transaction added successfully!")
# Main content
tab1, tab2 = st.tabs(["Transactions", "Analytics"])
with tab1:
# Display transactions
with Session(engine) as session:
transactions = session.query(Transaction).all()
if transactions:
df = pd.DataFrame([
{
"Date": t.date,
"Category": t.category,
"Amount": t.amount,
"Description": t.description
}
for t in transactions
])
st.dataframe(
df.sort_values("Date", ascending=False),
use_container_width=True,
hide_index=True
)
else:
st.info("No transactions recorded yet. Add your first transaction using the sidebar!")
with tab2:
if transactions:
col1, col2 = st.columns(2)
with col1:
# Spending by category pie chart
fig1 = px.pie(
df,
values="Amount",
names="Category",
title="Spending by Category"
)
st.plotly_chart(fig1, use_container_width=True)
with col2:
# Spending over time line chart
fig2 = px.line(
df.groupby("Date")["Amount"].sum().reset_index(),
x="Date",
y="Amount",
title="Daily Spending"
)
st.plotly_chart(fig2, use_container_width=True)
# Summary statistics
st.subheader("Summary Statistics")
total_spent = df["Amount"].sum()
avg_transaction = df["Amount"].mean()
num_transactions = len(df)
col1, col2, col3 = st.columns(3)
col1.metric("Total Spent", f"${total_spent:.2f}")
col2.metric("Average Transaction", f"${avg_transaction:.2f}")
col3.metric("Number of Transactions", num_transactions)
# Category breakdown
st.subheader("Category Breakdown")
category_stats = df.groupby("Category")["Amount"].agg(["sum", "mean", "count"]).round(2)
category_stats.columns = ["Total Amount", "Average Amount", "Number of Transactions"]
st.dataframe(category_stats, use_container_width=True)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?