Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 996dbc8

Browse files
PandasAI
1 parent 76daeb5 commit 996dbc8

File tree

7 files changed

+2651
-0
lines changed

7 files changed

+2651
-0
lines changed

‎PandasAI/charttest.py‎

Lines changed: 179 additions & 0 deletions
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‎

Lines changed: 167 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /