budget / app.py
Prixie22's picture
Update app.py
56c1037 verified
import pandas as pd
import gradio as gr
import plotly.express as px
def calculate_budget(income, currency, needs_pct, wants_pct, savings_pct):
if needs_pct + wants_pct + savings_pct != 100:
return gr.Markdown("❌ **Percentages must total 100%**"), None, None
symbols = {
"USD": "$",
"INR": "₹",
"EUR": "€",
"GBP": "£",
"AUD": "A$",
"CAD": "C$",
}
sym = symbols.get(currency, "")
data = {
"Needs": income * needs_pct / 100,
"Wants": income * wants_pct / 100,
"Savings": income * savings_pct / 100,
}
df = pd.DataFrame(
{
"Category": data.keys(),
"Amount": data.values(),
}
)
fig = px.pie(
df,
names="Category",
values="Amount",
title="Budget Allocation",
hole=0.4,
)
summary = f"""
### 💸 Monthly Budget Summary
- **Income:** {sym}{income:,.0f}
- **Needs:** {sym}{data['Needs']:,.0f}
- **Wants:** {sym}{data['Wants']:,.0f}
- **Savings:** {sym}{data['Savings']:,.0f}
✅ Allocation looks good!
"""
csv = df.to_csv(index=False)
return gr.Markdown(summary), fig, csv
with gr.Blocks(theme=gr.themes.Soft(), title="Monthly Budget Tracker") as demo:
gr.Markdown(
"""
## 💸 Monthly Budget Tracker
Plan your money using the **50 / 30 / 20 rule** or customize it to your life.
"""
)
with gr.Row():
income = gr.Number(label="Monthly Income", value=5000)
currency = gr.Dropdown(
["USD", "INR", "EUR", "GBP", "AUD", "CAD"],
value="INR",
label="Currency",
)
gr.Markdown("### 🎯 Allocation (%)")
with gr.Row():
needs = gr.Slider(0, 100, value=50, label="Needs")
wants = gr.Slider(0, 100, value=30, label="Wants")
savings = gr.Slider(0, 100, value=20, label="Savings")
calculate_btn = gr.Button("✨ Calculate Budget", variant="primary")
with gr.Row():
output_md = gr.Markdown()
with gr.Row():
output_chart = gr.Plot()
with gr.Row():
output_csv = gr.File(label="📥 Download CSV")
calculate_btn.click(
calculate_budget,
inputs=[income, currency, needs, wants, savings],
outputs=[output_md, output_chart, output_csv],
)
demo.launch()