fin-ai / pages /dashboard-page.py
walaa2022's picture
Update pages/dashboard-page.py
36f6a1d verified
raw
history blame
7.23 kB
import streamlit as st
import plotly.express as px
import pandas as pd
import google.generativeai as genai
def render_financial_dashboard(startup_data, cash_flow_df):
"""Render financial dashboard page."""
st.title("Financial Dashboard")
# Key metrics
col1, col2, col3, col4 = st.columns(4)
# Calculate runway
runway_months, runway_df = calculate_runway(
startup_data['cash'],
startup_data['burn_rate'],
startup_data['revenue'],
startup_data['growth_rate']
)
with col1:
st.metric("Current Cash", f"${startup_data['cash']:,}")
with col2:
st.metric("Monthly Burn", f"${startup_data['burn_rate']:,}")
with col3:
st.metric("Monthly Revenue", f"${startup_data['revenue']:,}")
with col4:
st.metric("Runway", f"{runway_months} months")
# Financial charts
st.subheader("Financial Overview")
tab1, tab2, tab3 = st.tabs(["Runway Projection", "Revenue vs. Expenses", "Burn Rate Trend"])
with tab1:
# Runway projection chart
fig = px.line(runway_df.reset_index(), x='index', y='Cumulative_Cash',
title="Cash Runway Projection",
labels={'index': 'Date', 'Cumulative_Cash': 'Remaining Cash'})
fig.add_hline(y=0, line_dash="dash", line_color="red")
fig.update_layout(height=400)
st.plotly_chart(fig, use_container_width=True)
# Get analysis from Gemini
try:
if setup_genai():
with st.expander("AI Financial Analysis"):
analysis = get_runway_analysis(startup_data)
st.write(analysis)
except Exception as e:
st.error(f"Error generating AI analysis: {e}")
with tab2:
# Revenue vs Expenses chart
rev_exp_df = cash_flow_df.copy()
fig = px.bar(rev_exp_df, x='Month', y=['Revenue', 'Total_Expenses'],
title="Revenue vs. Expenses",
barmode='group',
labels={'value': 'Amount ($)', 'variable': 'Category'})
fig.update_layout(height=400)
st.plotly_chart(fig, use_container_width=True)
with tab3:
# Burn rate trend
fig = px.line(cash_flow_df, x='Month', y='Net_Burn',
title="Monthly Net Burn Trend",
labels={'Net_Burn': 'Net Burn ($)'})
fig.update_layout(height=400)
st.plotly_chart(fig, use_container_width=True)
# Expense breakdown
st.subheader("Expense Breakdown")
# Last month expenses
last_month = cash_flow_df.iloc[-1]
expense_categories = ['Payroll', 'Marketing', 'Office', 'Software', 'Travel', 'Legal', 'Misc']
expense_values = [last_month[cat] for cat in expense_categories]
fig = px.pie(values=expense_values, names=expense_categories,
title="Current Month Expense Breakdown")
fig.update_layout(height=400)
st.plotly_chart(fig, use_container_width=True)
def calculate_runway(initial_cash, monthly_burn, monthly_revenue, growth_rate, months=24):
"""Calculate runway based on current burn rate and revenue growth."""
from datetime import datetime, timedelta
import pandas as pd
dates = [datetime.now() + timedelta(days=30*i) for i in range(months)]
df = pd.DataFrame(index=dates, columns=['Cash', 'Revenue', 'Expenses', 'Net_Burn', 'Cumulative_Cash'])
current_cash = initial_cash
current_revenue = monthly_revenue
df.iloc[0, df.columns.get_loc('Cash')] = current_cash
df.iloc[0, df.columns.get_loc('Revenue')] = current_revenue
df.iloc[0, df.columns.get_loc('Expenses')] = monthly_burn
df.iloc[0, df.columns.get_loc('Net_Burn')] = monthly_burn - current_revenue
df.iloc[0, df.columns.get_loc('Cumulative_Cash')] = current_cash
runway_months = months
for i in range(1, months):
current_revenue = current_revenue * (1 + growth_rate)
net_burn = monthly_burn - current_revenue
current_cash = current_cash - net_burn
df.iloc[i, df.columns.get_loc('Cash')] = current_cash
df.iloc[i, df.columns.get_loc('Revenue')] = current_revenue
df.iloc[i, df.columns.get_loc('Expenses')] = monthly_burn
df.iloc[i, df.columns.get_loc('Net_Burn')] = net_burn
df.iloc[i, df.columns.get_loc('Cumulative_Cash')] = current_cash
if current_cash <= 0:
runway_months = i
break
return runway_months, df
def get_runway_analysis(financial_data):
"""Get runway analysis using Gemini."""
try:
prompt = f"""
You are a financial advisor for startups. Analyze this startup's financial data:
- Current cash: ${financial_data['cash']}
- Monthly burn rate: ${financial_data['burn_rate']}
- Monthly revenue: ${financial_data['revenue']}
- Monthly growth rate: {financial_data['growth_rate'] * 100}%
Calculate and explain their runway, financial health, and recommendations in a concise paragraph.
"""
model = genai.GenerativeModel('gemini-pro')
response = model.generate_content(prompt)
return response.text
except Exception as e:
return f"Error generating runway analysis: {e}"
def get_fundraising_readiness_analysis(financial_data):
"""Analyze startup's readiness for fundraising."""
try:
prompt = f"""
You are a fundraising advisor for startups. Evaluate this startup's fundraising readiness:
- Current cash: ${financial_data['cash']}
- Monthly burn rate: ${financial_data['burn_rate']}
- Monthly revenue: ${financial_data['revenue']}
- Monthly growth rate: {financial_data['growth_rate'] * 100}%
- Last funding: {financial_data.get('last_funding', 'Not specified')}
- Company stage: {financial_data.get('stage', 'Not specified')}
Provide insights on:
1. Current runway and funding needs
2. Attractiveness to potential investors
3. Recommended fundraising strategy
4. Key metrics to improve before fundraising
Respond in a concise, actionable paragraph.
"""
model = genai.GenerativeModel('gemini-pro')
response = model.generate_content(prompt)
return response.text
except Exception as e:
return f"Error generating fundraising readiness analysis: {e}"
def setup_genai():
"""Setup Google Generative AI"""
try:
import os
import streamlit as st
# Try getting API key from Streamlit secrets first
if 'GOOGLE_API_KEY' in st.secrets:
api_key = st.secrets['GOOGLE_API_KEY']
# Fall back to environment variable
elif 'GOOGLE_API_KEY' in os.environ:
api_key = os.environ['GOOGLE_API_KEY']
else:
st.warning("Google API key not found. Using simulated AI responses.")
return False
genai.configure(api_key=api_key)
return True
except Exception as e:
st.error(f"Error setting up Generative AI: {e}")
return False