Spaces:
Sleeping
Sleeping
import streamlit as st | |
import os | |
import psycopg2 as pgsql | |
import pandas as pd | |
import plotly.express as px | |
from dotenv import load_dotenv | |
import google.generativeai as genai | |
# Load environment variables | |
load_dotenv() | |
# Configure Genai Key | |
genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) | |
# Function to load Google Gemini Model and provide queries as response | |
def get_gemini_response(question, prompt): | |
model = genai.GenerativeModel('gemini-pro') | |
response = model.generate_content([prompt[0], question]) | |
return response.text.strip() | |
# Function to retrieve query from the database | |
def read_sql_query(sql, db_params): | |
try: | |
conn = pgsql.connect(**db_params) | |
cur = conn.cursor() | |
cur.execute(sql) | |
rows = cur.fetchall() | |
colnames = [desc[0] for desc in cur.description] if cur.description else [] | |
conn.commit() | |
cur.close() | |
conn.close() | |
df = pd.DataFrame(rows, columns=colnames) | |
# Convert 'price' column to numeric if it exists | |
if 'price' in df.columns: | |
df['price'] = pd.to_numeric(df['price'], errors='coerce') | |
return df | |
except Exception as e: | |
st.error(f"An error occurred: {e}") | |
return pd.DataFrame() | |
# Define your PostgreSQL connection parameters | |
db_params = { | |
'dbname': 'GeminiPro', | |
'user': 'postgres', | |
'password': 'root', | |
'host': 'localhost', | |
'port': 5432 | |
} | |
# Define Your Prompt | |
prompt = [ | |
""" | |
You are an expert in converting English questions to SQL queries! | |
The SQL database has a table named 'department_store' with the following columns: | |
id, product_name, category, price, stock_quantity, supplier, last_restock_date. | |
Examples: | |
- How many products do we have in total? | |
The SQL command will be: SELECT COUNT(*) FROM department_store; | |
- What are all the products in the Electronics category? | |
The SQL command will be: SELECT * FROM department_store WHERE category = 'Electronics'; | |
The SQL code should not include backticks and should not start with the word 'SQL'. | |
""" | |
] | |
# Streamlit App | |
st.set_page_config(page_title="AutomatiX - Department Store Analytics", layout="wide") | |
# Sidebar for user input | |
st.sidebar.title("AutomatiX - Department Store Chat Interface") | |
question = st.sidebar.text_area("Enter your question:", key="input") | |
submit = st.sidebar.button("Ask Me") | |
# Main content area | |
st.title("AutomatiX - Department Store Dashboard") | |
if submit: | |
with st.spinner("Generating and fetching data..."): | |
sql_query = get_gemini_response(question, prompt) | |
# st.code(sql_query, language="sql") | |
df = read_sql_query(sql_query, db_params) | |
if not df.empty: | |
st.success("Query executed successfully!") | |
# Display data in a table | |
st.subheader("Data Table") | |
st.dataframe(df) | |
# Create visualizations based on the data | |
st.subheader("Data Visualizations") | |
col1, col2 = st.columns(2) | |
with col1: | |
if 'price' in df.columns and df['price'].notna().any(): | |
fig = px.histogram(df, x='price', title='Price Distribution') | |
st.plotly_chart(fig, use_container_width=True) | |
if 'category' in df.columns: | |
category_counts = df['category'].value_counts() | |
fig = px.pie(values=category_counts.values, names=category_counts.index, title='Products by Category') | |
st.plotly_chart(fig, use_container_width=True) | |
with col2: | |
if 'last_restock_date' in df.columns: | |
df['last_restock_date'] = pd.to_datetime(df['last_restock_date'], errors='coerce') | |
df['restock_month'] = df['last_restock_date'].dt.to_period('M') | |
restock_counts = df['restock_month'].value_counts().sort_index() | |
fig = px.line(x=restock_counts.index.astype(str), y=restock_counts.values, title='Restocking Trend') | |
st.plotly_chart(fig, use_container_width=True) | |
if 'product_name' in df.columns and 'price' in df.columns and df['price'].notna().any(): | |
top_prices = df.sort_values('price', ascending=False).head(10) | |
fig = px.bar(top_prices, x='product_name', y='price', title='Top 10 Most Expensive Products') | |
st.plotly_chart(fig, use_container_width=True) | |
else: | |
st.warning("No data returned from the query.") | |
else: | |
st.info("Enter a question and click 'Ask Me' to get started!") | |
# Footer | |
st.sidebar.markdown("---") | |
st.sidebar.info("You can ask questions like:\n" | |
"1.What are all the products in the Electronics category?\n" | |
"2.What is the average price of products in each category?\n" | |
"3.Which products have a stock quantity less than 30?\n" | |
"4.What are the top 5 most expensive products?") | |
st.sidebar.warning("CopyRights@AutomatiX - Powered by Streamlit and Google Gemini") |