Spaces:
Running
Running
import streamlit as st | |
import streamlit.components.v1 as components | |
import plotly.express as px | |
import plotly.graph_objects as go | |
import numpy as np | |
from datetime import datetime | |
from data_processor import DataProcessor | |
from brainstorm_manager import BrainstormManager | |
from chatbot import ChatbotManager | |
from utils import generate_sample_data | |
def render_home(): | |
st.title("π Welcome to Prospira") | |
st.subheader("π Data-Driven Solutions for Businesses and Creators") | |
st.markdown(""" | |
**Prospira** empowers businesses and creators to enhance their content, products, and marketing strategies using AI-driven insights. | |
### **β¨ Key Features** | |
- **π Performance Analytics:** Real-time insights into business metrics. | |
- **π Competitive Analysis:** Benchmark your business against competitors. | |
- **π‘ Smart Product Ideas:** AI-generated recommendations for future products and content. | |
- **π§ AI Business Mentor:** Personalized AI guidance for strategy and growth. | |
Explore how **Prospira** can help optimize your decision-making and drive success! π‘π | |
""") | |
def render_dashboard(): | |
st.header("π Comprehensive Business Performance Dashboard") | |
# Generate sample data with more complex structure | |
data = generate_sample_data() | |
data['Profit_Margin'] = data['Revenue'] * np.random.uniform(0.1, 0.3, len(data)) | |
# Top-level KPI Section | |
col1, col2, col3, col4 = st.columns(4) | |
with col1: | |
st.metric("Total Revenue", | |
f"${data['Revenue'].sum():,.2f}", | |
delta=f"{data['Revenue'].pct_change().mean()*100:.2f}%") | |
with col2: | |
st.metric("Total Users", | |
f"{data['Users'].sum():,}", | |
delta=f"{data['Users'].pct_change().mean()*100:.2f}%") | |
with col3: | |
st.metric("Avg Engagement", | |
f"{data['Engagement'].mean():.2%}", | |
delta=f"{data['Engagement'].pct_change().mean()*100:.2f}%") | |
with col4: | |
st.metric("Profit Margin", | |
f"{data['Profit_Margin'].mean():.2%}", | |
delta=f"{data['Profit_Margin'].pct_change().mean()*100:.2f}%") | |
# Visualization Grid | |
col1, col2 = st.columns(2) | |
with col1: | |
st.subheader("Revenue & Profit Trends") | |
fig_revenue = go.Figure() | |
fig_revenue.add_trace(go.Scatter( | |
x=data['Date'], | |
y=data['Revenue'], | |
mode='lines', | |
name='Revenue', | |
line=dict(color='blue') | |
)) | |
fig_revenue.add_trace(go.Scatter( | |
x=data['Date'], | |
y=data['Profit_Margin'], | |
mode='lines', | |
name='Profit Margin', | |
line=dict(color='green') | |
)) | |
fig_revenue.update_layout(height=350) | |
st.plotly_chart(fig_revenue, use_container_width=True) | |
with col2: | |
st.subheader("User Engagement Analysis") | |
fig_engagement = px.scatter( | |
data, | |
x='Users', | |
y='Engagement', | |
color='Category', | |
size='Revenue', | |
hover_data=['Date'], | |
title='User Engagement Dynamics' | |
) | |
fig_engagement.update_layout(height=350) | |
st.plotly_chart(fig_engagement, use_container_width=True) | |
# Category Performance | |
st.subheader("Category Performance Breakdown") | |
category_performance = data.groupby('Category').agg({ | |
'Revenue': 'sum', | |
'Users': 'sum', | |
'Engagement': 'mean' | |
}).reset_index() | |
fig_category = px.bar( | |
category_performance, | |
x='Category', | |
y='Revenue', | |
color='Engagement', | |
title='Revenue by Category with Engagement Overlay' | |
) | |
st.plotly_chart(fig_category, use_container_width=True) | |
# Bottom Summary | |
st.subheader("Quick Insights") | |
insights_col1, insights_col2 = st.columns(2) | |
with insights_col1: | |
st.metric("Top Performing Category", | |
category_performance.loc[category_performance['Revenue'].idxmax(), 'Category']) | |
with insights_col2: | |
st.metric("Highest Engagement Category", | |
category_performance.loc[category_performance['Engagement'].idxmax(), 'Category']) | |
def render_analytics(): | |
st.header("π Data Analytics") | |
processor = DataProcessor() | |
uploaded_file = st.file_uploader("Upload your CSV data", type=['csv']) | |
if uploaded_file is not None: | |
if processor.load_data(uploaded_file): | |
st.success("Data loaded successfully!") | |
tabs = st.tabs(["Data Preview", "Statistics", "Visualization", "Metrics"]) | |
with tabs[0]: | |
st.subheader("Data Preview") | |
st.dataframe(processor.data.head()) | |
st.info(f"Total rows: {len(processor.data)}, Total columns: {len(processor.data.columns)}") | |
with tabs[1]: | |
st.subheader("Basic Statistics") | |
stats = processor.get_basic_stats() | |
st.write(stats['summary']) | |
st.subheader("Missing Values") | |
st.write(stats['missing_values']) | |
with tabs[2]: | |
st.subheader("Create Visualization") | |
col1, col2, col3 = st.columns(3) | |
with col1: | |
chart_type = st.selectbox( | |
"Select Chart Type", | |
["Line Plot", "Bar Plot", "Scatter Plot", "Box Plot", "Histogram"] | |
) | |
with col2: | |
x_col = st.selectbox("Select X-axis", processor.data.columns) | |
with col3: | |
y_col = st.selectbox("Select Y-axis", processor.numeric_columns) if chart_type != "Histogram" else None | |
color_col = st.selectbox("Select Color Variable (optional)", | |
['None'] + processor.categorical_columns) | |
color_col = None if color_col == 'None' else color_col | |
fig = processor.create_visualization( | |
chart_type, | |
x_col, | |
y_col if y_col else x_col, | |
color_col | |
) | |
st.plotly_chart(fig, use_container_width=True) | |
with tabs[3]: | |
st.subheader("Column Metrics") | |
selected_col = st.selectbox("Select column", processor.numeric_columns) | |
metrics = { | |
'Mean': processor.data[selected_col].mean(), | |
'Median': processor.data[selected_col].median(), | |
'Std Dev': processor.data[selected_col].std(), | |
'Min': processor.data[selected_col].min(), | |
'Max': processor.data[selected_col].max() | |
} | |
cols = st.columns(len(metrics)) | |
for col, (metric, value) in zip(cols, metrics.items()): | |
col.metric(metric, f"{value:.2f}") | |
def render_brainstorm_page(): | |
st.title("Product Brainstorm Hub") | |
manager = BrainstormManager() | |
action = st.sidebar.radio("Action", ["View Products", "Create New Product"]) | |
if action == "Create New Product": | |
basic_info, market_analysis, submitted = manager.generate_product_form() | |
if submitted: | |
product_data = {**basic_info, **market_analysis} | |
insights = manager.analyze_product(product_data) | |
product_id = f"prod_{len(st.session_state.products)}" | |
st.session_state.products[product_id] = { | |
"data": product_data, | |
"insights": insights, | |
"created_at": str(datetime.now()) | |
} | |
st.success("Product added! View insights in the Products tab.") | |
else: | |
if st.session_state.products: | |
for prod_id, product in st.session_state.products.items(): | |
with st.expander(f"π― {product['data']['name']}"): | |
col1, col2 = st.columns(2) | |
with col1: | |
st.subheader("Product Details") | |
st.write(f"Category: {product['data']['category']}") | |
st.write(f"Target: {', '.join(product['data']['target_audience'])}") | |
st.write(f"Description: {product['data']['description']}") | |
with col2: | |
st.subheader("Insights") | |
st.metric("Opportunity Score", f"{product['insights']['market_opportunity']}/10") | |
st.metric("Suggested Price", f"${product['insights']['suggested_price']}") | |
st.write("**Risk Factors:**") | |
for risk in product['insights']['risk_factors']: | |
st.write(f"- {risk}") | |
st.write("**Next Steps:**") | |
for step in product['insights']['next_steps']: | |
st.write(f"- {step}") | |
else: | |
st.info("No products yet. Create one to get started!") | |
# Update the render_chat function in pages.py | |
def render_chat(chatbot_manager): | |
st.header("π¬ AI Business Mentor") | |
# Sidebar options | |
with st.sidebar: | |
if st.button("Clear Chat History"): | |
chatbot_manager.clear_chat() | |
st.rerun() | |
# Render the chat interface using the manager | |
chatbot_manager.render_chat_interface() | |
# Additional helpful sections | |
st.markdown("---") | |
st.subheader("π‘ Quick Business Topics") | |
col1, col2, col3 = st.columns(3) | |
with col1: | |
if st.button("π Business Strategy"): | |
chatbot_manager.add_message("user", "I need help with business strategy") | |
response = chatbot_manager.generate_response("I need help with business strategy") | |
chatbot_manager.add_message("assistant", response) | |
st.rerun() | |
with col2: | |
if st.button("π Marketing Tips"): | |
chatbot_manager.add_message("user", "Give me marketing advice") | |
response = chatbot_manager.generate_response("Give me marketing advice") | |
chatbot_manager.add_message("assistant", response) | |
st.rerun() | |
with col3: | |
if st.button("π° Financial Planning"): | |
chatbot_manager.add_message("user", "Help with financial planning") | |
response = chatbot_manager.generate_response("Help with financial planning") | |
chatbot_manager.add_message("assistant", response) | |
st.rerun() | |
# Optional: Keep the iframe as alternative | |
st.markdown("---") | |
st.subheader("π Alternative Chat Interface") | |
st.info("You can also use the external chat interface below:") | |