from pandasai.llm import GoogleGemini import streamlit as st import os import pandas as pd from pandasai import SmartDataframe from pandasai.responses.response_parser import ResponseParser from st_on_hover_tabs import on_hover_tabs from ydata_profiling import ProfileReport import google.generativeai as genai import json class StreamLitResponse(ResponseParser): def __init__(self,context) -> None: super().__init__(context) def format_dataframe(self,result): st.dataframe(result['value']) return def format_plot(self,result): st.image(result['value']) return def format_other(self, result): st.write(result['value']) return gemini_api_key = os.environ['Gemini'] genai.configure(api_key=gemini_api_key) generation_config = { "temperature": 0.2, "top_p": 0.95, "max_output_tokens": 5000, } model = genai.GenerativeModel( model_name="gemini-1.5-flash", generation_config=generation_config, ) def get_pandas_profile(df): profile = ProfileReport(df, title="Profiling Report") json_profile = profile.to_json() dict_p = json.loads(json_profile) keys_to_keep = ['analysis', 'table', 'correlations', 'alerts', 'sample'] # Assuming your dictionary is named 'my_dict' filtered_dict = {key: dict_p[key] for key in keys_to_keep} return filtered_dict def generateResponse(dataFrame,prompt): llm = GoogleGemini(api_key=gemini_api_key) pandas_agent = SmartDataframe(dataFrame,config={"llm":llm, "response_parser":StreamLitResponse}) answer = pandas_agent.chat(prompt) return answer st.write("# QuantBeta Insights") st.markdown('', unsafe_allow_html=True) st.write("##### Engage in insightful conversations with your data") with st.sidebar: st.title("QuantBeta Insights") st.sidebar.image("logoqb.jpeg", use_column_width=True) tabs = on_hover_tabs(tabName=['Chat', 'Reports'], iconName=['chat', 'dashboard'], default_choice=0) uploaded_file = "64Qbeta.csv" #uploaded_file = "healthcare_dataset.csv" if tabs =='Chat': df = pd.read_csv(uploaded_file) st.subheader("QuantBeta AI assistant") st.write("Get visualizations and analysis from our Gemini powered agent") # Read the CSV file #df = pd.read_csv(uploaded_file) # Display the data with st.expander("Preview"): st.write(df.head()) # Plot the data user_input = st.text_input("Type your message here",placeholder="Ask me about your data") if user_input: answer = generateResponse(dataFrame=df,prompt=user_input) st.write(answer) elif tabs == 'Reports': df = pd.read_csv(uploaded_file) # Streamlit App st.subheader("Reports") st.write("Filter by Incubator to generate report") # Display original # Filtering Interface st.write("Filtering Options") branch_names = df['Incubator Name'].unique().tolist() #product_names = df['Description'].unique().tolist() selected_branches = st.multiselect('Select incubator(s) Name(s)', branch_names, default=branch_names) #selected_products = st.multiselect('Select product(s) Name', product_names, default=product_names) # Button to apply filters if st.button('Apply Filters and Generate report'): df = pd.read_csv(uploaded_file) filtered_df = df.copy() # Apply Branch Name Filter if selected_branches: filtered_df = filtered_df[filtered_df['Incubator Name'].isin(selected_branches)] # Apply Description Filter #if selected_products: # filtered_df = filtered_df[filtered_df['Product_Name'].isin(selected_products)] # Display filtered DataFrame st.write("Filtered DataFrame") with st.expander("Preview"): st.write(filtered_df.head()) with st.spinner("Generating Report, Please Wait...."): prompt = """ You are an expert business analyst. Analyze the following data and generate a comprehensive and insightful business report, including appropriate key perfomance indicators and recommendations. data: """ + str(filtered_df.to_json(orient='records')) response = model.generate_content(prompt) response2 = generateResponse(filtered_df, "pie chart of number of hours by incubator") report = response.text st.markdown(report) # Display the generated images st.success("Report Generated!") else: st.write("Filtered DataFrame") st.write("Click 'Apply Filters' to see the filtered data.")