2024-06-08 03:00:08 +08:00
|
|
|
import Ui_MainWindow
|
|
|
|
from PyQt5.QtCore import QFile, QFileInfo, pyqtSlot, pyqtSignal
|
|
|
|
from PyQt5 import QtGui, QtWidgets, QtCore
|
2024-06-09 02:54:44 +08:00
|
|
|
from PyQt5.QtWidgets import QPushButton, QTableWidgetItem, QInputDialog, QLabel
|
2024-06-08 03:00:08 +08:00
|
|
|
from PyQt5.QtGui import QIcon, QPixmap
|
|
|
|
from data_set_read import Data_Read
|
2024-06-08 19:26:36 +08:00
|
|
|
import pandas as pd
|
|
|
|
import openpyxl as pyx
|
2024-06-09 02:54:44 +08:00
|
|
|
from libdataanalysis.LinearRegression.linear_regression import LinearRegression
|
2024-06-08 03:00:08 +08:00
|
|
|
|
|
|
|
class MainWindows:
|
|
|
|
def __init__(self) -> None:
|
|
|
|
self.MainWindow = QtWidgets.QMainWindow()
|
|
|
|
self.ui = Ui_MainWindow.Ui_MainWindow()
|
|
|
|
self.ui.setupUi(self.MainWindow)
|
|
|
|
self.window_ui_init()
|
|
|
|
self.file_object_init()
|
2024-06-08 19:26:36 +08:00
|
|
|
self.head_num = 10
|
2024-06-08 03:00:08 +08:00
|
|
|
|
|
|
|
def window_ui_init(self):
|
|
|
|
self.MainWindow.setWindowTitle("Data Analysis By Python")
|
|
|
|
self.MainWindow.setWindowIcon(QIcon(QPixmap(":/src/image/icon.jpg")))
|
|
|
|
self.ui.progressBar_linear_regression.setValue(0)
|
2024-06-09 02:54:44 +08:00
|
|
|
self.statusLable = QLabel("准备完成!")
|
|
|
|
self.ui.statusbar.addWidget(self.statusLable, 1)
|
2024-06-08 03:00:08 +08:00
|
|
|
|
|
|
|
def file_object_init(self):
|
|
|
|
self.ui.pushButton_filepath.clicked.connect(self.pushButton_filepath_clicked)
|
|
|
|
self.ui.pushButton_filepath_clear.clicked.connect(self.pushButton_filepath_clear_clicked)
|
|
|
|
self.ui.pushButton_linear_regression.clicked.connect(lambda checked: self.ui.stackedWidget.setCurrentIndex(0))
|
|
|
|
self.ui.pushButton_Kmeans.clicked.connect(lambda checked: self.ui.stackedWidget.setCurrentIndex(1))
|
2024-06-09 02:54:44 +08:00
|
|
|
self.ui.actionNumber_Head.triggered.connect(self.action_Number_Head_triggered)
|
|
|
|
self.ui.pushButton_linear_regression_begin.clicked.connect(self.pushButton_linear_regression_begin_clicked)
|
2024-06-08 03:00:08 +08:00
|
|
|
|
|
|
|
def pushButton_filepath_clicked(self):
|
|
|
|
file_path = QtWidgets.QFileDialog.getOpenFileName(self.MainWindow, "Open File", ".", "All Files(*);;csv Files(*.csv);;Old Excel Files(*.xls);;New Excel Files(*.xlsx)")
|
2024-06-09 02:54:44 +08:00
|
|
|
if file_path[0] is None:
|
|
|
|
return
|
|
|
|
self.file_path = file_path[0]
|
2024-06-08 03:00:08 +08:00
|
|
|
info = QFileInfo(file_path[0])
|
|
|
|
suffix = info.suffix()
|
|
|
|
if suffix == "csv":
|
2024-06-08 19:26:36 +08:00
|
|
|
self.data_read = Data_Read(file_path[0], suffix)
|
2024-06-08 03:00:08 +08:00
|
|
|
self.ui.lineEdit_filepath.setText(file_path[0])
|
|
|
|
elif suffix == "xls" or suffix == "xlsx":
|
2024-06-08 19:26:36 +08:00
|
|
|
self.data_read = Data_Read(file_path[0], suffix)
|
2024-06-08 03:00:08 +08:00
|
|
|
self.ui.lineEdit_filepath.setText(file_path[0])
|
2024-06-08 19:26:36 +08:00
|
|
|
|
|
|
|
if self.ui.stackedWidget.currentIndex() == 0:
|
|
|
|
self.tableWidget_linear_regression_show()
|
|
|
|
|
|
|
|
def tableWidget_linear_regression_show(self):
|
|
|
|
self.ui.tableWidget_linear_regression.clear()
|
2024-06-09 02:54:44 +08:00
|
|
|
data_file = QFileInfo(self.ui.lineEdit_filepath.text())
|
|
|
|
suffix = data_file.suffix()
|
|
|
|
if suffix == "csv":
|
|
|
|
self.set_csv_headers(data_file.absoluteFilePath())
|
|
|
|
elif suffix == "xlsx" or suffix == "xls":
|
|
|
|
self.set_excel_headers(data_file.absoluteFilePath())
|
|
|
|
|
|
|
|
def set_excel_headers(self, file_path):
|
|
|
|
wb = pyx.load_workbook(file_path)
|
|
|
|
sheet = wb.active
|
2024-06-08 19:26:36 +08:00
|
|
|
self.ui.tableWidget_linear_regression.setRowCount(self.head_num)
|
|
|
|
self.ui.tableWidget_linear_regression.setColumnCount(sheet.max_column)
|
2024-06-09 02:54:44 +08:00
|
|
|
row_count = 0
|
|
|
|
if sheet.max_row < self.head_num:
|
|
|
|
max_row = sheet.max_row
|
|
|
|
else:
|
|
|
|
max_row = self.head_num
|
|
|
|
for row in sheet.iter_rows(min_row=1, max_row=max_row, max_col=sheet.max_column, values_only=True):
|
2024-06-08 19:26:36 +08:00
|
|
|
for col, data in enumerate(row, start=0):
|
2024-06-09 02:54:44 +08:00
|
|
|
item = QTableWidgetItem(str(data))
|
|
|
|
self.ui.tableWidget_linear_regression.setItem(row_count, col, item)
|
|
|
|
row_count += 1
|
|
|
|
wb.close()
|
|
|
|
self.statusLable.setText("加载完成!")
|
|
|
|
|
|
|
|
def set_csv_headers(self, file_path):
|
|
|
|
with open(file_path, "r") as file:
|
|
|
|
for i in range(0, self.head_num):
|
|
|
|
if i == 0:
|
|
|
|
line = file.readline()
|
|
|
|
line_stripped = line.rstrip()
|
|
|
|
data_list = line_stripped.split(",")
|
|
|
|
self.ui.tableWidget_linear_regression.setRowCount(self.head_num)
|
|
|
|
self.ui.tableWidget_linear_regression.setColumnCount(len(data_list))
|
|
|
|
for j in range(0, len(data_list)):
|
|
|
|
item = QTableWidgetItem(str(data_list[j]))
|
|
|
|
self.ui.tableWidget_linear_regression.setItem(i, j, item)
|
|
|
|
else:
|
|
|
|
line = file.readline()
|
|
|
|
line_stripped = line.rstrip()
|
|
|
|
data_list = line_stripped.split(",")
|
|
|
|
for j in range(0, len(data_list)):
|
|
|
|
item = QTableWidgetItem(str(data_list[j]))
|
|
|
|
self.ui.tableWidget_linear_regression.setItem(i, j, item)
|
|
|
|
file.close()
|
|
|
|
self.statusLable.setText("加载完成!")
|
|
|
|
|
2024-06-08 03:00:08 +08:00
|
|
|
def pushButton_filepath_clear_clicked(self):
|
|
|
|
self.ui.lineEdit_filepath.clear()
|
2024-06-09 02:54:44 +08:00
|
|
|
|
|
|
|
def action_Number_Head_triggered(self):
|
|
|
|
nb_head = QtWidgets.QInputDialog.getInt(self.MainWindow, "Head Number", "设置头行数", 10, 1, 20, 1)
|
|
|
|
if nb_head[1] == True:
|
|
|
|
self.head_num = nb_head[0]
|
|
|
|
|
|
|
|
def pushButton_linear_regression_begin_clicked(self):
|
|
|
|
if self.ui.lineEdit_linear_regression_original.text is None or self.ui.lineEdit_linear_regression_target is None:
|
|
|
|
self.ui.statusbar.s
|
|
|
|
info = QFileInfo(self.file_path)
|
|
|
|
suffix = info.suffix()
|
|
|
|
if suffix == "csv":
|
|
|
|
data = pd.read_csv(self.file_path)
|
|
|
|
elif suffix == "xls" or suffix == "xlsx":
|
|
|
|
data = pd.read_excel(self.file_path)
|
|
|
|
|
|
|
|
x = data[self.ui.lineEdit_linear_regression_original.text().split(",")].values
|
|
|
|
y = data[self.ui.lineEdit_linear_regression_target.text()].values
|
|
|
|
|
|
|
|
num_iterations = self.ui.spinBox_linear_regression_iter.value()
|
|
|
|
learning_rate = self.ui.doubleSpinBox_linear_regression_rate.value()
|
|
|
|
polynomial_degress = self.ui.spinBox_linear_regression_ploynmial.value()
|
|
|
|
sinusoid_degress = self.ui.spinBox_linear_regression_sinusoid.value()
|
|
|
|
normalize_data = True
|
|
|
|
|
|
|
|
linear_regression = LinearRegression(x, y, polynomial_degress, sinusoid_degress, normalize_data)
|
|
|
|
(theta, cost_history) = linear_regression.train(
|
|
|
|
learning_rate,
|
|
|
|
num_iterations
|
|
|
|
)
|
|
|
|
msg = "开始损失: {:.2f},结束损失: {:.2f}".format(cost_history[0], cost_history[-1])
|
|
|
|
|
|
|
|
self.statusLable.setText(msg)
|