BizIntel_AI / app.py
mgbam's picture
Update app.py
3acbc9c verified
raw
history blame
4.34 kB
import os
import tempfile
import pandas as pd
import streamlit as st
import google.generativeai as genai
import plotly.graph_objects as go
from tools.csv_parser import parse_csv_tool
from tools.plot_generator import plot_sales_tool
from tools.forecaster import forecast_tool
from tools.visuals import (
histogram_tool,
scatter_matrix_tool,
corr_heatmap_tool,
)
# ── Gemini 1.5‑Pro configuration ─────────────────────────────
genai.configure(api_key=os.getenv("GEMINI_APIKEY"))
gemini = genai.GenerativeModel(
"gemini-1.5-pro-latest",
generation_config={
"temperature": 0.7,
"top_p": 0.9,
"response_mime_type": "text/plain",
},
)
# ── Streamlit page setup ─────────────────────────────────────
st.set_page_config(page_title="BizIntel AI Ultra – GeminiΒ 1.5Β Pro", layout="wide")
st.title("πŸ“Š BizIntelΒ AIΒ Ultra – Advanced Analytics")
TEMP_DIR = tempfile.gettempdir()
# ── CSV upload ───────────────────────────────────────────────
csv_file = st.file_uploader("Upload CSV (≀ 200β€―MB)", type=["csv"])
if csv_file is None:
st.info("⬆️ Upload a CSV to begin.")
st.stop()
csv_path = os.path.join(TEMP_DIR, csv_file.name)
with open(csv_path, "wb") as f:
f.write(csv_file.read())
st.success("CSV saved βœ…")
# Preview + date column selection
df_preview = pd.read_csv(csv_path, nrows=5)
st.dataframe(df_preview)
date_col = st.selectbox("Select date/time column for forecasting", df_preview.columns)
# ── Local tools: summary, sales trend, forecast ──────────────
with st.spinner("Parsing CSV…"):
summary_text = parse_csv_tool(csv_path)
with st.spinner("Generating sales trend chart…"):
sales_fig = plot_sales_tool(csv_path, date_col=date_col)
st.plotly_chart(sales_fig, use_container_width=True)
with st.spinner("Forecasting future metrics…"):
forecast_text = forecast_tool(csv_path, date_col=date_col)
if os.path.exists("forecast_plot.png"):
forecast_img = "forecast_plot.png"
else:
forecast_img = None
# ── Gemini strategy insights ─────────────────────────────────
prompt = (
f"You are **BizIntel Strategist AI**.\n\n"
f"### CSV Summary\n```\n{summary_text}\n```\n\n"
f"### Forecast Output\n```\n{forecast_text}\n```\n\n"
"Return Markdown with:\n"
"1. **Five key insights** (bullet list)\n"
"2. **Three actionable strategies** (with expected impact)\n"
"3. **Risk factors or anomalies**\n"
"4. **Suggested additional visuals**\n"
)
st.subheader("πŸš€ Strategy Recommendations (GeminiΒ 1.5Β Pro)")
with st.spinner("GeminiΒ 1.5Β Pro is generating insights…"):
strategy_md = gemini.generate_content(prompt).text
st.markdown(strategy_md)
# Display forecast image if exists
if forecast_img:
st.image(forecast_img, caption="Sales Forecast", use_column_width=True)
# ── Optional exploratory visuals ─────────────────────────────
st.markdown("---")
st.subheader("πŸ” Optional Exploratory Visuals")
num_cols = df_preview.select_dtypes("number").columns
# Histogram
if st.checkbox("Show histogram"):
hist_col = st.selectbox("Histogram variable", num_cols, key="hist")
fig_hist = histogram_tool(csv_path, hist_col)
st.plotly_chart(fig_hist, use_container_width=True)
# Scatter‑matrix
if st.checkbox("Show scatter‑matrix"):
multi_cols = st.multiselect("Choose up to 5 columns", num_cols, default=num_cols[:3])
if multi_cols:
fig_scatter = scatter_matrix_tool(csv_path, multi_cols)
st.plotly_chart(fig_scatter, use_container_width=True)
# Correlation heat‑map
if st.checkbox("Show correlation heat‑map"):
fig_corr = corr_heatmap_tool(csv_path)
st.plotly_chart(fig_corr, use_container_width=True)
# ── CSV summary text at bottom ───────────────────────────────
st.markdown("---")
st.subheader("πŸ“‘ CSV Summary (full Stats)")
st.text(summary_text)