mirror of
https://github.com/shizand/statapp.git
synced 2024-12-23 12:12:59 +03:00
refactor: исправлены ВСЕ замечания pylint (#72)
This commit is contained in:
parent
d387a79d6d
commit
a89d7896e3
@ -18,12 +18,16 @@ repos:
|
||||
- id: licenseheaders
|
||||
args: ["-t", ".copyright.tmpl", "-cy", "-f", "-d", "statapp"]
|
||||
pass_filenames: false
|
||||
- repo: https://github.com/pylint-dev/pylint.git
|
||||
rev: v2.17.5
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: pylint
|
||||
name: pylint
|
||||
entry: pylint
|
||||
language: system
|
||||
types: [python]
|
||||
args:
|
||||
[
|
||||
"-rn", # Only display messages
|
||||
"-sn", # Don't display the score
|
||||
"--rcfile=.pylintrc",
|
||||
]
|
||||
|
@ -31,7 +31,7 @@ def main():
|
||||
translator = QtCore.QTranslator(app)
|
||||
locale = QtCore.QLocale.system().name()
|
||||
path = QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)
|
||||
translator.load('qt_%s' % locale, path)
|
||||
translator.load(f'qt_{locale}', path)
|
||||
app.installTranslator(translator)
|
||||
|
||||
window = MainWindow()
|
||||
|
@ -19,12 +19,11 @@
|
||||
#
|
||||
import sys
|
||||
|
||||
from PySide2.QtCore import QSize
|
||||
from PySide2.QtGui import QMovie, QIcon
|
||||
from PySide2.QtGui import QMovie
|
||||
from PySide2.QtWidgets import QMainWindow
|
||||
|
||||
from statapp.ui.ui_about_window import Ui_AboutWindow
|
||||
from statapp.utils import resource_path
|
||||
from statapp.utils import resourcePath, addIcon
|
||||
|
||||
if sys.version_info < (3, 8):
|
||||
import importlib_metadata
|
||||
@ -40,8 +39,8 @@ class AboutWindow(QMainWindow):
|
||||
self.ui = Ui_AboutWindow()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
image_path = resource_path('ui/images/sticker.gif')
|
||||
movie = QMovie(image_path)
|
||||
gifPath = resourcePath('ui/images/sticker.gif')
|
||||
movie = QMovie(gifPath)
|
||||
self.ui.labelgif.setMovie(movie)
|
||||
movie.start()
|
||||
self.movie = movie
|
||||
@ -50,6 +49,4 @@ class AboutWindow(QMainWindow):
|
||||
version = importlib_metadata.version(__package__ or __name__)
|
||||
self.ui.versionLabel.setText(f"Версия: {version}")
|
||||
|
||||
icon = QIcon()
|
||||
icon.addFile(resource_path("ui/images/logo.ico"), QSize(), QIcon.Normal, QIcon.Off)
|
||||
self.setWindowIcon(icon)
|
||||
addIcon(self)
|
||||
|
@ -24,16 +24,16 @@ DIRECT_LINK = 0
|
||||
INDIRECT_LINK = 1
|
||||
|
||||
|
||||
def generate_x_values(mean, std, typeConnection, y):
|
||||
yMean = np.mean(y)
|
||||
def generateXValues(mean, std, typeConnection, yColumn):
|
||||
yMean = np.mean(yColumn)
|
||||
values = []
|
||||
for cur_y in y:
|
||||
for y in yColumn:
|
||||
raz = np.abs(mean - np.random.normal(mean, std))
|
||||
if typeConnection == INDIRECT_LINK:
|
||||
raz *= -1
|
||||
if cur_y > yMean:
|
||||
if y > yMean:
|
||||
x = mean + raz
|
||||
elif cur_y < yMean:
|
||||
elif y < yMean:
|
||||
x = mean - raz
|
||||
else:
|
||||
x = mean
|
||||
@ -41,11 +41,11 @@ def generate_x_values(mean, std, typeConnection, y):
|
||||
return np.array(values)
|
||||
|
||||
|
||||
def variance_analysis(data):
|
||||
def varianceAnalysis(data):
|
||||
return np.array([
|
||||
[np.mean(col), np.std(col), np.min(col), np.max(col)] for col in data.T
|
||||
])
|
||||
|
||||
|
||||
def correlation_analysis(data):
|
||||
def correlationAnalysis(data):
|
||||
return pd.DataFrame(data).corr().to_numpy()
|
||||
|
@ -21,24 +21,24 @@ from PySide2.QtCore import QSize
|
||||
from PySide2.QtGui import QIcon
|
||||
from PySide2.QtWidgets import QDialog, QHeaderView
|
||||
|
||||
from statapp.calculations import correlation_analysis
|
||||
from statapp.calculations import correlationAnalysis
|
||||
from statapp.models.correlation_analysis_model import CorrelationAnalysisModel
|
||||
from statapp.ui.ui_correlation_analysis_window import Ui_CorrelationAnalysisWindow
|
||||
from statapp.utils import resource_path
|
||||
from statapp.utils import resourcePath
|
||||
|
||||
|
||||
class СorrelationAnalysisWindow(QDialog):
|
||||
class CorrelationAnalysisWindow(QDialog):
|
||||
def __init__(self, data):
|
||||
super().__init__()
|
||||
self.ui = Ui_CorrelationAnalysisWindow()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
res = correlation_analysis(data)
|
||||
res = correlationAnalysis(data)
|
||||
self.model = CorrelationAnalysisModel(res.round(2))
|
||||
self.ui.tableView.setModel(self.model)
|
||||
header = self.ui.tableView.horizontalHeader()
|
||||
header.setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
|
||||
|
||||
icon = QIcon()
|
||||
icon.addFile(resource_path("ui/images/logo.ico"), QSize(), QIcon.Normal, QIcon.Off)
|
||||
icon.addFile(resourcePath("ui/images/logo.ico"), QSize(), QIcon.Normal, QIcon.Off)
|
||||
self.setWindowIcon(icon)
|
||||
|
@ -17,13 +17,12 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
from PySide2.QtCore import Slot, QSize
|
||||
from PySide2.QtGui import QIcon
|
||||
from PySide2.QtCore import Slot
|
||||
from PySide2.QtWidgets import QDialog
|
||||
|
||||
from statapp.ui.ui_generate_factor_window import Ui_GenerateFactorWindow
|
||||
from statapp.models.combobox_model import ComboBoxModel
|
||||
from statapp.utils import resource_path
|
||||
from statapp.utils import addIcon
|
||||
|
||||
DIRECT_LINK = 0
|
||||
INDIRECT_LINK = 1
|
||||
@ -44,9 +43,7 @@ class GenerateFactorWindow(QDialog):
|
||||
self.ui.setupUi(self)
|
||||
self.ui.typeComboBox.setModel(self._typeComboBox)
|
||||
|
||||
icon = QIcon()
|
||||
icon.addFile(resource_path("ui/images/logo.ico"), QSize(), QIcon.Normal, QIcon.Off)
|
||||
self.setWindowIcon(icon)
|
||||
addIcon(self)
|
||||
|
||||
@Slot()
|
||||
def on_generatePushButton_clicked(self):
|
||||
|
@ -17,12 +17,11 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
from PySide2.QtCore import Slot, QSize
|
||||
from PySide2.QtGui import QIcon
|
||||
from PySide2.QtCore import Slot
|
||||
from PySide2.QtWidgets import QDialog
|
||||
|
||||
from statapp.ui.ui_generate_window import Ui_GenerateWindow
|
||||
from statapp.utils import resource_path
|
||||
from statapp.utils import addIcon
|
||||
|
||||
|
||||
class GenerateWindow(QDialog):
|
||||
@ -34,9 +33,7 @@ class GenerateWindow(QDialog):
|
||||
self.ui = Ui_GenerateWindow()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
icon = QIcon()
|
||||
icon.addFile(resource_path("ui/images/logo.ico"), QSize(), QIcon.Normal, QIcon.Off)
|
||||
self.setWindowIcon(icon)
|
||||
addIcon(self)
|
||||
|
||||
|
||||
@Slot()
|
||||
|
@ -18,20 +18,19 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
import numpy as np
|
||||
from PySide2.QtCore import Slot, QSize
|
||||
from PySide2.QtGui import QIcon
|
||||
from PySide2.QtWidgets import QMainWindow, QMessageBox, QAction
|
||||
from PySide2.QtCore import Slot
|
||||
from PySide2.QtWidgets import QMainWindow, QMessageBox
|
||||
|
||||
from statapp.calculations import generate_x_values
|
||||
from statapp.calculations import generateXValues
|
||||
from statapp.generate_factor_window import GenerateFactorWindow
|
||||
from statapp.models.input_values_model import InputValuesModel
|
||||
from statapp.generate_window import GenerateWindow
|
||||
from statapp.about_window import AboutWindow
|
||||
from statapp.models.fileslc_model import FileSLCModel
|
||||
from statapp.ui.ui_main_window import Ui_MainWindow
|
||||
from statapp.utils import resource_path, buildMessageBox
|
||||
from statapp.utils import buildMessageBox, addIcon
|
||||
from statapp.variance_analysis import VarianceAnalysisWindow
|
||||
from statapp.correlation_analysis import СorrelationAnalysisWindow
|
||||
from statapp.correlation_analysis import CorrelationAnalysisWindow
|
||||
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
@ -41,14 +40,14 @@ class MainWindow(QMainWindow):
|
||||
self.ui = Ui_MainWindow()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
icon = QIcon()
|
||||
icon.addFile(resource_path("ui/images/logo.ico"), QSize(), QIcon.Normal, QIcon.Off)
|
||||
self.setWindowIcon(icon)
|
||||
addIcon(self)
|
||||
|
||||
self.ui.generateXaction.setEnabled(False)
|
||||
self.ui.varianceAnalysisAction.setEnabled(False)
|
||||
self.ui.correlationAnalisisAction.setEnabled(False)
|
||||
|
||||
self.aboutWindow = None
|
||||
|
||||
self.isDataChanged = False
|
||||
self.model = InputValuesModel()
|
||||
self.fileModel = FileSLCModel()
|
||||
@ -56,12 +55,12 @@ class MainWindow(QMainWindow):
|
||||
|
||||
@Slot()
|
||||
def on_openfileaction_triggered(self):
|
||||
current_data = self.model.getData()
|
||||
currentData = self.model.getData()
|
||||
data = np.array([])
|
||||
if current_data.size > 1:
|
||||
if currentData.size > 1:
|
||||
file = ''
|
||||
if self.fileModel.file_name:
|
||||
file = '\nФайл сохранения: ' + self.fileModel.file_name
|
||||
if self.fileModel.fileName:
|
||||
file = '\nФайл сохранения: ' + self.fileModel.fileName
|
||||
|
||||
msgBox = buildMessageBox \
|
||||
('Сохранение данных',
|
||||
@ -125,10 +124,9 @@ class MainWindow(QMainWindow):
|
||||
if gfw.exec():
|
||||
data = self.model.getData()
|
||||
y = self.model.getY()
|
||||
x_arr = generate_x_values(gfw.mat, gfw.deviation, gfw.typeConnection, y)
|
||||
x_arr = x_arr.reshape(len(x_arr), 1).round(2)
|
||||
# dd = dd.reshape(len(dd), 1)
|
||||
data = np.concatenate((data, x_arr), axis=1)
|
||||
xValues = generateXValues(gfw.mat, gfw.deviation, gfw.typeConnection, y)
|
||||
xValues = xValues.reshape(len(xValues), 1).round(2)
|
||||
data = np.concatenate((data, xValues), axis=1)
|
||||
self.model.updateAllData(data)
|
||||
self.ui.varianceAnalysisAction.setEnabled(True)
|
||||
self.ui.correlationAnalisisAction.setEnabled(True)
|
||||
@ -136,9 +134,8 @@ class MainWindow(QMainWindow):
|
||||
|
||||
@Slot()
|
||||
def on_aboutmenuaction_triggered(self):
|
||||
global about_window
|
||||
about_window = AboutWindow()
|
||||
about_window.show()
|
||||
self.aboutWindow = AboutWindow()
|
||||
self.aboutWindow.show()
|
||||
|
||||
@Slot()
|
||||
def on_varianceAnalysisAction_triggered(self):
|
||||
@ -147,14 +144,14 @@ class MainWindow(QMainWindow):
|
||||
|
||||
@Slot()
|
||||
def on_correlationAnalisisAction_triggered(self):
|
||||
dw = СorrelationAnalysisWindow(self.model.getData())
|
||||
dw = CorrelationAnalysisWindow(self.model.getData())
|
||||
dw.exec()
|
||||
|
||||
def closeEvent(self, event):
|
||||
if self.isDataChanged:
|
||||
file = ''
|
||||
if self.fileModel.file_name:
|
||||
file = '\nФайл сохранения: ' + self.fileModel.file_name
|
||||
if self.fileModel.fileName:
|
||||
file = '\nФайл сохранения: ' + self.fileModel.fileName
|
||||
|
||||
msgBox = buildMessageBox \
|
||||
('Завершение работы',
|
||||
|
@ -20,7 +20,7 @@
|
||||
from PySide2.QtCore import QModelIndex, Qt
|
||||
|
||||
from statapp.models.ro_table_model import ROTableModel
|
||||
from statapp.models.utils import yx_header
|
||||
from statapp.models.utils import yxHeader
|
||||
|
||||
|
||||
class CorrelationAnalysisModel(ROTableModel):
|
||||
@ -28,15 +28,12 @@ class CorrelationAnalysisModel(ROTableModel):
|
||||
super().__init__(data)
|
||||
|
||||
def getHorizontalHeader(self):
|
||||
return yx_header(self.columnCount(QModelIndex()))
|
||||
return yxHeader(self.columnCount(QModelIndex()))
|
||||
|
||||
def getVerticalHeader(self):
|
||||
return yx_header(self.rowCount(QModelIndex()))
|
||||
return yxHeader(self.rowCount(QModelIndex()))
|
||||
|
||||
def data(self, index, role):
|
||||
if role == Qt.DisplayRole:
|
||||
if (index.column() <= index.row()):
|
||||
return float(self._data[index.row(), index.column()])
|
||||
else:
|
||||
None
|
||||
if role == Qt.DisplayRole and index.column() <= index.row():
|
||||
return super().data(index, role)
|
||||
return None
|
||||
|
@ -43,7 +43,7 @@ class EditableTableModel(ROTableModel):
|
||||
return False
|
||||
|
||||
def data(self, index, role):
|
||||
if role == Qt.DisplayRole or role == Qt.EditRole:
|
||||
return float(self._data[index.row(), index.column()])
|
||||
if role in (Qt.DisplayRole, Qt.EditRole):
|
||||
return super().data(index, Qt.DisplayRole)
|
||||
|
||||
return None
|
||||
|
@ -24,30 +24,35 @@ from PySide2.QtWidgets import QFileDialog, QMessageBox
|
||||
class FileSLCModel:
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.file_name = None
|
||||
self.fileName = None
|
||||
|
||||
def saveFile(self, data):
|
||||
if not self.file_name:
|
||||
self.file_name, _ = QFileDialog.getSaveFileName(None, "Сохранить файл", "", "Text Files (*.txt);;CSV Files (*.csv)")
|
||||
if self.file_name:
|
||||
np.savetxt(self.file_name, data, delimiter=",")
|
||||
if not self.fileName:
|
||||
self.fileName, _ = QFileDialog.getSaveFileName(
|
||||
None, "Сохранить файл", "", "Text Files (*.txt);;CSV Files (*.csv)"
|
||||
)
|
||||
if self.fileName:
|
||||
np.savetxt(self.fileName, data, delimiter=",")
|
||||
return True
|
||||
return False
|
||||
|
||||
def loadFile(self):
|
||||
self.file_name, _ = QFileDialog.getOpenFileName(None, "Загрузить файл", "", "Files (*.txt *.csv)")
|
||||
if self.file_name:
|
||||
self.fileName, _ = QFileDialog.getOpenFileName(
|
||||
None, "Загрузить файл", "", "Files (*.txt *.csv)"
|
||||
)
|
||||
if self.fileName:
|
||||
try:
|
||||
content = np.genfromtxt(self.file_name, delimiter=',', invalid_raise=True, ndmin=2)
|
||||
except ValueError as e:
|
||||
content = np.genfromtxt(self.fileName, delimiter=',', invalid_raise=True, ndmin=2)
|
||||
except ValueError:
|
||||
QMessageBox.warning \
|
||||
(None,
|
||||
'Ошибка',
|
||||
"Ошибка чтения файла!\nФайл нельзя открыть или файл неверного формата")
|
||||
self.file_name = None
|
||||
self.fileName = None
|
||||
return None
|
||||
return content
|
||||
|
||||
return None
|
||||
|
||||
def closeFile(self):
|
||||
self.file_name = None
|
||||
pass
|
||||
self.fileName = None
|
||||
|
@ -18,10 +18,10 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
import numpy as np
|
||||
from PySide2.QtCore import Qt, QModelIndex
|
||||
from PySide2.QtCore import QModelIndex
|
||||
|
||||
from statapp.models.editable_table_model import EditableTableModel
|
||||
from statapp.models.utils import yx_header
|
||||
from statapp.models.utils import yxHeader
|
||||
|
||||
|
||||
class InputValuesModel(EditableTableModel):
|
||||
@ -29,7 +29,7 @@ class InputValuesModel(EditableTableModel):
|
||||
super().__init__(data)
|
||||
|
||||
def getHorizontalHeader(self):
|
||||
return yx_header(self.columnCount(QModelIndex()))
|
||||
return yxHeader(self.columnCount(QModelIndex()))
|
||||
|
||||
def getY(self):
|
||||
return self._data[:, 0]
|
||||
|
@ -17,12 +17,11 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
import PySide2
|
||||
import numpy as np
|
||||
from PySide2 import QtCore
|
||||
from PySide2.QtCore import Qt
|
||||
|
||||
from statapp.utils import safe_list_get
|
||||
from statapp.utils import safeListGet
|
||||
|
||||
|
||||
class ROTableModel(QtCore.QAbstractTableModel):
|
||||
@ -55,7 +54,7 @@ class ROTableModel(QtCore.QAbstractTableModel):
|
||||
|
||||
def headerData(self, section: int, orientation: Qt.Orientation, role: int = ...):
|
||||
if role == Qt.DisplayRole:
|
||||
return safe_list_get(self._headers[orientation](), section, None)
|
||||
return safeListGet(self._headers[orientation](), section, None)
|
||||
|
||||
return None
|
||||
|
||||
|
@ -17,5 +17,5 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
def yx_header(count):
|
||||
def yxHeader(count):
|
||||
return ['Y'] + [f'X{i}' for i in range(1, count)]
|
||||
|
@ -20,7 +20,7 @@
|
||||
from PySide2.QtCore import QModelIndex
|
||||
|
||||
from statapp.models.ro_table_model import ROTableModel
|
||||
from statapp.models.utils import yx_header
|
||||
from statapp.models.utils import yxHeader
|
||||
|
||||
|
||||
class VarianceAnalysisModel(ROTableModel):
|
||||
@ -31,4 +31,4 @@ class VarianceAnalysisModel(ROTableModel):
|
||||
return ['Мат. ожидание', 'Среднекв. отклонение', 'Минимум', 'Максимум']
|
||||
|
||||
def getVerticalHeader(self):
|
||||
return yx_header(self.rowCount(QModelIndex()))
|
||||
return yxHeader(self.rowCount(QModelIndex()))
|
||||
|
@ -20,21 +20,28 @@
|
||||
import os
|
||||
import sys
|
||||
|
||||
from PySide2.QtCore import QSize
|
||||
from PySide2.QtGui import QIcon
|
||||
from PySide2.QtWidgets import QMessageBox
|
||||
|
||||
|
||||
def resource_path(relative):
|
||||
def resourcePath(relative):
|
||||
if getattr(sys, 'frozen', False):
|
||||
bundle_dir = sys._MEIPASS
|
||||
# pylint: disable=protected-access
|
||||
bundleDir = sys._MEIPASS
|
||||
else:
|
||||
# we are running in a normal Python environment
|
||||
bundle_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
return os.path.join(bundle_dir, relative)
|
||||
bundleDir = os.path.dirname(os.path.abspath(__file__))
|
||||
return os.path.join(bundleDir, relative)
|
||||
|
||||
def addIcon(windowOrDialog):
|
||||
icon = QIcon()
|
||||
icon.addFile(resourcePath("ui/images/logo.ico"), QSize(), QIcon.Normal, QIcon.Off)
|
||||
windowOrDialog.setWindowIcon(icon)
|
||||
|
||||
def safe_list_get(l, idx, default):
|
||||
def safeListGet(lst, idx, default):
|
||||
try:
|
||||
return l[idx]
|
||||
return lst[idx]
|
||||
except IndexError:
|
||||
return default
|
||||
|
||||
|
@ -17,14 +17,12 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
from PySide2.QtCore import QSize
|
||||
from PySide2.QtGui import QIcon
|
||||
from PySide2.QtWidgets import QDialog, QHeaderView
|
||||
|
||||
from statapp.calculations import variance_analysis
|
||||
from statapp.calculations import varianceAnalysis
|
||||
from statapp.models.variance_analysis_model import VarianceAnalysisModel
|
||||
from statapp.ui.ui_variance_analysis_window import Ui_VarianceAnalysisWindow
|
||||
from statapp.utils import resource_path
|
||||
from statapp.utils import addIcon
|
||||
|
||||
|
||||
class VarianceAnalysisWindow(QDialog):
|
||||
@ -33,12 +31,10 @@ class VarianceAnalysisWindow(QDialog):
|
||||
self.ui = Ui_VarianceAnalysisWindow()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
res = variance_analysis(data)
|
||||
res = varianceAnalysis(data)
|
||||
self.model = VarianceAnalysisModel(res.round(2))
|
||||
self.ui.tableView.setModel(self.model)
|
||||
header = self.ui.tableView.horizontalHeader()
|
||||
header.setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
|
||||
|
||||
icon = QIcon()
|
||||
icon.addFile(resource_path("ui/images/logo.ico"), QSize(), QIcon.Normal, QIcon.Off)
|
||||
self.setWindowIcon(icon)
|
||||
addIcon(self)
|
||||
|
Loading…
Reference in New Issue
Block a user