File size: 3,495 Bytes
f698b3b
 
 
 
 
 
 
 
 
 
c9b55f8
f698b3b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import os
import pandas as pd
import gradio as gr
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_experimental.agents import create_pandas_dataframe_agent
from langchain_core.prompts import PromptTemplate
# Set up API key for Google Gemini
os.environ["GOOGLE_API_KEY"] = "AIzaSyDSorjiEVV2KCWelkDLFxQsju3KDQOF344"  # Replace with actual API key

# Initialize the LLM
llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash")

# Placeholder for agent and dataframe
agent = None
df = None

# Define the function to handle CSV uploads and set up the LangChain agent
def handle_file_upload(file):
    global agent, df
    # Check if file has .csv extension
    if not file.name.endswith(".csv"):
        return "Error: Please upload a valid CSV file.", None
    
    # Load the uploaded file into a DataFrame
    try:
        df = pd.read_csv(file)  # Read directly from the file object
        # Create a new LangChain agent with the uploaded DataFrame
        agent = create_pandas_dataframe_agent(llm, df, verbose=True, allow_dangerous_code=True)
        return "CSV uploaded successfully. You can now ask questions about the data.", df
    except Exception as e:
        return f"Error reading CSV file: {e}", None

# Define the function to process the user query
def answer_query(query):
    if agent is None:
        return "Please upload a CSV file first."
    
    # Invoke the agent with the query

    formatted_query = PromptTemplate.from_template(
'''
Please act as a data analyst and respond to my queries with insights from the provided dataset.
If your response involves numeric data or comparisons, format the answer in a clear tabular form whenever 
it enhances readability and clarity.
Provide analyses that highlight trends, patterns, and notable details in the data, and use tabular format 
for presenting summaries, comparisons, or grouped data and whenever user asks listing or something similar
to help illustrate your findings effectively. Additionally, interpret any findings with context and data-driven 
reasoning as a skilled data analyst would. Also make sure not to give any data that is not asked by the user or
not relevant to the given context
Keep the above said details in mind and answer the below query:
Query: 
{query}
'''
    )
    response = agent.invoke(query)
    
    # Check if the response contains tabular data
    if isinstance(response, pd.DataFrame):
        return response  # Display as table if it's a DataFrame
    else:
        # Format response as Markdown
        return f"**Response:**\n\n{response['output']}"

# Create the Gradio interface
with gr.Blocks() as iface:
    gr.Markdown("# ZEN-Analyser")
    gr.Markdown("Upload a CSV file to view the data and ask questions about it.")
    
    # File upload component
    file_input = gr.File(label="Upload CSV", file_types=[".csv"])
    # Dataframe display for the uploaded CSV
    data_output = gr.DataFrame(label="Uploaded Data")
    # Textbox for entering queries
    query_input = gr.Textbox(label="Enter your query")
    # Markdown component for displaying the agent's response with Markdown support
    response_output = gr.Markdown(label="Response")
    
    # Button to trigger query processing
    query_button = gr.Button("Submit Query")

    # Define event actions
    file_input.upload(handle_file_upload, file_input, [response_output, data_output])
    query_button.click(answer_query, query_input, response_output)

# Launch the Gradio app
iface.launch()