Skip to content

Commit 996dbc8

Browse files
committed
PandasAI
1 parent 76daeb5 commit 996dbc8

7 files changed

+2651
-0
lines changed

PandasAI/charttest.py

+179
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
# OPENAI_API_KEY = "k-mtujzCGAyXF5x2gLcLBDT3BlbkFJVLdrDwDxsKnpEkhzV7t"
2+
import sys
3+
import csv
4+
import pandas as pd
5+
import matplotlib # Add this import
6+
# matplotlib.use('QtAgg')
7+
import matplotlib.pyplot as plt
8+
# from io import BytesIO
9+
# from PIL import Image
10+
from pandasai import PandasAI
11+
from pandasai.llm.openai import OpenAI
12+
from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QTextBrowser, QTextEdit, QPushButton, QFileDialog, QTableWidget, QTableWidgetItem, QLabel
13+
14+
from PyQt6.QtCore import Qt
15+
import os
16+
from PyQt6.QtGui import QPixmap
17+
18+
# matplotlib.use('Agg') # Move this line here
19+
20+
21+
22+
class ChatWindow(QMainWindow):
23+
def __init__(self):
24+
super().__init__()
25+
26+
self.setWindowTitle("Chat Window")
27+
self.setGeometry(100, 100, 800, 600)
28+
29+
self.central_widget = QWidget()
30+
self.setCentralWidget(self.central_widget)
31+
32+
self.layout = QVBoxLayout()
33+
34+
self.chat_display_label = QLabel()
35+
self.layout.addWidget(self.chat_display_label)
36+
37+
self.message_input = QTextEdit()
38+
self.message_input.setFixedHeight(50)
39+
self.layout.addWidget(self.message_input)
40+
41+
self.send_button = QPushButton("Send")
42+
self.send_button.clicked.connect(self.send_message)
43+
self.layout.addWidget(self.send_button)
44+
45+
self.upload_button = QPushButton("Upload CSV")
46+
self.upload_button.clicked.connect(self.upload_csv)
47+
self.layout.addWidget(self.upload_button)
48+
49+
self.table_widget = QTableWidget()
50+
self.layout.addWidget(self.table_widget)
51+
52+
self.central_widget.setLayout(self.layout)
53+
54+
self.chat_history = []
55+
self.df = None # Store the CSV data
56+
57+
self.init_pandasai()
58+
59+
def init_pandasai(self):
60+
OPENAI_API_KEY = "k-mtujzCGAyXF5x2gLcLBDT3BlbkFJVLdrDwDxsKnpEkhzV7t"
61+
llm = OpenAI(api_token=OPENAI_API_KEY)
62+
user_defined_path = os.getcwd()
63+
pandas_ai = PandasAI(llm, verbose=True, conversational=False, save_charts=True,
64+
save_charts_path=user_defined_path, enable_cache=False)
65+
66+
self.pandas_ai = PandasAI(llm)
67+
68+
# def send_message(self):
69+
# message = self.message_input.toPlainText()
70+
# if message:
71+
# self.chat_history.append(f"User: {message}")
72+
# response = self.run_pandasai(message)
73+
# if response is not None:
74+
# if isinstance(response, float):
75+
# self.chat_history.append(f"PandasAI: {response}")
76+
# elif isinstance(response, str) and "plot" in response.lower():
77+
# self.generate_and_display_plot(response)
78+
# else:
79+
# self.chat_history.append(f"PandasAI: {response}")
80+
# self.update_chat_display()
81+
82+
# print(response)
83+
84+
def send_message(self):
85+
message = self.message_input.toPlainText()
86+
if message:
87+
self.chat_history.append(f"User: {message}")
88+
response = self.run_pandasai(message)
89+
if response is not None:
90+
if isinstance(response, float):
91+
self.chat_history.append(f"PandasAI: {response}")
92+
elif isinstance(response, str) and "plot" in response.lower():
93+
self.generate_and_display_plot(response)
94+
else:
95+
self.chat_history.append(f"PandasAI: {response}")
96+
self.update_chat_display()
97+
98+
print(response)
99+
100+
def run_pandasai(self, message):
101+
try:
102+
if self.df is not None:
103+
104+
response = self.pandas_ai.run(self.df, prompt=message)
105+
plt.show()
106+
# code = self.pandas_ai.last_code_generated(self.df, prompt=message)
107+
print("Pandasai response:", response)
108+
return response
109+
else:
110+
return "Please upload a CSV file first."
111+
except Exception as e:
112+
print("PandasAI Error:", e)
113+
return None
114+
115+
def update_chat_display(self):
116+
chat_text = "\n".join(self.chat_history)
117+
self.chat_display_label.setText(chat_text)
118+
119+
120+
def upload_csv(self):
121+
file_dialog = QFileDialog()
122+
file_dialog.setFileMode(QFileDialog.FileMode.ExistingFile)
123+
file_name, _ = file_dialog.getOpenFileName(self, "Upload CSV File", "", "CSV Files (*.csv);;All Files (*)")
124+
125+
if file_name:
126+
try:
127+
self.df = pd.read_csv(file_name)
128+
self.load_csv_to_table(file_name)
129+
self.chat_history.append("CSV file uploaded.")
130+
self.update_chat_display()
131+
except Exception as e:
132+
print("Error:", e)
133+
134+
def load_csv_to_table(self, file_name):
135+
self.table_widget.clear()
136+
self.table_widget.setRowCount(0)
137+
self.table_widget.setColumnCount(0)
138+
139+
with open(file_name, 'r') as csv_file:
140+
csv_reader = csv.reader(csv_file)
141+
for row_idx, row in enumerate(csv_reader):
142+
if row_idx == 0:
143+
self.table_widget.setColumnCount(len(row))
144+
self.table_widget.insertRow(row_idx)
145+
for col_idx, cell_value in enumerate(row):
146+
self.table_widget.setItem(row_idx, col_idx, QTableWidgetItem(cell_value))
147+
148+
149+
# def generate_and_display_chart(self, data):
150+
# plt.figure()
151+
# plt.title("Generated Chart")
152+
# plt.bar(range(len(data)), data)
153+
# plt.xlabel("X-axis")
154+
# plt.ylabel("Y-axis")
155+
# plt.tight_layout()
156+
157+
# # Display the figure using Matplotlib and process PyQt events
158+
# plt.show(block=True)
159+
# QApplication.processEvents()
160+
161+
# self.chat_history.append("PandasAI: Generated Chart")
162+
163+
164+
def clear_layout(self):
165+
layout = self.layout()
166+
if layout.count() > 5:
167+
for i in range(5, layout.count()):
168+
widget = layout.itemAt(i).widget()
169+
if widget:
170+
widget.deleteLater()
171+
172+
def main():
173+
app = QApplication(sys.argv)
174+
chat_app = ChatWindow()
175+
chat_app.show()
176+
sys.exit(app.exec())
177+
178+
if __name__ == "__main__":
179+
main()

PandasAI/chatwithcsv-2.py

+167
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
# OPENAI_API_KEY = "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"
2+
import sys
3+
import csv
4+
import pandas as pd
5+
import matplotlib.pyplot as plt
6+
from io import BytesIO
7+
from PIL import Image
8+
from pandasai import PandasAI
9+
from pandasai.llm.openai import OpenAI
10+
from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QTextBrowser, QTextEdit, QPushButton, QFileDialog, QTableWidget, QTableWidgetItem, QLabel
11+
12+
from PyQt6.QtCore import Qt
13+
from PyQt6.QtGui import QPixmap
14+
15+
16+
17+
class ChatWindow(QMainWindow):
18+
def __init__(self):
19+
super().__init__()
20+
21+
self.setWindowTitle("Chat Window")
22+
self.setGeometry(100, 100, 800, 600)
23+
24+
self.central_widget = QWidget()
25+
self.setCentralWidget(self.central_widget)
26+
27+
self.layout = QVBoxLayout()
28+
29+
self.chat_display = QTextBrowser()
30+
self.layout.addWidget(self.chat_display)
31+
32+
self.message_input = QTextEdit()
33+
self.message_input.setFixedHeight(50)
34+
self.layout.addWidget(self.message_input)
35+
36+
self.send_button = QPushButton("Send")
37+
self.send_button.clicked.connect(self.send_message)
38+
self.layout.addWidget(self.send_button)
39+
40+
self.upload_button = QPushButton("Upload CSV")
41+
self.upload_button.clicked.connect(self.upload_csv)
42+
self.layout.addWidget(self.upload_button)
43+
44+
self.table_widget = QTableWidget()
45+
self.layout.addWidget(self.table_widget)
46+
47+
self.central_widget.setLayout(self.layout)
48+
49+
self.chat_history = []
50+
self.df = None # Store the CSV data
51+
52+
self.init_pandasai()
53+
54+
def init_pandasai(self):
55+
OPENAI_API_KEY = "k-mtujzCGAyXF5x2gLcLBDT3BlbkFJVLdrDwDxsKnpEkhzV7t"
56+
llm = OpenAI(api_token=OPENAI_API_KEY)
57+
self.pandas_ai = PandasAI(llm)
58+
59+
# def send_message(self):
60+
# message = self.message_input.toPlainText()
61+
# if message:
62+
# self.chat_history.append(f"User: {message}")
63+
# response = self.run_pandasai(message)
64+
# if response is not None:
65+
# if isinstance(response, float):
66+
# self.chat_history.append(f"PandasAI: {response}")
67+
# elif isinstance(response, str) and "plot" in response.lower():
68+
# self.generate_and_display_plot(response)
69+
# else:
70+
# self.chat_history.append(f"PandasAI: {response}")
71+
# self.update_chat_display()
72+
73+
# print(response)
74+
75+
def send_message(self):
76+
message = self.message_input.toPlainText()
77+
if message:
78+
self.chat_history.append(f"User: {message}")
79+
response = self.run_pandasai(message)
80+
if response is not None:
81+
if isinstance(response, float):
82+
self.chat_history.append(f"PandasAI: {response}")
83+
elif isinstance(response, str) and "plot" in response.lower():
84+
self.generate_and_display_plot(response)
85+
else:
86+
self.chat_history.append(f"PandasAI: {response}")
87+
self.update_chat_display()
88+
89+
print(response)
90+
91+
92+
def run_pandasai(self, message):
93+
try:
94+
if self.df is not None:
95+
response = self.pandas_ai.run(self.df, prompt=message)
96+
return response
97+
else:
98+
return "Please upload a CSV file first."
99+
except Exception as e:
100+
print("PandasAI Error:", e)
101+
return None
102+
103+
def update_chat_display(self):
104+
self.chat_display.clear()
105+
for message in self.chat_history:
106+
self.chat_display.append(message)
107+
108+
def upload_csv(self):
109+
file_dialog = QFileDialog()
110+
file_dialog.setFileMode(QFileDialog.FileMode.ExistingFile)
111+
file_name, _ = file_dialog.getOpenFileName(self, "Upload CSV File", "", "CSV Files (*.csv);;All Files (*)")
112+
113+
if file_name:
114+
try:
115+
self.df = pd.read_csv(file_name)
116+
self.load_csv_to_table(file_name)
117+
self.chat_history.append("CSV file uploaded.")
118+
self.update_chat_display()
119+
except Exception as e:
120+
print("Error:", e)
121+
122+
def load_csv_to_table(self, file_name):
123+
self.table_widget.clear()
124+
self.table_widget.setRowCount(0)
125+
self.table_widget.setColumnCount(0)
126+
127+
with open(file_name, 'r') as csv_file:
128+
csv_reader = csv.reader(csv_file)
129+
for row_idx, row in enumerate(csv_reader):
130+
if row_idx == 0:
131+
self.table_widget.setColumnCount(len(row))
132+
self.table_widget.insertRow(row_idx)
133+
for col_idx, cell_value in enumerate(row):
134+
self.table_widget.setItem(row_idx, col_idx, QTableWidgetItem(cell_value))
135+
136+
137+
def generate_and_display_chart(self, data):
138+
plt.figure()
139+
plt.title("Generated Chart")
140+
plt.bar(range(len(data)), data)
141+
plt.xlabel("X-axis")
142+
plt.ylabel("Y-axis")
143+
plt.tight_layout()
144+
145+
# Display the figure using Matplotlib and process PyQt events
146+
plt.show(block=False)
147+
QApplication.processEvents()
148+
149+
self.chat_history.append("PandasAI: Generated Chart")
150+
151+
152+
def clear_layout(self):
153+
layout = self.layout()
154+
if layout.count() > 5:
155+
for i in range(5, layout.count()):
156+
widget = layout.itemAt(i).widget()
157+
if widget:
158+
widget.deleteLater()
159+
160+
def main():
161+
app = QApplication(sys.argv)
162+
chat_app = ChatWindow()
163+
chat_app.show()
164+
sys.exit(app.exec())
165+
166+
if __name__ == "__main__":
167+
main()

0 commit comments

Comments
 (0)