From 10bc8958937e4cdbd68dbdaacd74dc82e790b8fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BE=AF=E5=B1=95=E6=84=8F?= <1295752786@qq.com> Date: Sun, 23 Aug 2020 14:50:22 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=82=A8=E5=AD=98=E8=BF=9B=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyminer/features/preprocess/preprocess.py | 376 ++---------------- pyminer/pmapp.py | 4 +- pyminer/pmstart.py | 2 +- pyminer/ui/base/widgets/controlpanel.py | 2 +- .../table/{tableviews.py => tableview.py} | 0 .../table/{tablewidgets.py => tablewidget.py} | 0 .../widgets/generalwidgets/window/__init__.py | 1 + .../widgets/generalwidgets/window/dialog.py | 32 ++ 8 files changed, 64 insertions(+), 353 deletions(-) rename pyminer/ui/base/widgets/generalwidgets/table/{tableviews.py => tableview.py} (100%) rename pyminer/ui/base/widgets/generalwidgets/table/{tablewidgets.py => tablewidget.py} (100%) create mode 100644 pyminer/ui/base/widgets/generalwidgets/window/__init__.py create mode 100644 pyminer/ui/base/widgets/generalwidgets/window/dialog.py diff --git a/pyminer/features/preprocess/preprocess.py b/pyminer/features/preprocess/preprocess.py index b126c9b4..e55c93ea 100644 --- a/pyminer/features/preprocess/preprocess.py +++ b/pyminer/features/preprocess/preprocess.py @@ -12,6 +12,9 @@ from pandas.api.types import is_string_dtype # 导入PyQt5模块 from PyQt5.Qt import * +# 导入基础类模块 +from pyminer.ui.base.widgets.generalwidgets.window import DataProcessDialog + # 导入数据相关操作模块 from pyminer.ui.data.data_filter import Ui_Form as DataFilter_Ui_Form # 数据筛选 from pyminer.ui.data.data_role import Ui_Form as DataRole_Ui_Form # 数据角色 @@ -33,12 +36,13 @@ from pyminer.ui.data.data_column_encode import Ui_Form as DataColumnEncode_Ui_Fo from pyminer.ui.data.data_column_name import Ui_Form as DataColumnName_Ui_Form from pyminer.ui.data.data_repace import Ui_Form as DataReplace_Ui_Form from pyminer.share.exceptionhandler import exception_handler + # 定义日志输出格式 logging.basicConfig(format="%(asctime)s %(name)s:%(levelname)s:%(message)s", datefmt="%Y-%m-%d %H:%M:%S", level=logging.INFO) -class DataInfoForm(QDialog, DataInfo_Ui_Form): +class DataInfoForm(DataProcessDialog, DataInfo_Ui_Form): """ 打开"数据-数据信息" """ @@ -64,27 +68,6 @@ class DataInfoForm(QDialog, DataInfo_Ui_Form): self.lineEdit_dataset_name.textChanged.connect(self.change_dataset_info) # ================================自定义槽函数========================= - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - - def get_help(self): - """ - 打开帮助页面 - """ - try: - webbrowser.get('chrome').open_new_tab("http://www.py2cn.com") - except Exception as e: - webbrowser.open_new_tab("http://www.py2cn.com") def info_init(self): if any(self.info): @@ -132,7 +115,7 @@ class DataInfoForm(QDialog, DataInfo_Ui_Form): self.info_init() -class DataFilterForm(QWidget, DataFilter_Ui_Form): +class DataFilterForm(DataProcessDialog, DataFilter_Ui_Form): """ 打开"数据-筛选"窗口 """ @@ -142,21 +125,8 @@ class DataFilterForm(QWidget, DataFilter_Ui_Form): self.setupUi(self) self.center() - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - -class DataRoleForm(QDialog, DataRole_Ui_Form): +class DataRoleForm(DataProcessDialog, DataRole_Ui_Form): """ "新建窗口" """ @@ -181,28 +151,7 @@ class DataRoleForm(QDialog, DataRole_Ui_Form): self.lineEdit_col_find.textChanged.connect(self.change_find) self.comboBox_columns.currentTextChanged.connect(self.change_column) - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - - # ================================自定义槽函数========================= - def get_help(self): - """ - 打开帮助页面 - """ - try: - webbrowser.get('chrome').open_new_tab("http://www.py2cn.com") - except Exception as e: - webbrowser.open_new_tab("http://www.py2cn.com") + # ================================自定义槽函数========================= def dataset_export(self): fileName_choose, filetype = QFileDialog.getSaveFileName(self, @@ -302,9 +251,9 @@ class DataRoleForm(QDialog, DataRole_Ui_Form): self.tableWidget_dataset.setItem(i, j, newItem) -class DataRowFilterForm(QDialog, DataRowFilter_Ui_Form): +class DataRowFilterForm(DataProcessDialog, DataRowFilter_Ui_Form): """ - 打开"数据-行筛选"窗口 + 打开"数据-行筛选"窗口,也就是‘筛选。’ """ signal_data_change = pyqtSignal(str, dict, str, str, str, str, str) # 自定义信号,用于修改数据 @@ -342,28 +291,7 @@ class DataRowFilterForm(QDialog, DataRowFilter_Ui_Form): self.lineEdit_col_find.textChanged.connect(self.exec_filter) self.comboBox_dtype.currentIndexChanged.connect(self.exec_filter) - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - # ================================自定义槽函数========================= - def get_help(self): - """ - 打开帮助页面 - """ - try: - webbrowser.get('chrome').open_new_tab("http://www.py2cn.com") - except Exception as e: - webbrowser.open_new_tab("http://www.py2cn.com") def dataset_init(self): self.filter_dataset = self.current_dataset.copy().head(100) @@ -454,6 +382,7 @@ class DataRowFilterForm(QDialog, DataRowFilter_Ui_Form): else: self.comboBox_col_condition.clear() self.comboBox_col_condition.addItems(['模糊匹配', 'in', 'not in']) + @exception_handler def filter_column(self): # 根据列筛选 @@ -473,7 +402,7 @@ class DataRowFilterForm(QDialog, DataRowFilter_Ui_Form): elif self.comboBox_col_condition.currentText() == "<=": self.filter_dataset = data[data[col] <= float(content)] else: - content=content.lower() + content = content.lower() if self.comboBox_col_condition.currentText() == "模糊匹配": self.filter_dataset = data[data[col].map(str.lower).str.contains(content)] elif self.comboBox_col_condition.currentText() == "in": @@ -485,7 +414,7 @@ class DataRowFilterForm(QDialog, DataRowFilter_Ui_Form): def filter_dtype(self): data = self.current_dataset.copy() dtype = self.comboBox_dtype.currentText() # 当前要筛选的数据类型 - if dtype =="全部": + if dtype == "全部": self.data_preview(data) return self.filter_dataset = data.select_dtypes(include=dtype) @@ -555,7 +484,7 @@ class DataRowFilterForm(QDialog, DataRowFilter_Ui_Form): self.close() -class DataColumnDescForm(QDialog, Columns_desc_Ui_Form): +class DataColumnDescForm(DataProcessDialog, Columns_desc_Ui_Form): """ 打开"数据-列"窗口 """ @@ -588,28 +517,7 @@ class DataColumnDescForm(QDialog, Columns_desc_Ui_Form): self.pushButton_group_down.clicked.connect(self.var_group_down) self.pushButton_group_del.clicked.connect(self.var_group_del) - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - # ================================自定义槽函数========================= - def get_help(self): - """ - 打开帮助页面 - """ - try: - webbrowser.get('chrome').open_new_tab("http://www.py2cn.com") - except Exception as e: - webbrowser.open_new_tab("http://www.py2cn.com") def slot_var_change(self): # 只允许查看一个变量的描述 @@ -778,7 +686,7 @@ class DataColumnDescForm(QDialog, Columns_desc_Ui_Form): self.tableWidget_dataset.setItem(i, j, newItem) -class DataDeleteRowForm(QWidget, DataDeleteRow_Ui_Form): +class DataDeleteRowForm(DataProcessDialog, DataDeleteRow_Ui_Form): """ 打开"数据-删除行"窗口 """ @@ -788,21 +696,8 @@ class DataDeleteRowForm(QWidget, DataDeleteRow_Ui_Form): self.setupUi(self) self.center() - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - -class DataDeleteColumnForm(QWidget, DataDeleteColumn_Ui_Form): +class DataDeleteColumnForm(DataProcessDialog, DataDeleteColumn_Ui_Form): """ 打开"数据-删除列"窗口 """ @@ -812,21 +707,8 @@ class DataDeleteColumnForm(QWidget, DataDeleteColumn_Ui_Form): self.setupUi(self) self.center() - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - -class DataMergeVerticalForm(QDialog, DataMergeVertical_Ui_Form): +class DataMergeVerticalForm(DataProcessDialog, DataMergeVertical_Ui_Form): """ 打开"数据-纵向合并"窗口 """ @@ -866,29 +748,7 @@ class DataMergeVerticalForm(QDialog, DataMergeVertical_Ui_Form): self.pushButton_start_down.clicked.connect(self.dataset_start_down) self.pushButton_append_down.clicked.connect(self.dataset_append_down) - # ================================事件处理函数========================= - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - # ================================自定义槽函数========================= - def get_help(self): - """ - 打开帮助页面 - """ - try: - webbrowser.get('chrome').open_new_tab("http://www.py2cn.com") - except Exception as e: - webbrowser.open_new_tab("http://www.py2cn.com") def slot_listWidget_start_change(self): self.current_dataset_name = self.listWidget_start.item(0).text() @@ -1062,7 +922,7 @@ class DataMergeVerticalForm(QDialog, DataMergeVertical_Ui_Form): self.close() -class DataMergeHorizontalForm(QDialog, DataMergeHorizontal_Ui_Form): +class DataMergeHorizontalForm(DataProcessDialog, DataMergeHorizontal_Ui_Form): """ 打开"数据-横向合并"窗口 """ @@ -1095,29 +955,7 @@ class DataMergeHorizontalForm(QDialog, DataMergeHorizontal_Ui_Form): self.pushButton_append_down.clicked.connect(self.dataset_append_down) self.pushButton_append_del.clicked.connect(self.dataset_append_del) - # ================================事件处理函数========================= - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - # ================================自定义槽函数========================= - def get_help(self): - """ - 打开帮助页面 - """ - try: - webbrowser.get('chrome').open_new_tab("http://www.py2cn.com") - except Exception as e: - webbrowser.open_new_tab("http://www.py2cn.com") def slot_listWidget_start_change(self): self.current_dataset_name = self.listWidget_start.item(0).text() @@ -1298,7 +1136,7 @@ class DataMergeHorizontalForm(QDialog, DataMergeHorizontal_Ui_Form): self.close() -class DataPartitionForm(QDialog, DataPartition_Ui_Form): +class DataPartitionForm(DataProcessDialog, DataPartition_Ui_Form): """ 打开"数据-数据分区"窗口 """ @@ -1309,51 +1147,20 @@ class DataPartitionForm(QDialog, DataPartition_Ui_Form): self.setupUi(self) self.center() - self.current_dataset = pd.DataFrame() self.current_dataset_name = '' - self.widget_part_2.hide() self.widget_part_3.hide() self.widget_part_4.hide() self.widget_part_other.setVisible(False) - - - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - # ================================自定义槽函数========================= - def get_help(self): - """ - 打开帮助页面 - """ - try: - webbrowser.get('chrome').open_new_tab("http://www.py2cn.com") - except Exception as e: - webbrowser.open_new_tab("http://www.py2cn.com") - - - - - - -class DataNewColumnForm(QWidget, DataNewColumn_Ui_Form): +class DataNewColumnForm(DataProcessDialog, DataNewColumn_Ui_Form): """ - 打开"从sas导入"窗口 + 打开"新建列"窗口 """ def __init__(self, parent=None): @@ -1361,21 +1168,8 @@ class DataNewColumnForm(QWidget, DataNewColumn_Ui_Form): self.setupUi(self) self.center() - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - -class DataMissingValueForm(QDialog, DataMissingValue_Ui_Form): +class DataMissingValueForm(DataProcessDialog, DataMissingValue_Ui_Form): """ 打开"数据-缺失值"窗口 """ @@ -1406,28 +1200,7 @@ class DataMissingValueForm(QDialog, DataMissingValue_Ui_Form): self.listWidget_selected.itemChanged.connect(self.dataset_filter_column) - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - # ================================自定义槽函数========================= - def get_help(self): - """ - 打开帮助页面 - """ - try: - webbrowser.get('chrome').open_new_tab("http://www.py2cn.com") - except Exception as e: - webbrowser.open_new_tab("http://www.py2cn.com") def var_selected_del(self): current_row = self.listWidget_selected.currentRow() @@ -1611,7 +1384,7 @@ class DataMissingValueForm(QDialog, DataMissingValue_Ui_Form): self.close() -class DataSortForm(QWidget, DataSort_Ui_Form): +class DataSortForm(DataProcessDialog, DataSort_Ui_Form): """ 打开"从sas导入"窗口 """ @@ -1621,21 +1394,8 @@ class DataSortForm(QWidget, DataSort_Ui_Form): self.setupUi(self) self.center() - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - -class DataTransposeForm(QDialog, DataTranspose_Ui_Form): +class DataTransposeForm(DataProcessDialog, DataTranspose_Ui_Form): """ 打开"数据-转置"窗口 """ @@ -1668,29 +1428,6 @@ class DataTransposeForm(QDialog, DataTranspose_Ui_Form): self.pushButton_add.clicked.connect(self.var_selected_add) self.pushButton_delete.clicked.connect(self.var_selected_add) - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - - # ================================自定义槽函数========================= - def get_help(self): - """ - 打开帮助页面 - """ - try: - webbrowser.get('chrome').open_new_tab("http://www.py2cn.com") - except Exception as e: - webbrowser.open_new_tab("http://www.py2cn.com") - # ================================自定义功能函数========================= def var_selected_del(self): current_row = self.listWidget_selected.currentRow() @@ -1794,7 +1531,7 @@ class DataTransposeForm(QDialog, DataTranspose_Ui_Form): self.close() -class DataStandardForm(QWidget, DataStandard_Ui_Form): +class DataStandardForm(DataProcessDialog, DataStandard_Ui_Form): """ 打开"从sas导入"窗口 """ @@ -1804,21 +1541,8 @@ class DataStandardForm(QWidget, DataStandard_Ui_Form): self.setupUi(self) self.center() - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - -class DataSampleForm(QDialog, DataSample_Ui_Form): +class DataSampleForm(DataProcessDialog, DataSample_Ui_Form): """ 打开"数据抽样"窗口 """ @@ -1851,29 +1575,6 @@ class DataSampleForm(QDialog, DataSample_Ui_Form): self.pushButton_weight_down.clicked.connect(self.var_weight_down) self.pushButton_weight_del.clicked.connect(self.var_weight_del) - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - - # ================================自定义槽函数========================= - def get_help(self): - """ - 打开帮助页面 - """ - try: - webbrowser.get('chrome').open_new_tab("http://www.py2cn.com") - except Exception as e: - webbrowser.open_new_tab("http://www.py2cn.com") - def var_selected_del(self): # 移除选中的item current_row = self.listWidget_selected.currentRow() @@ -2052,7 +1753,7 @@ class DataSampleForm(QDialog, DataSample_Ui_Form): self.close() -class DataColumnNameForm(QDialog, DataColumnName_Ui_Form): +class DataColumnNameForm(DataProcessDialog, DataColumnName_Ui_Form): """ 打开"数据-列名处理"窗口 """ @@ -2348,7 +2049,7 @@ class DataColumnEncodeForm(QWidget, DataColumnEncode_Ui_Form): self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) -class DataReplaceForm(QDialog, DataReplace_Ui_Form): +class DataReplaceForm(DataProcessDialog, DataReplace_Ui_Form): """ 打开"数据-内容替换"窗口 """ @@ -2375,28 +2076,7 @@ class DataReplaceForm(QDialog, DataReplace_Ui_Form): self.pushButton_find.clicked.connect(self.data_find) self.pushButton_replace.clicked.connect(self.dataset_update) - def keyPressEvent(self, e): - """ - 按键盘Escape退出当前窗口 - @param e: - """ - if e.key() == Qt.Key_Escape: - self.close() - - def center(self): - screen = QDesktopWidget().screenGeometry() - size = self.geometry() - self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) - # ================================自定义槽函数========================= - def get_help(self): - """ - 打开帮助页面 - """ - try: - webbrowser.get('chrome').open_new_tab("http://www.py2cn.com") - except Exception as e: - webbrowser.open_new_tab("http://www.py2cn.com") def ui_init(self): diff --git a/pyminer/pmapp.py b/pyminer/pmapp.py index d0820123..5acada0c 100644 --- a/pyminer/pmapp.py +++ b/pyminer/pmapp.py @@ -102,6 +102,7 @@ QMessageBox QPushButton[text="Ignore"] { } """ + class Application(QApplication): def __init__(self, argv): QApplication.__init__(self, argv) @@ -132,9 +133,6 @@ class Application(QApplication): self.setStyle(QStyleFactory.create("Windows")) - - - class CustomRect(QGraphicsObject): def __init__(self): super(CustomRect, self).__init__() diff --git a/pyminer/pmstart.py b/pyminer/pmstart.py index b2fc4162..c89ad6d5 100644 --- a/pyminer/pmstart.py +++ b/pyminer/pmstart.py @@ -30,7 +30,7 @@ def boot(): myWin.load_data(splash) pmutil._main_window = myWin - #myWin.data_import_file_test('class.csv') + myWin.data_import_file_test('class.csv') # 窗口美化设置 # QssTools.set_qss_to_obj(root_dir + "/ui/source/qss/pyminer.qss", app) diff --git a/pyminer/ui/base/widgets/controlpanel.py b/pyminer/ui/base/widgets/controlpanel.py index 640de261..7f5bd876 100644 --- a/pyminer/ui/base/widgets/controlpanel.py +++ b/pyminer/ui/base/widgets/controlpanel.py @@ -274,7 +274,7 @@ class PMPageData(QWidget): # 删除行 self.btn_delete_row.clicked.connect(app.data_delete_row_display) - self.btn_delete_row.clicked.connect(app.data_delete_col_display) + self.btn_delete_column.clicked.connect(app.data_delete_col_display) # 纵向合并 self.btn_data_merge_vertical.clicked.connect(app.data_merge_vertical_display) diff --git a/pyminer/ui/base/widgets/generalwidgets/table/tableviews.py b/pyminer/ui/base/widgets/generalwidgets/table/tableview.py similarity index 100% rename from pyminer/ui/base/widgets/generalwidgets/table/tableviews.py rename to pyminer/ui/base/widgets/generalwidgets/table/tableview.py diff --git a/pyminer/ui/base/widgets/generalwidgets/table/tablewidgets.py b/pyminer/ui/base/widgets/generalwidgets/table/tablewidget.py similarity index 100% rename from pyminer/ui/base/widgets/generalwidgets/table/tablewidgets.py rename to pyminer/ui/base/widgets/generalwidgets/table/tablewidget.py diff --git a/pyminer/ui/base/widgets/generalwidgets/window/__init__.py b/pyminer/ui/base/widgets/generalwidgets/window/__init__.py new file mode 100644 index 00000000..f6a2ecdc --- /dev/null +++ b/pyminer/ui/base/widgets/generalwidgets/window/__init__.py @@ -0,0 +1 @@ +from .dialog import DataProcessDialog \ No newline at end of file diff --git a/pyminer/ui/base/widgets/generalwidgets/window/dialog.py b/pyminer/ui/base/widgets/generalwidgets/window/dialog.py new file mode 100644 index 00000000..b9f75151 --- /dev/null +++ b/pyminer/ui/base/widgets/generalwidgets/window/dialog.py @@ -0,0 +1,32 @@ +from PyQt5.QtWidgets import QDialog, QDesktopWidget +from PyQt5.QtCore import Qt + +import webbrowser + + +class DataProcessDialog(QDialog): + ''' + 用于数据处理的对话框。特点是按下esc之后会退出等。 + ''' + + def keyPressEvent(self, e): + """ + 按键盘Escape退出当前窗口 + @param e: + """ + if e.key() == Qt.Key_Escape: + self.close() + + def center(self): + screen = QDesktopWidget().screenGeometry() + size = self.geometry() + self.move(int((screen.width() - size.width()) / 2), int((screen.height() - size.height()) / 2)) + + def get_help(self): + """ + 打开帮助页面 + """ + try: + webbrowser.get('chrome').open_new_tab("http://www.py2cn.com") + except Exception as e: + webbrowser.open_new_tab("http://www.py2cn.com") -- Gitee From e9938e98267d699444c37c0037f357474860f62a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BE=AF=E5=B1=95=E6=84=8F?= <1295752786@qq.com> Date: Sun, 23 Aug 2020 21:28:04 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=B0=86DataManager=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=88=B0=E4=BA=86=E9=A1=B9=E7=9B=AE=E4=B8=AD=E3=80=82=E7=9B=AE?= =?UTF-8?q?=E5=89=8D=E8=BF=99=E5=8F=AA=E6=98=AF=E4=B8=80=E4=B8=AA=E7=AE=80?= =?UTF-8?q?=E5=8D=95=E7=9A=84=E6=95=B0=E6=8D=AE=E7=AE=A1=E7=90=86=E7=B1=BB?= =?UTF-8?q?=EF=BC=8C=E4=B9=8B=E5=90=8E=E4=BC=9A=E5=A2=9E=E5=8A=A0=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=E7=9A=84=E6=8E=A5=E5=8F=A3=E3=80=82=E5=8F=A6=E5=A4=96?= =?UTF-8?q?=E5=BB=BA=E7=AB=8B=E4=BA=86=E4=B8=80=E4=B8=AA=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=E6=8E=A7=E4=BB=B6=E7=B1=BBQDialog=EF=BC=8C=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E6=96=87=E4=BB=B6=E7=9A=84=E9=80=89=E6=8B=A9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyminer/features/preprocess/preprocess.py | 100 ++++++++++++---------- pyminer/features/sample/io.py | 98 +++++++++++---------- pyminer/pmapp.py | 100 +++++++++------------- pyminer/share/datahost/__init__.py | 1 + pyminer/share/datahost/datamanager.py | 74 +++++++++++++++- 5 files changed, 213 insertions(+), 160 deletions(-) diff --git a/pyminer/features/preprocess/preprocess.py b/pyminer/features/preprocess/preprocess.py index e55c93ea..d8440362 100644 --- a/pyminer/features/preprocess/preprocess.py +++ b/pyminer/features/preprocess/preprocess.py @@ -51,7 +51,7 @@ class DataInfoForm(DataProcessDialog, DataInfo_Ui_Form): super().__init__(parent) self.setupUi(self) self.center() - self.all_dataset = dict() + self.data_host = None self.all_dataset_name = list() self.current_dataset_name = '' # 当前数据集名称 @@ -101,18 +101,22 @@ class DataInfoForm(DataProcessDialog, DataInfo_Ui_Form): def change_dataset_info(self): # 修改当前数据集的数据信息 - self.lineEdit_path.setText(self.all_dataset.get(self.current_dataset_name + ".path")) - self.lineEdit_row.setText(self.all_dataset.get(self.current_dataset_name + ".row")) - self.lineEdit_col.setText(self.all_dataset.get(self.current_dataset_name + ".col")) - self.lineEdit_file_size.setText(self.all_dataset.get(self.current_dataset_name + ".file_size")) - self.lineEdit_memory_usage.setText( - self.all_dataset.get(self.current_dataset_name + ".memory_usage")) - self.lineEdit_create_time.setText( - self.all_dataset.get(self.current_dataset_name + ".create_time")) - self.lineEdit_update_time.setText( - self.all_dataset.get(self.current_dataset_name + ".update_time")) - self.info = self.all_dataset.get(self.current_dataset_name + ".info") - self.info_init() + if self.data_host is not None: + info_dic = self.data_host.get_info(self.current_dataset_name) + + self.lineEdit_path.setText(info_dic['path']) # self.data_manager.get(self.current_dataset_name + ".path")) + self.lineEdit_row.setText(info_dic['row']) # self.data_manager.get(self.current_dataset_name + ".row")) + self.lineEdit_col.setText(info_dic['col']) # self.data_manager.get(self.current_dataset_name + ".col")) + self.lineEdit_file_size.setText( + info_dic['file_size']) # self.data_manager.get(self.current_dataset_name + ".file_size")) + self.lineEdit_memory_usage.setText(info_dic['memory_usage']) # + # self.data_manager.get(self.current_dataset_name + ".memory_usage")) + self.lineEdit_create_time.setText(info_dic['create_time']) + # self.data_manager.get(self.current_dataset_name + ".create_time")) + self.lineEdit_update_time.setText(info_dic['update_time']) + # self.data_manager.get(self.current_dataset_name + ".update_time")) + self.info = info_dic['info'] # self.data_manager.get(self.current_dataset_name + ".info") + self.info_init() class DataFilterForm(DataProcessDialog, DataFilter_Ui_Form): @@ -139,7 +143,7 @@ class DataRoleForm(DataProcessDialog, DataRole_Ui_Form): self.current_dataset = pd.DataFrame() # 当前数据集 self.current_dataset_name = "" - self.all_dataset = dict() + self.data_manager = dict() self.filter_dataset = pd.DataFrame() # 预览筛选后内容 self.role_dataset = pd.DataFrame() # 预览筛选后内容 @@ -257,14 +261,14 @@ class DataRowFilterForm(DataProcessDialog, DataRowFilter_Ui_Form): """ signal_data_change = pyqtSignal(str, dict, str, str, str, str, str) # 自定义信号,用于修改数据 - def __init__(self, parent=None): + def __init__(self, parent=None, data_manager=None): super().__init__(parent) self.setupUi(self) self.center() self.current_dataset = pd.DataFrame() self.current_dataset_name = '' - self.all_dataset = {} + self.data_manager = data_manager self.current_dataset_columns = [] self.data_type = [] self.filter_dataset = pd.DataFrame() @@ -443,10 +447,11 @@ class DataRowFilterForm(DataProcessDialog, DataRowFilter_Ui_Form): if ok and (len(dataset_name) != 0): logging.info("发射导入数据信号") if len(self.filter_dataset) > 0: - create_time = self.all_dataset.get(self.current_dataset_name + '.create_time') + property_dic = self.data_manager.get_info(self.current_dataset_name) + create_time = property_dic['create_time'] update_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 数据更新时间 - path = self.all_dataset.get(self.current_dataset_name + '.path') - file_size = self.all_dataset.get(self.current_dataset_name + '.file_size') + path = property_dic['path'] + file_size = property_dic['file_size'] remarks = '' self.signal_data_change.emit(dataset_name, self.filter_dataset.to_dict(), @@ -466,10 +471,11 @@ class DataRowFilterForm(DataProcessDialog, DataRowFilter_Ui_Form): if reply == QMessageBox.Yes: logging.info("发射导入数据信号") if len(self.filter_dataset) > 0: - create_time = self.all_dataset.get(self.current_dataset_name + '.create_time') + info_dic = self.data_manager.get_info(self.current_dataset_name) + create_time = info_dic['create_time'] update_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 数据更新时间 - path = self.all_dataset.get(self.current_dataset_name + '.path') - file_size = self.all_dataset.get(self.current_dataset_name + '.file_size') + path = info_dic['path'] + file_size = info_dic['file_size'] remarks = '' self.signal_data_change.emit(self.current_dataset_name, self.filter_dataset.to_dict(), @@ -720,7 +726,7 @@ class DataMergeVerticalForm(DataProcessDialog, DataMergeVertical_Ui_Form): self.center() self.current_dataset_name = "" - self.all_dataset = {} # 定义“全部数据集”为一个字典 + self.data_manager = None # 定义“全部数据集”为一个字典 self.all_dataset_name = () self.dataset_alter = pd.DataFrame() # 修改后的数据 @@ -860,12 +866,12 @@ class DataMergeVerticalForm(DataProcessDialog, DataMergeVertical_Ui_Form): def dataset_merge_vertical(self): dataset_name = self.listWidget_start.item(0).text() - dataset_start = self.all_dataset.get(dataset_name) + dataset_start = self.data_manager.get(dataset_name) dataset_merge_list_name = [] dataset_merge_list = [dataset_start, ] for i in range(self.listWidget_append.count()): dataset_merge_list_name.append(self.listWidget_append.item(i).text()) - dataset_merge_list.append(self.all_dataset.get(self.listWidget_append.item(i).text())) + dataset_merge_list.append(self.data_manager.get(self.listWidget_append.item(i).text())) if self.listWidget_start.count() < 1: QMessageBox.information(self, "注意", "请选择起始数据集", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) @@ -880,10 +886,10 @@ class DataMergeVerticalForm(DataProcessDialog, DataMergeVertical_Ui_Form): if reply == QMessageBox.Yes: logging.info("发射导入数据信号") if len(self.dataset_alter) > 0: - create_time = self.all_dataset.get(self.current_dataset_name + '.create_time') + create_time = self.data_manager.get(self.current_dataset_name + '.create_time') update_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 数据更新时间 - path = self.all_dataset.get(self.current_dataset_name + '.path') - file_size = self.all_dataset.get(self.current_dataset_name + '.file_size') + path = self.data_manager.get(self.current_dataset_name + '.path') + file_size = self.data_manager.get(self.current_dataset_name + '.file_size') remarks = '' self.signal_data_change.emit(self.current_dataset_name, self.dataset_alter.to_dict(), @@ -904,10 +910,10 @@ class DataMergeVerticalForm(DataProcessDialog, DataMergeVertical_Ui_Form): if ok and (len(dataset_name) != 0): logging.info("发射导入数据信号") if len(self.dataset_alter) > 0: - create_time = self.all_dataset.get(self.current_dataset_name + '.create_time') + create_time = self.data_manager.get(self.current_dataset_name + '.create_time') update_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 数据更新时间 - path = self.all_dataset.get(self.current_dataset_name + '.path') - file_size = self.all_dataset.get(self.current_dataset_name + '.file_size') + path = self.data_manager.get(self.current_dataset_name + '.path') + file_size = self.data_manager.get(self.current_dataset_name + '.file_size') remarks = '' self.signal_data_change.emit(dataset_name, self.dataset_alter.to_dict(), @@ -934,7 +940,7 @@ class DataMergeHorizontalForm(DataProcessDialog, DataMergeHorizontal_Ui_Form): self.center() self.current_dataset_name = "" - self.all_dataset = {} # 定义“全部数据集”为一个字典 + self.data_manager = {} # 定义“全部数据集”为一个字典 self.dataset_alter = pd.DataFrame() self.listWidget_dataset.setSelectionMode(QAbstractItemView.ExtendedSelection) # 设置为按住ctrl可以多选 @@ -1067,14 +1073,14 @@ class DataMergeHorizontalForm(DataProcessDialog, DataMergeHorizontal_Ui_Form): def dataset_merge_horizontal(self): dataset_name = self.listWidget_start.item(0).text() # dataset_name - dataset_start = self.all_dataset.get(dataset_name) # dataset_start + dataset_start = self.data_manager.get(dataset_name) # dataset_start dataset_merge_list_name = [] # 要合并的数据集名称 dataset_merge_list = [] # 要合并的数据 for i in range(self.listWidget_append.count()): # 遍历列表n-1次 if i < self.listWidget_append.count(): dataset_name = self.listWidget_append.item(i).text() dataset_merge_list_name.append(dataset_name) - dataset = self.all_dataset.get(self.listWidget_append.item(i).text()).copy() # 避免修改原始数据 + dataset = self.data_manager.get(self.listWidget_append.item(i).text()).copy() # 避免修改原始数据 dataset.columns = [x + "_" + dataset_name.split('.')[0] for x in dataset.columns] # 为列名添加数据集后缀 dataset_merge_list.append(dataset) @@ -1094,10 +1100,10 @@ class DataMergeHorizontalForm(DataProcessDialog, DataMergeHorizontal_Ui_Form): if reply == QMessageBox.Yes: logging.info("发射导入数据信号") if len(self.dataset_alter) > 0: - create_time = self.all_dataset.get(self.current_dataset_name + '.create_time') + create_time = self.data_manager.get(self.current_dataset_name + '.create_time') update_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 数据更新时间 - path = self.all_dataset.get(self.current_dataset_name + '.path') - file_size = self.all_dataset.get(self.current_dataset_name + '.file_size') + path = self.data_manager.get(self.current_dataset_name + '.path') + file_size = self.data_manager.get(self.current_dataset_name + '.file_size') remarks = '' self.signal_data_change.emit(self.current_dataset_name, self.dataset_alter.to_dict(), @@ -1118,10 +1124,10 @@ class DataMergeHorizontalForm(DataProcessDialog, DataMergeHorizontal_Ui_Form): if ok and (len(dataset_name) != 0): logging.info("发射导入数据信号") if len(self.dataset_alter) > 0: - create_time = self.all_dataset.get(self.current_dataset_name + '.create_time') + create_time = self.data_manager.get(self.current_dataset_name + '.create_time') update_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 数据更新时间 - path = self.all_dataset.get(self.current_dataset_name + '.path') - file_size = self.all_dataset.get(self.current_dataset_name + '.file_size') + path = self.data_manager.get(self.current_dataset_name + '.path') + file_size = self.data_manager.get(self.current_dataset_name + '.file_size') remarks = '' self.signal_data_change.emit(dataset_name, self.dataset_alter.to_dict(), @@ -1182,7 +1188,7 @@ class DataMissingValueForm(DataProcessDialog, DataMissingValue_Ui_Form): self.current_dataset = pd.DataFrame() # 当前数据集 self.current_dataset_name = "" - self.all_dataset = dict() + self.data_manager = dict() self.missing_dataset = pd.DataFrame() # 处理后的缺失值数据 self.missing_stat_dataset = pd.DataFrame() # 缺失值统计数据 @@ -1351,10 +1357,10 @@ class DataMissingValueForm(DataProcessDialog, DataMissingValue_Ui_Form): def dataset_update(self): logging.info("发射导入数据信号") if len(self.missing_dataset) > 0: - create_time = self.all_dataset.get(self.current_dataset_name + '.create_time') + create_time = self.data_manager.get(self.current_dataset_name + '.create_time') update_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 数据更新时间 - path = self.all_dataset.get(self.current_dataset_name + '.path') - file_size = self.all_dataset.get(self.current_dataset_name + '.file_size') + path = self.data_manager.get(self.current_dataset_name + '.path') + file_size = self.data_manager.get(self.current_dataset_name + '.file_size') remarks = '' self.signal_data_change.emit(self.current_dataset_name, self.missing_dataset.to_dict(), path, create_time, update_time, remarks, file_size) # 发射信号 @@ -1371,10 +1377,10 @@ class DataMissingValueForm(DataProcessDialog, DataMissingValue_Ui_Form): if ok and (len(dataset_name) != 0): logging.info("发射导入数据信号") if len(self.missing_dataset) > 0: - create_time = self.all_dataset.get(self.current_dataset_name + '.create_time') + create_time = self.data_manager.get(self.current_dataset_name + '.create_time') update_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 数据更新时间 - path = self.all_dataset.get(self.current_dataset_name + '.path') - file_size = self.all_dataset.get(self.current_dataset_name + '.file_size') + path = self.data_manager.get(self.current_dataset_name + '.path') + file_size = self.data_manager.get(self.current_dataset_name + '.file_size') remarks = '' self.signal_data_change.emit(dataset_name, self.missing_dataset.to_dict(), path, create_time, update_time, remarks, file_size) # 发射信号 diff --git a/pyminer/features/sample/io.py b/pyminer/features/sample/io.py index 85f587d9..cb3aae56 100644 --- a/pyminer/features/sample/io.py +++ b/pyminer/features/sample/io.py @@ -11,7 +11,7 @@ from PyQt5 import QtWidgets, QtCore from PyQt5.QtWidgets import * from PyQt5.QtCore import * -#导入功能组件 +# 导入功能组件 from pyminer.ui.data.data_import_text import Ui_Form as Import_Ui_Form from pyminer.ui.data.data_import_excel import Ui_Form as ExcelImport_Ui_Form from pyminer.ui.data.data_import_spss import Ui_Form as SPSSImport_Ui_Form @@ -23,7 +23,7 @@ logging.basicConfig(format="%(asctime)s %(name)s:%(levelname)s:%(message)s", dat level=logging.INFO) -class ImportForm(QDialog,Import_Ui_Form): +class ImportForm(QDialog, Import_Ui_Form): """ "导入"窗口 """ @@ -34,7 +34,7 @@ class ImportForm(QDialog,Import_Ui_Form): self.setupUi(self) self.center() - #QssTools.set_qss_to_obj(ui_dir + "/source/qss/patata.qss", self) + # QssTools.set_qss_to_obj(ui_dir + "/source/qss/patata.qss", self) self.file_path = '' self.current_dataset_name = "" @@ -104,9 +104,9 @@ class ImportForm(QDialog,Import_Ui_Form): self.file_path, header, skiprows, nrows_preview, na_values)) self.current_dataset = pd.read_csv(self.file_path, engine="python", sep=sep, - encoding=encoding, - header=header, - skiprows=skiprows, nrows=nrows, na_values=na_values) + encoding=encoding, + header=header, + skiprows=skiprows, nrows=nrows, na_values=na_values) if len(self.current_dataset) == 0: self.tableWidget_previewData.clear() @@ -124,8 +124,8 @@ class ImportForm(QDialog,Import_Ui_Form): update_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 数据更新时间 path = self.file_path print("path:", path) - file_size=str(os.path.getsize(path)) - print("file_size:",file_size) + file_size = str(os.path.getsize(path)) + print("file_size:", file_size) remarks = '' self.signal_data_change.emit(self.current_dataset_name, self.current_dataset.to_dict(), path, create_time, update_time, remarks, file_size) # 发射信号 @@ -195,8 +195,8 @@ class ImportForm(QDialog,Import_Ui_Form): na_values = self.lineEdit_missValue.text() self.current_dataset = pd.read_csv(self.file_path, engine="python", sep=sep, encoding=encoding, - header=header, - skiprows=skiprows, nrows=nrows, na_values=na_values) + header=header, + skiprows=skiprows, nrows=nrows, na_values=na_values) if len(self.current_dataset) == 0: self.tableWidget_previewData.clear() @@ -242,7 +242,7 @@ class ImportForm(QDialog,Import_Ui_Form): self.tableWidget_previewData.setItem(i, j, newItem) -class ImportDatabase(QDialog,ImportDatabase_Ui_Form): +class ImportDatabase(QDialog, ImportDatabase_Ui_Form): """ "导入"窗口 """ @@ -256,14 +256,14 @@ class ImportDatabase(QDialog,ImportDatabase_Ui_Form): self.current_dataset_name = '' # 当前数据集名称 self.current_dataset = pd.DataFrame() # 修改后的数据集 - self.all_dataset='' #当前已导入的全部数据 - self.file_path='' #当前数据路径 + self.data_manager = None # 当前已导入的全部数据 + self.file_path = '' # 当前数据路径 - #QssTools.set_qss_to_obj(ui_dir + "/source/qss/patata.qss", self) + # QssTools.set_qss_to_obj(ui_dir + "/source/qss/patata.qss", self) self.label_test.setHidden(True) self.lineEdit_passwd.setEchoMode(QtWidgets.QLineEdit.Password) - #事件 + # 事件 self.pushButton_cancel.clicked.connect(self.close) self.pushButton_test.clicked.connect(self.database_test) self.pushButton_ok.clicked.connect(self.import_send_dataset) @@ -291,21 +291,20 @@ class ImportDatabase(QDialog,ImportDatabase_Ui_Form): logging.info("导入数据信号发射失败") self.close() - def database_test(self): import pymysql - host=self.lineEdit_host.text() - user=self.lineEdit_user.text() - passwd=self.lineEdit_passwd.text() - db=self.lineEdit_db.text() - port=self.spinBox_port.value() + host = self.lineEdit_host.text() + user = self.lineEdit_user.text() + passwd = self.lineEdit_passwd.text() + db = self.lineEdit_db.text() + port = self.spinBox_port.value() charset = 'utf8' - table=self.lineEdit_table.text() - sql='select * from '+db+'.'+table; + table = self.lineEdit_table.text() + sql = 'select * from ' + db + '.' + table; print(sql) - if len(db)==0: - QMessageBox.information(self, '注意', '数据库名不能为空', QMessageBox.Ok , QMessageBox.Ok) - elif len(table)==0: + if len(db) == 0: + QMessageBox.information(self, '注意', '数据库名不能为空', QMessageBox.Ok, QMessageBox.Ok) + elif len(table) == 0: QMessageBox.information(self, '注意', '表名不能为空', QMessageBox.Ok, QMessageBox.Ok) else: try: @@ -326,25 +325,25 @@ class ImportDatabase(QDialog,ImportDatabase_Ui_Form): def database_connect(self): import pymysql - host=self.lineEdit_host.text() - user=self.lineEdit_user.text() - passwd=self.lineEdit_passwd.text() - db=self.lineEdit_db.text() - port=self.spinBox_port.value() + host = self.lineEdit_host.text() + user = self.lineEdit_user.text() + passwd = self.lineEdit_passwd.text() + db = self.lineEdit_db.text() + port = self.spinBox_port.value() charset = 'utf8' - table=self.lineEdit_table.text() - self.current_dataset_name=table - self.file_path=db+'.'+table - sql='select * from '+self.file_path; + table = self.lineEdit_table.text() + self.current_dataset_name = table + self.file_path = db + '.' + table + sql = 'select * from ' + self.file_path; print(sql) - if len(db)==0: - QMessageBox.information(self, '注意', '数据库名不能为空', QMessageBox.Ok , QMessageBox.Ok) - elif len(table)==0: + if len(db) == 0: + QMessageBox.information(self, '注意', '数据库名不能为空', QMessageBox.Ok, QMessageBox.Ok) + elif len(table) == 0: QMessageBox.information(self, '注意', '表名不能为空', QMessageBox.Ok, QMessageBox.Ok) else: try: conn = pymysql.connect(host=host, user=user, passwd=passwd, db=db, port=port, charset=charset) - df = pd.read_sql(sql, con = conn) + df = pd.read_sql(sql, con=conn) return df conn.close() print('连接成功') @@ -375,7 +374,7 @@ class ImportDatabase(QDialog,ImportDatabase_Ui_Form): self.close() -class ImportExcelForm(QDialog,ExcelImport_Ui_Form): +class ImportExcelForm(QDialog, ExcelImport_Ui_Form): """ 打开"从excel导入"窗口 """ @@ -386,9 +385,9 @@ class ImportExcelForm(QDialog,ExcelImport_Ui_Form): self.setupUi(self) self.center() - self.file_path = '' #文件路径 - self.current_dataset_name = "" #当前数据集名称 - self.current_dataset = pd.DataFrame() #当前数据集 + self.file_path = '' # 文件路径 + self.current_dataset_name = "" # 当前数据集名称 + self.current_dataset = pd.DataFrame() # 当前数据集 # 导入窗口的相关事件 # 在"导入"窗口,打开选择文件 @@ -489,8 +488,8 @@ class ImportExcelForm(QDialog,ExcelImport_Ui_Form): self.file_path, sheet, header, skiprows, nrows_preview, na_values)) self.current_dataset = pd.read_excel(self.file_path, sheet_name=sheet, - header=header, - skiprows=skiprows, nrows=nrows, na_values=na_values) + header=header, + skiprows=skiprows, nrows=nrows, na_values=na_values) if len(self.current_dataset) == 0: self.tableWidget_previewData.clear() @@ -563,7 +562,7 @@ class ImportExcelForm(QDialog,ExcelImport_Ui_Form): logging.info("file_path:{},sheet_name:{},header:{},skiprows:{},nrows:{},na_values:{}".format( self.file_path, sheet, header, skiprows, nrows_preview, na_values)) - if len(sheet)>0: + if len(sheet) > 0: self.current_dataset = pd.read_excel(self.file_path, sheet_name=sheet, header=header, skiprows=skiprows, nrows=nrows, na_values=na_values) @@ -612,8 +611,7 @@ class ImportExcelForm(QDialog,ExcelImport_Ui_Form): self.tableWidget_previewData.setItem(i, j, newItem) - -class ImportSpssForm(QDialog,SPSSImport_Ui_Form): +class ImportSpssForm(QDialog, SPSSImport_Ui_Form): """ 打开"从spss导入"窗口 """ @@ -624,7 +622,7 @@ class ImportSpssForm(QDialog,SPSSImport_Ui_Form): self.setupUi(self) self.center() - #QssTools.set_qss_to_obj(ui_dir + "/source/qss/patata.qss", self) + # QssTools.set_qss_to_obj(ui_dir + "/source/qss/patata.qss", self) self.file_path = '' self.current_dataset_name = "" @@ -826,7 +824,7 @@ class ImportSpssForm(QDialog,SPSSImport_Ui_Form): return self.current_dataset.columns -class ImportSasForm(QDialog,SASImport_Ui_Form): +class ImportSasForm(QDialog, SASImport_Ui_Form): """ 打开"从sas导入"窗口 """ diff --git a/pyminer/pmapp.py b/pyminer/pmapp.py index 5acada0c..90e427f5 100644 --- a/pyminer/pmapp.py +++ b/pyminer/pmapp.py @@ -9,13 +9,12 @@ import webbrowser import qdarkstyle import os, sys -from PyQt5.QtCore import QSize, pyqtSignal, QTimer, QRectF -from PyQt5.QtWidgets import QApplication, QStyleFactory, QDesktopWidget, QMessageBox, QSplashScreen, QTreeWidgetItem, \ - QListWidgetItem, QWidget, QHBoxLayout, QGridLayout, QLabel, QSpacerItem, QSizePolicy, \ - QGraphicsDropShadowEffect, QListWidget, QGraphicsScene, QAbstractItemView, QTableWidgetItem, QGraphicsObject, \ +from PyQt5.QtCore import QRectF +from PyQt5.QtWidgets import QApplication, QStyleFactory, QDesktopWidget, QMessageBox, QTreeWidgetItem, \ + QGraphicsScene, QAbstractItemView, QTableWidgetItem, QGraphicsObject, \ QGraphicsItem, QFileDialog from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QMenu -from PyQt5.QtGui import QIcon, QPixmap, QImage, QColor, QPainter, QPainterPath, QPen, QTextCursor, QBrush, QCursor +from PyQt5.QtGui import QIcon, QColor, QPainter, QPen, QTextCursor, QBrush, QCursor from pyminer.features.sample import io from pyminer.ui.base.mainForm import Ui_MainWindow @@ -41,6 +40,7 @@ import pandas as pd from pyminer.ui.base.widgets.notificationwidget import NotificationWindow from pyminer.features.statistics.test_basic_stats import StatsBaseForm +from pyminer.share.datahost import DataManager TextStyle = """ QMessageBox QPushButton[text="OK"] { @@ -184,11 +184,16 @@ class MyMainForm(QMainWindow, Ui_MainWindow): self.center() self.__file_path_choose = "" - self.__all_dataset = dict() # 定义字典,保存全部数据集的基本信息 - self.__all_dataset_name = set() # 定义集合,保存全部数据集名称,确保不会重复 + # self.__all_dataset = dict() # 定义字典,保存全部数据集的基本信息 + # self.__all_dataset_name = set() # 定义集合,保存全部数据集名称,确保不会重复 + + self.data_manager = DataManager() # __all_dataset和__all_dataset_name都已经注释掉了。现在用self.datahost来代替。 + # 关于datahost的用法见其定义的文件。 + self.__current_dataset_name = "" self.__current_dataset = pd.DataFrame() self.__current_dataset_dtype = set() # 定义集合,保存当前数据集中存在的数据类型,确保不会重复 + self.__result_path = '' # 结果文件保存路径 self.__setting = dict() # 设置文件 self.slot_flush_console('info', 'system', 'pyminer已准备就绪') @@ -738,7 +743,6 @@ class MyMainForm(QMainWindow, Ui_MainWindow): """ print("开始更新数据") node_name = self.treeWidget_storehouse.currentItem().text(0) - print(node_name) all_data = pd.DataFrame(self.__all_dataset.get(node_name)) # 获取当前数据 self.__current_dataset_name = node_name # 修改当前数据名称 # 获取已经导入页面获取的数据集 @@ -830,7 +834,7 @@ class MyMainForm(QMainWindow, Ui_MainWindow): # 修改当前正在使用的数据集 self.__current_dataset = dataset self.__current_dataset_name = dataset_name - self.__all_dataset_name.add(dataset_name) # 保存数据集名称 + row = str(dataset.shape[0]) # 行数 col = str(dataset.shape[1]) # 列数 memory_size = self.__current_dataset.memory_usage().sum() @@ -865,33 +869,12 @@ class MyMainForm(QMainWindow, Ui_MainWindow): data_notna_cnt.append(dataset.loc[:, i].notna().sum()) info = pd.DataFrame({"变量名称": list(dataset.columns), "数据类型": data_type, "非空值数量": data_notna_cnt}) - dataset_new = {dataset_name: dataset, - dataset_name + ".path": path, - dataset_name + ".create_time": create_time, - dataset_name + ".update_time": update_time, - dataset_name + ".row": row, - dataset_name + ".col": col, - dataset_name + ".remarks": remarks, - dataset_name + ".file_size": file_usage, - dataset_name + ".memory_usage": memory_usage, - dataset_name + ".info": info, } - # 添加当前数据集到数据集列表中 print("添加当前数据集到数据集列表中") - # 检查数据集名称是否已存在,如果存在则修改相关信息,否则进行新增 - if self.__current_dataset_name in list(self.__all_dataset.keys()): - self.__all_dataset[dataset_name] = dataset - self.__all_dataset[dataset_name + ".path"] = path - self.__all_dataset[dataset_name + ".create_time"] = create_time - self.__all_dataset[dataset_name + ".update_time"] = update_time - self.__all_dataset[dataset_name + ".row"] = row - self.__all_dataset[dataset_name + ".col"] = col - self.__all_dataset[dataset_name + ".remarks"] = remarks - self.__all_dataset[dataset_name + ".file_size"] = file_size - self.__all_dataset[dataset_name + ".memory_usage"] = memory_usage - self.__all_dataset[dataset_name + ".info"] = info - else: - self.__all_dataset.update(dataset_new) + self.data_manager.set_data(dataset_name, dataset) + self.data_manager.set_info(dataset_name, path=path, create_time=create_time, update_time=update_time, + row=row, col=col, remarks=remarks, file_size=file_size, memory_usage=memory_usage, + info=info) self.tabWidget.setCurrentIndex(0) def add_dataset_to_workdir(self, dataset_name): @@ -932,7 +915,7 @@ class MyMainForm(QMainWindow, Ui_MainWindow): 显示"从数据库导入"窗口 """ self.import_database = io.ImportDatabase() - self.import_database.all_dataset = self.__all_dataset + self.import_database.data_manager = self.data_manager self.import_database.signal_data_change.connect(self.slot_dataset_reload) self.import_database.show() @@ -940,10 +923,10 @@ class MyMainForm(QMainWindow, Ui_MainWindow): """ 显示"数据-行筛选"窗口 """ - self.data_row_filter_form = preprocess.DataRowFilterForm() + self.data_row_filter_form = preprocess.DataRowFilterForm(data_manager=self.data_manager) self.data_row_filter_form.current_dataset = self.__current_dataset self.data_row_filter_form.current_dataset_name = self.__current_dataset_name - self.data_row_filter_form.all_dataset = self.__all_dataset + self.data_row_filter_form.current_dataset_columns = self.__current_dataset.columns self.data_row_filter_form.comboBox_columns.addItems(list(self.__current_dataset.columns)) for col in self.__current_dataset.columns: @@ -958,21 +941,20 @@ class MyMainForm(QMainWindow, Ui_MainWindow): 显示"数据信息"窗口 """ self.data_info = preprocess.DataInfoForm() - self.data_info.all_dataset = self.__all_dataset - self.data_info.all_dataset_name = list(self.__all_dataset_name) + self.data_info.data_manager = self.data_manager # [TODO]这是什么? + self.data_info.all_dataset_name = list(self.data_manager.all_data_names) self.data_info.current_dataset_name = self.__current_dataset_name self.data_info.lineEdit_dataset_name.setText(self.__current_dataset_name) - self.data_info.lineEdit_path.setText(self.__all_dataset.get(self.__current_dataset_name + ".path")) - self.data_info.lineEdit_row.setText(self.__all_dataset.get(self.__current_dataset_name + ".row")) - self.data_info.lineEdit_col.setText(self.__all_dataset.get(self.__current_dataset_name + ".col")) - self.data_info.lineEdit_file_size.setText(self.__all_dataset.get(self.__current_dataset_name + ".file_size")) - self.data_info.lineEdit_memory_usage.setText( - self.__all_dataset.get(self.__current_dataset_name + ".memory_usage")) - self.data_info.lineEdit_create_time.setText( - self.__all_dataset.get(self.__current_dataset_name + ".create_time")) - self.data_info.lineEdit_update_time.setText( - self.__all_dataset.get(self.__current_dataset_name + ".update_time")) - self.data_info.info = self.__all_dataset.get(self.__current_dataset_name + ".info") + + info_dic = self.data_manager.get_info(self.__current_dataset_name) # 调用get_info方法可以获取数据的信息,全部信息以列表的形式返回。 + + self.data_info.lineEdit_path.setText(info_dic.get('path')) + self.data_info.lineEdit_row.setText(info_dic.get('row')) + self.data_info.lineEdit_col.setText(info_dic.get('col')) + self.data_info.lineEdit_file_size.setText(info_dic.get('file_size')) + self.data_info.lineEdit_memory_usage.setText(info_dic.get('memory_usage')) + self.data_info.lineEdit_create_time.setText(info_dic.get('create_time')) + self.data_info.lineEdit_update_time.setText(info_dic.get('update_time')) self.data_info.info_init() self.data_info.exec_() @@ -989,7 +971,7 @@ class MyMainForm(QMainWindow, Ui_MainWindow): """ self.data_role = preprocess.DataRoleForm() self.data_role.current_dataset = self.__current_dataset.copy() - self.data_role.all_dataset = self.__all_dataset + self.data_role.data_manager = self.data_manager self.data_role.current_dataset_name = self.__current_dataset_name self.data_role.current_dataset_columns = self.__current_dataset.columns self.data_role.comboBox_columns.addItems(list(self.__current_dataset.columns)) @@ -1002,9 +984,9 @@ class MyMainForm(QMainWindow, Ui_MainWindow): 显示"数据-纵向合并"窗口 """ self.data_merge_vertical = preprocess.DataMergeVerticalForm() - self.data_merge_vertical.listWidget_dataset.addItems(list(self.__all_dataset_name)) - self.data_merge_vertical.all_dataset = self.__all_dataset - self.data_merge_vertical.all_dataset_name = self.__all_dataset_name + self.data_merge_vertical.listWidget_dataset.addItems(list(self.data_manager.all_data_names)) + self.data_merge_vertical.data_manager = self.data_manager + self.data_merge_vertical.all_dataset_name = self.data_manager.all_data_names self.data_merge_vertical.listWidget_start.addItem(self.__current_dataset_name) self.data_merge_vertical.current_dataset_name = self.__current_dataset_name self.data_merge_vertical.signal_data_change.connect(self.slot_dataset_reload) @@ -1015,11 +997,11 @@ class MyMainForm(QMainWindow, Ui_MainWindow): 显示"数据-横向合并"窗口 """ self.data_merge_horizontal = preprocess.DataMergeHorizontalForm() - self.data_merge_horizontal.listWidget_dataset.addItems(list(self.__all_dataset_name)) - self.data_merge_horizontal.all_dataset = self.__all_dataset - self.data_merge_horizontal.all_dataset_name = self.__all_dataset_name + self.data_merge_horizontal.listWidget_dataset.addItems(list(self.data_manager.all_data_names)) + self.data_merge_horizontal.data_manager = self.data_manager + self.data_merge_horizontal.all_dataset_name = self.data_manager.all_data_names self.data_merge_horizontal.listWidget_start.addItem(self.__current_dataset_name) - self.data_merge_vertical.current_dataset_name = self.__current_dataset_name + self.data_merge_horizontal.current_dataset_name = self.__current_dataset_name self.data_merge_horizontal.signal_data_change.connect(self.slot_dataset_reload) self.data_merge_horizontal.exec_() @@ -1048,7 +1030,7 @@ class MyMainForm(QMainWindow, Ui_MainWindow): """ self.data_missing_value = preprocess.DataMissingValueForm() self.data_missing_value.current_dataset = self.__current_dataset - self.data_missing_value.all_dataset = self.__all_dataset + self.data_missing_value.data_manager = self.data_manager self.data_missing_value.current_dataset_name = self.__current_dataset_name self.data_missing_value.current_dataset_columns = self.__current_dataset.columns self.data_missing_value.listWidget_var.addItems(list(self.__current_dataset.columns)) diff --git a/pyminer/share/datahost/__init__.py b/pyminer/share/datahost/__init__.py index e69de29b..b15a7830 100644 --- a/pyminer/share/datahost/__init__.py +++ b/pyminer/share/datahost/__init__.py @@ -0,0 +1 @@ +from .datamanager import DataManager diff --git a/pyminer/share/datahost/datamanager.py b/pyminer/share/datahost/datamanager.py index 0e19bb59..f78acb54 100644 --- a/pyminer/share/datahost/datamanager.py +++ b/pyminer/share/datahost/datamanager.py @@ -76,7 +76,7 @@ class Data(): self.info = dataset_info -class Data_Complexed(): +class Data_With_Undo_Func(): ''' 这是一个数据对象,可以管理数据的历史。 支持的对象类型应当是有限的,比如dataframe,ndarray等。 @@ -168,8 +168,9 @@ class Data_Complexed(): self.info = dataset_info -class DataHost(): +class DataManager(): ''' + 以下举例均默认data_manager = DataManager() ''' def __init__(self): @@ -180,30 +181,85 @@ class DataHost(): @property def all_data_names(self) -> set: + ''' + 调用方式:data_manager.all_data_names + 可以代替__all_data_names + Returns: + + ''' return {k for k in self.vars.keys()} def get_info(self, name: str): + ''' + + Args: + name: 变量的名称 + + Returns:字典。返回变量的全部属性字典。比如get_info('class')['path'],就是返回名为‘class’的数据集中的‘path’属性。 + + ''' return self.vars[name].info def set_data(self, name: str, value: object) -> None: + ''' + 设置信息。 + 比如说,set_data('a'),就是设置数据集a的值。 + Args: + name: + value: + + Returns: + + ''' if name in self.vars.keys(): self.vars[name].set_data(value) else: self.vars[name] = Data(value) def get_all_data_dic(self): + ''' + 获取所有数据,是一个名称对元素的字典。但是要注意,返回的值是一个Data对象,而不是变量的字典。 + Returns: + + ''' return self.vars - def get_data(self, name: str, copy_val: bool = True) -> object: + def get_data(self, name: str, copy_val: bool = False) -> object: + ''' + 获取名为name的data。如果copy_val是True,那么就将其设置为True之后再 + Args: + name: + copy_val: + + Returns: + + ''' if name in self.vars.keys(): return self.vars[name].get_data(copy_val=copy_val) else: warnings.warn("Variable \'%s\' isn\'t exist." % name) def get(self, name: str) -> object: + ''' + 等于get_data。 + Args: + name: + + Returns: + + ''' return self.get_data(name) def move_data_stack_pointer(self, name: str, step: int = 1): + ''' + 无效方法,暂时无用。等到引入撤销功能之后就用上了。 + Args: + name: + step: + + Returns: + + ''' if name not in self.vars.keys(): return var = self.vars[name] @@ -218,6 +274,15 @@ class DataHost(): print('到达最新数据,不可再重做!') def move_data_stack_pointer_to(self, name: str, pos: int = -1): + ''' + 暂时用不上的方法。 + Args: + name: + pos: + + Returns: + + ''' if name not in self.vars.keys(): return var = self.vars[name] @@ -242,7 +307,7 @@ class DataHost(): warnings.warn("Variable \'%s\' isn\'t exist." % name) def recover_data(self, name: str) -> None: - '''恢复数据''' + '''从回收站中恢复数据''' if name in self.recycle_bin.keys(): self.vars[name] = self.recycle_bin[name] self.recycle_bin.pop(name) @@ -252,6 +317,7 @@ class DataHost(): def set_info(self, dataset_name: str, path: str, create_time: str, update_time: str, row: str, col: str, remarks: str, file_size: str, memory_usage: str, info=''): + '''设置信息''' self.vars[dataset_name].set_info(dataset_name, path=path, create_time=create_time, update_time=update_time, row=row, col=col, remarks=remarks, file_size=file_size, -- Gitee