mirror of
https://github.com/shizand/statapp.git
synced 2025-10-08 05:03:27 +03:00
Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
78f59a4574 | ||
8ca535cc8f | |||
918cd6fb9b | |||
c23e1f81a9 | |||
|
8ba4c15f08 | ||
db4e791823 | |||
981580f46d | |||
ded55cb5d7 | |||
9766ecb7f5 |
@@ -3,7 +3,7 @@ ignored-modules=PySide2
|
|||||||
extension-pkg-whitelist=PySide2
|
extension-pkg-whitelist=PySide2
|
||||||
|
|
||||||
[MASTER]
|
[MASTER]
|
||||||
init-hook="import sys; sys.path.append('./statapp')"
|
init-hook="import sys; sys.path.append('.')"
|
||||||
ignore-patterns=ui_.+\.py
|
ignore-patterns=ui_.+\.py
|
||||||
|
|
||||||
[BASIC]
|
[BASIC]
|
||||||
|
21
CHANGELOG.md
21
CHANGELOG.md
@@ -1,5 +1,26 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [0.12.1](https://github.com/shizand/statapp/compare/v0.12.0...v0.12.1) (2024-02-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Исправления
|
||||||
|
|
||||||
|
* добавлено отключение "Распределения" при отсутствии отклика ([8ca535c](https://github.com/shizand/statapp/commit/8ca535cc8fb3c97d049afaef30ade033781a6e8e))
|
||||||
|
* исправлены ссылки на некоторую дополнительную литературу ([c23e1f8](https://github.com/shizand/statapp/commit/c23e1f81a9243d81a3e8f00f9f2b2ede941f5691))
|
||||||
|
|
||||||
|
## [0.12.0](https://github.com/shizand/statapp/compare/v0.11.0...v0.12.0) (2024-02-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Новые функции
|
||||||
|
|
||||||
|
* Добавлена дополнительная литература ([#117](https://github.com/shizand/statapp/issues/117)) ([ded55cb](https://github.com/shizand/statapp/commit/ded55cb5d73e5b1d118c8f2ceaaf107a563f0e5e)), closes [#114](https://github.com/shizand/statapp/issues/114)
|
||||||
|
* добавлены "Распределения" ([#116](https://github.com/shizand/statapp/issues/116)) ([981580f](https://github.com/shizand/statapp/commit/981580f46d55b949af440973660a5b9b946827bd)), closes [#111](https://github.com/shizand/statapp/issues/111) [#112](https://github.com/shizand/statapp/issues/112)
|
||||||
|
|
||||||
|
|
||||||
|
### Исправления
|
||||||
|
|
||||||
|
* Дополнил README ([9766ecb](https://github.com/shizand/statapp/commit/9766ecb7f5f4bb4b960ad9519bbe28919ecda41d))
|
||||||
|
|
||||||
## [0.11.0](https://github.com/shizand/statapp/compare/v0.10.2...v0.11.0) (2024-02-03)
|
## [0.11.0](https://github.com/shizand/statapp/compare/v0.10.2...v0.11.0) (2024-02-03)
|
||||||
|
|
||||||
|
|
||||||
|
@@ -42,7 +42,7 @@ pyinstaller statapp.spec # или pyinstaller statapp.spec -- --one-file
|
|||||||
Документация собирается с помощью [grip](https://github.com/joeyespo/grip)
|
Документация собирается с помощью [grip](https://github.com/joeyespo/grip)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
echo "STYLE_URLS = [\"https://cdn.jsdelivr.net/gh/shizand/statapp@main/docs/grip.css\"]" > ~/.grip/settings.py
|
echo "STYLE_URLS = [\"https://cdn.jsdelivr.net/gh/shizand/statapp@main/statapp/docs/grip.css\"]" > ~/.grip/settings.py
|
||||||
cd docs
|
cd docs
|
||||||
grip .
|
grip .
|
||||||
```
|
```
|
||||||
|
@@ -144,7 +144,6 @@ dependencies:
|
|||||||
- pyyaml==6.0.1
|
- pyyaml==6.0.1
|
||||||
- setuptools-scm==8.0.4
|
- setuptools-scm==8.0.4
|
||||||
- six==1.16.0
|
- six==1.16.0
|
||||||
- statapp==0.10.2
|
|
||||||
- sympy==1.12
|
- sympy==1.12
|
||||||
- tomli==2.0.1
|
- tomli==2.0.1
|
||||||
- tomlkit==0.12.1
|
- tomlkit==0.12.1
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
literature/Кадочникова Е. И. Эконометрика. Конспект лекций.pdf
Normal file
BIN
literature/Кадочникова Е. И. Эконометрика. Конспект лекций.pdf
Normal file
Binary file not shown.
BIN
literature/Касьянов В. А. Эконометрика.pdf
Normal file
BIN
literature/Касьянов В. А. Эконометрика.pdf
Normal file
Binary file not shown.
Binary file not shown.
@@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "statapp"
|
name = "statapp"
|
||||||
version = "0.11.0"
|
version = "0.12.1"
|
||||||
description = ""
|
description = ""
|
||||||
authors = [
|
authors = [
|
||||||
"Maxim Slipenko <statapp@maks1ms.addy.io>"
|
"Maxim Slipenko <statapp@maks1ms.addy.io>"
|
||||||
|
105
statapp/distribution_window.py
Normal file
105
statapp/distribution_window.py
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2024 Maxim Slipenko, Eugene Lazurenko.
|
||||||
|
#
|
||||||
|
# This file is part of Statapp
|
||||||
|
# (see https://github.com/shizand/statapp).
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# 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 numpy as np
|
||||||
|
from PySide2.QtWidgets import QDialog, QVBoxLayout, QComboBox
|
||||||
|
|
||||||
|
from statapp.polynoms.polynom_window import MplCanvas
|
||||||
|
from statapp.utils import addIcon
|
||||||
|
from statapp.models.utils import yxHeader
|
||||||
|
|
||||||
|
|
||||||
|
class DistributionWindow(QDialog):
|
||||||
|
def __init__(self, title: str, data: np.ndarray):
|
||||||
|
super().__init__()
|
||||||
|
self.setWindowTitle(title)
|
||||||
|
addIcon(self)
|
||||||
|
|
||||||
|
self.layout = QVBoxLayout()
|
||||||
|
self.setLayout(self.layout)
|
||||||
|
|
||||||
|
self.data = data
|
||||||
|
self.values = yxHeader(data.shape[1])
|
||||||
|
|
||||||
|
self.comboBox = QComboBox()
|
||||||
|
self.comboBox.addItems(self.values)
|
||||||
|
self.comboBox.currentIndexChanged.connect(self.onChange)
|
||||||
|
self.sc = self.getSc(data[:, 0])
|
||||||
|
self.layout.addWidget(self.comboBox)
|
||||||
|
|
||||||
|
self.l = QVBoxLayout()
|
||||||
|
self.l.addWidget(self.sc)
|
||||||
|
self.layout.addLayout(self.l)
|
||||||
|
|
||||||
|
|
||||||
|
def onChange(self):
|
||||||
|
while ((child := self.l.takeAt(0)) is not None):
|
||||||
|
child.widget().deleteLater()
|
||||||
|
self.sc = self.getSc(self.data[:, self.comboBox.currentIndex()])
|
||||||
|
self.l.addWidget(self.sc)
|
||||||
|
|
||||||
|
|
||||||
|
class UniformDistributionWindow(DistributionWindow):
|
||||||
|
def __init__(self, data: np.array):
|
||||||
|
super().__init__("Равномерное распределение", data)
|
||||||
|
|
||||||
|
def getSc(self, points):
|
||||||
|
sc = MplCanvas(self, width=5, height=4, dpi=100)
|
||||||
|
points = np.sort(points)
|
||||||
|
points = np.array(
|
||||||
|
[points[0]] +
|
||||||
|
[pt for pt, next_pt in zip(points[:-1], points[1:]) if pt != next_pt]
|
||||||
|
)
|
||||||
|
differences = np.diff(points)
|
||||||
|
inverseDifferences = 1 / differences
|
||||||
|
for i, (start, end) in enumerate(zip(points[:-1], points[1:])):
|
||||||
|
sc.axes.hlines(inverseDifferences[i], start, end, colors='r', linestyles='solid')
|
||||||
|
return sc
|
||||||
|
|
||||||
|
|
||||||
|
def normalDensity(x, mu, sigmaSquared):
|
||||||
|
return 1 / np.sqrt(2 * np.pi * sigmaSquared) * np.exp(-(x - mu) ** 2 / (2 * sigmaSquared))
|
||||||
|
|
||||||
|
|
||||||
|
class NormalDistributionWindow(DistributionWindow):
|
||||||
|
def __init__(self, data: np.array):
|
||||||
|
super().__init__("Нормальное распределение", data)
|
||||||
|
|
||||||
|
def getSc(self, points):
|
||||||
|
sc = MplCanvas(self, width=5, height=4, dpi=100)
|
||||||
|
points = np.sort(points)
|
||||||
|
mu = np.mean(points)
|
||||||
|
sigmaSquared = np.var(points)
|
||||||
|
yValues = normalDensity(points, mu, sigmaSquared)
|
||||||
|
sc.axes.plot(points, yValues)
|
||||||
|
return sc
|
||||||
|
|
||||||
|
|
||||||
|
class ExponentialDistributionWindow(DistributionWindow):
|
||||||
|
def __init__(self, data: np.array):
|
||||||
|
super().__init__("Экспоненциальное распределение", data)
|
||||||
|
|
||||||
|
def getSc(self, points):
|
||||||
|
sc = MplCanvas(self, width=5, height=4, dpi=100)
|
||||||
|
points = np.sort(points)
|
||||||
|
mu = np.mean(points)
|
||||||
|
lambdaParam = 1 / mu
|
||||||
|
yValues = lambdaParam * np.exp(-lambdaParam * points)
|
||||||
|
sc.axes.plot(points, yValues)
|
||||||
|
return sc
|
File diff suppressed because one or more lines are too long
@@ -28,10 +28,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
***Параметр*** - так отображаются параметры, которые пользователь может получить в результате вычислений в приложении.
|
***Параметр*** - так отображаются параметры, которые пользователь может получить в результате вычислений в приложении.
|
||||||
|
|
||||||
## Введение
|
## Введение
|
||||||
|
|
||||||
"Statapp" — это программное решение для статистического анализа и регрессионного моделирования, позволяющее специалистам в области данных проводить глубокий анализ и создавать точные прогностические модели.
|
"Statapp" — это программное решение для статистического анализа и регрессионного моделирования, позволяющее специалистам в области данных проводить глубокий анализ и создавать точные прогностические модели.
|
||||||
|
|
||||||
## Теоретические сведения
|
## Дополнительная литература
|
||||||
|
|
||||||
|
- [Гмурман В. Е. Теория вероятностей и математическая статистика. Учеб. пособие для вузов.pdf](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/%D0%93%D0%BC%D1%83%D1%80%D0%BC%D0%B0%D0%BD%20%D0%92.%20%D0%95.%20%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F%20%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9%20%D0%B8%20%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0.%20%D0%A3%D1%87%D0%B5%D0%B1.%20%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%B8%D0%B5%20%D0%B4%D0%BB%D1%8F%20%D0%B2%D1%83%D0%B7%D0%BE%D0%B2.pdf)
|
||||||
|
- [Гмурман В.Е. Руководство к решению задач по теории вероятностей и математической статистике](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/%D0%93%D0%BC%D1%83%D1%80%D0%BC%D0%B0%D0%BD%20%D0%92.%D0%95.%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%BA%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%20%D0%BF%D0%BE%20%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8%20%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9%20%D0%B8%20%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9%20%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B5.pdf)
|
||||||
|
- [Горяинов В. Т., Журавлев А. Г., Тихонов В. И. Статистическая радиотехника: Примеры и задачи](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/%D0%93%D0%BE%D1%80%D1%8F%D0%B8%D0%BD%D0%BE%D0%B2%20%D0%92.%20%D0%A2.%2C%20%D0%96%D1%83%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%B2%20%D0%90.%20%D0%93.%2C%20%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%20%D0%92.%20%D0%98.%20%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%80%D0%B0%D0%B4%D0%B8%D0%BE%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%B8%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8.pdf)
|
||||||
|
- [Григорьев-Голубев, В. В. Теория вероятностей и математическая статистика. Руководство по решению задач](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/%D0%93%D1%80%D0%B8%D0%B3%D0%BE%D1%80%D1%8C%D0%B5%D0%B2-%D0%93%D0%BE%D0%BB%D1%83%D0%B1%D0%B5%D0%B2%2C%20%D0%92.%20%D0%92.%20%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F%20%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9%20%D0%B8%20%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0.%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%BF%D0%BE%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87.pdf)
|
||||||
|
- [Кадочникова Е. И. Эконометрика. Конспект лекций](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/%D0%9A%D0%B0%D0%B4%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%20%D0%95.%20%D0%98.%20%D0%AD%D0%BA%D0%BE%D0%BD%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%BA%D0%B0.%20%D0%9A%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82%20%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D0%B9.pdf)
|
||||||
|
- [Касьянов В. А. Эконометрика](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/%D0%9A%D0%B0%D1%81%D1%8C%D1%8F%D0%BD%D0%BE%D0%B2%20%D0%92.%20%D0%90.%20%D0%AD%D0%BA%D0%BE%D0%BD%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%BA%D0%B0.pdf)
|
||||||
|
- [Садовникова Н.А., Шмойлова Р.А. Анализ временных рядов и прогнозирование. Вып. 3](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/%D0%A1%D0%B0%D0%B4%D0%BE%D0%B2%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%20%D0%9D.%D0%90.%2C%20%D0%A8%D0%BC%D0%BE%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0%20%D0%A0.%D0%90.%20%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%20%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D1%80%D1%8F%D0%B4%D0%BE%D0%B2%20%D0%B8%20%D0%BF%D1%80%D0%BE%D0%B3%D0%BD%D0%BE%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5.%20%D0%92%D1%8B%D0%BF.%203.pdf)
|
||||||
|
|
||||||
|
## Краткие теоретические сведения
|
||||||
|
|
||||||
*-- В разработке --*
|
*-- В разработке --*
|
||||||
|
|
||||||
@@ -43,7 +52,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
### Генерация отклика
|
### Генерация отклика
|
||||||
|
|
||||||
Перед тем как начать анализ, необходимо сгенерировать отклики, которые будут использоваться как зависимые переменные в моделях:
|
Перед тем как начать анализ, необходимо сгенерировать ***отклики***, которые будут использоваться как зависимые переменные в моделях:
|
||||||
|
|
||||||
1. Перейдите в меню `Генерация показателей`.
|
1. Перейдите в меню `Генерация показателей`.
|
||||||
2. Выберите `Генерация отклика`.
|
2. Выберите `Генерация отклика`.
|
||||||
@@ -66,7 +75,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
### Генерация фактора
|
### Генерация фактора
|
||||||
|
|
||||||
После генерации откликов следует сгенерировать факторы, которые будут служить независимыми переменными. Для генерации факторов необходимо выполнить следующие шаги:
|
После генерации ***откликов*** следует сгенерировать ***факторы***, которые будут служить независимыми переменными. Для генерации ***факторов*** необходимо выполнить следующие шаги:
|
||||||
|
|
||||||
1. Перейдите в меню `Генерация показателей`.
|
1. Перейдите в меню `Генерация показателей`.
|
||||||
2. Выберите `Генерация фактора`.
|
2. Выберите `Генерация фактора`.
|
||||||
@@ -77,7 +86,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
*Пример пункта меню* `Генерация фактора`
|
*Пример пункта меню* `Генерация фактора`
|
||||||
|
|
||||||
3. Выберите нужный тип связи к отклику (прямая или обратная).
|
3. Выберите нужный тип связи к ***отклику*** (прямая или обратная).
|
||||||
4. Укажите оставшиеся параметры для генерации данных и нажмите кнопку `Сгенерировать`.
|
4. Укажите оставшиеся параметры для генерации данных и нажмите кнопку `Сгенерировать`.
|
||||||
|
|
||||||
<image src="files/Окно - Генерация фактора.PNG" width=400>
|
<image src="files/Окно - Генерация фактора.PNG" width=400>
|
||||||
@@ -88,9 +97,26 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
|
### Удаление факторов
|
||||||
|
|
||||||
|
Так как программа `Statapp` генерирует показатели ***Факторов*** случайным образом в границах заданого ***Среднеквадратического отклонения*** то при генерации нескольких ***Факторов*** может возникнуть необходимость удаления некоторых из них. Для этого необходимо выполнить следующие шаги:
|
||||||
|
|
||||||
|
1. Выберите необходимый ***Фактор*** для удаления и кликните по `Заголовку` с обозначением `Xn` правой кнопкой мыши.
|
||||||
|
2. Нажмите на появившуюся кнопку `Удалить` для удаления выбранного ***Фактора***.
|
||||||
|
|
||||||
|
*Внимание после удаления ***Фактора*** действие уже нельзя будет отменить*
|
||||||
|
|
||||||
|
<image src="files/Окно - Удаление.PNG">
|
||||||
|
|
||||||
|
*Пример появившейся кнопки* `Удалить`
|
||||||
|
|
||||||
|
Удаленный ***Фактор*** пропадет из таблицы и более не будет учитываться в `Анализе` и `Моделировании`.
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
### Анализ данных
|
### Анализ данных
|
||||||
|
|
||||||
После генерации отклика и факторов можно приступать к анализу данных.
|
После генерации ***отклика*** и ***факторов*** можно приступать к анализу данных.
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
@@ -181,7 +207,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
### Сохранение и открытие файла
|
### Сохранение и открытие файла
|
||||||
|
|
||||||
Сгенерированные значения ***Отклика*** и ***Фактора*** из таблицы в `Главном окне` можно сохранить или зугрузить из файла ***.txt*** и ***.csv***.
|
Сгенерированные значения ***отклика*** и ***фактора*** из таблицы в `Главном окне` можно сохранить или зугрузить из файла ***.txt*** и ***.csv***.
|
||||||
|
|
||||||
### Сохранение файла
|
### Сохранение файла
|
||||||
|
|
||||||
|
Binary file not shown.
BIN
statapp/docs/files/Окно - Удаление.PNG
Normal file
BIN
statapp/docs/files/Окно - Удаление.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
@@ -24,6 +24,8 @@ from PySide2.QtWidgets import QMainWindow, QMessageBox, QAction, QMenu
|
|||||||
|
|
||||||
from statapp.calculations import generateXValues, generateYValues
|
from statapp.calculations import generateXValues, generateYValues
|
||||||
from statapp.constants import NUMBERS_PRECISION
|
from statapp.constants import NUMBERS_PRECISION
|
||||||
|
from statapp.distribution_window import NormalDistributionWindow, UniformDistributionWindow, \
|
||||||
|
ExponentialDistributionWindow
|
||||||
from statapp.generate_factor_window import GenerateFactorWindow
|
from statapp.generate_factor_window import GenerateFactorWindow
|
||||||
from statapp.polynoms.linear_polynom_window import LinearPolynomWindow
|
from statapp.polynoms.linear_polynom_window import LinearPolynomWindow
|
||||||
from statapp.mathtex_header_view import MathTexHeaderView
|
from statapp.mathtex_header_view import MathTexHeaderView
|
||||||
@@ -49,10 +51,6 @@ class MainWindow(QMainWindow):
|
|||||||
|
|
||||||
addIcon(self)
|
addIcon(self)
|
||||||
|
|
||||||
self.ui.generateXaction.setEnabled(False)
|
|
||||||
self.ui.varianceAnalysisAction.setEnabled(False)
|
|
||||||
self.ui.correlationAnalisisAction.setEnabled(False)
|
|
||||||
|
|
||||||
self.mainActions = [
|
self.mainActions = [
|
||||||
self.ui.varianceAnalysisAction,
|
self.ui.varianceAnalysisAction,
|
||||||
self.ui.correlationAnalisisAction,
|
self.ui.correlationAnalisisAction,
|
||||||
@@ -110,13 +108,22 @@ class MainWindow(QMainWindow):
|
|||||||
# есть только отклик
|
# есть только отклик
|
||||||
if data.shape[1] == 1:
|
if data.shape[1] == 1:
|
||||||
self.ui.generateXaction.setEnabled(True)
|
self.ui.generateXaction.setEnabled(True)
|
||||||
|
self.ui.uniformDistributionAction.setEnabled(True)
|
||||||
|
self.ui.normalDistributionAction.setEnabled(True)
|
||||||
|
self.ui.exponentialDistributionAction.setEnabled(True)
|
||||||
self.setEnabledMainActions(False)
|
self.setEnabledMainActions(False)
|
||||||
# есть отклик и фактор(ы)
|
# есть отклик и фактор(ы)
|
||||||
elif data.shape[1] > 1:
|
elif data.shape[1] > 1:
|
||||||
self.ui.generateXaction.setEnabled(True)
|
self.ui.generateXaction.setEnabled(True)
|
||||||
|
self.ui.uniformDistributionAction.setEnabled(True)
|
||||||
|
self.ui.normalDistributionAction.setEnabled(True)
|
||||||
|
self.ui.exponentialDistributionAction.setEnabled(True)
|
||||||
self.setEnabledMainActions(True)
|
self.setEnabledMainActions(True)
|
||||||
else:
|
else:
|
||||||
self.ui.generateXaction.setEnabled(False)
|
self.ui.generateXaction.setEnabled(False)
|
||||||
|
self.ui.uniformDistributionAction.setEnabled(False)
|
||||||
|
self.ui.normalDistributionAction.setEnabled(False)
|
||||||
|
self.ui.exponentialDistributionAction.setEnabled(False)
|
||||||
self.setEnabledMainActions(False)
|
self.setEnabledMainActions(False)
|
||||||
|
|
||||||
|
|
||||||
@@ -257,6 +264,30 @@ class MainWindow(QMainWindow):
|
|||||||
except Exception as error:
|
except Exception as error:
|
||||||
onError(error)
|
onError(error)
|
||||||
|
|
||||||
|
@Slot()
|
||||||
|
def on_uniformDistributionAction_triggered(self):
|
||||||
|
try:
|
||||||
|
dw = UniformDistributionWindow(self.model.getData())
|
||||||
|
dw.exec()
|
||||||
|
except Exception as error:
|
||||||
|
onError(error)
|
||||||
|
|
||||||
|
@Slot()
|
||||||
|
def on_normalDistributionAction_triggered(self):
|
||||||
|
try:
|
||||||
|
dw = NormalDistributionWindow(self.model.getData())
|
||||||
|
dw.exec()
|
||||||
|
except Exception as error:
|
||||||
|
onError(error)
|
||||||
|
|
||||||
|
@Slot()
|
||||||
|
def on_exponentialDistributionAction_triggered(self):
|
||||||
|
try:
|
||||||
|
dw = ExponentialDistributionWindow(self.model.getData())
|
||||||
|
dw.exec()
|
||||||
|
except Exception as error:
|
||||||
|
onError(error)
|
||||||
|
|
||||||
def closeEvent(self, event):
|
def closeEvent(self, event):
|
||||||
if self.isDataChanged:
|
if self.isDataChanged:
|
||||||
file = ''
|
file = ''
|
||||||
|
@@ -74,10 +74,6 @@ class PolynomWindow(QDialog):
|
|||||||
realY = predictionResult[:, 0]
|
realY = predictionResult[:, 0]
|
||||||
calculatedY = predictionResult[:, 1]
|
calculatedY = predictionResult[:, 1]
|
||||||
|
|
||||||
print(xAxes)
|
|
||||||
print(realY)
|
|
||||||
print(calculatedY)
|
|
||||||
|
|
||||||
sc.axes.scatter(xAxes, realY)
|
sc.axes.scatter(xAxes, realY)
|
||||||
|
|
||||||
# xnew = np.linspace(xAxes.min(), xAxes.max(), 300)
|
# xnew = np.linspace(xAxes.min(), xAxes.max(), 300)
|
||||||
|
@@ -87,7 +87,6 @@ class TransformPolynomWindow(QDialog):
|
|||||||
|
|
||||||
def on_data_changed(self):
|
def on_data_changed(self):
|
||||||
data = np.copy(self.data)
|
data = np.copy(self.data)
|
||||||
print(len(data[0:]))
|
|
||||||
for i in range(len(data[0:])):
|
for i in range(len(data[0:])):
|
||||||
for j in range(1, len(data[i])):
|
for j in range(1, len(data[i])):
|
||||||
tr = self.model.data(self.model.createIndex(j, 0), Qt.DisplayRole)
|
tr = self.model.data(self.model.createIndex(j, 0), Qt.DisplayRole)
|
||||||
|
@@ -101,15 +101,6 @@
|
|||||||
<pointsize>12</pointsize>
|
<pointsize>12</pointsize>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="editable">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="currentText">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="placeholderText">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
@@ -40,7 +40,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>800</width>
|
<width>800</width>
|
||||||
<height>22</height>
|
<height>29</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="filemenu">
|
<widget class="QMenu" name="filemenu">
|
||||||
@@ -80,10 +80,19 @@
|
|||||||
<addaction name="usageaction"/>
|
<addaction name="usageaction"/>
|
||||||
<addaction name="aboutmenuaction"/>
|
<addaction name="aboutmenuaction"/>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QMenu" name="menu">
|
||||||
|
<property name="title">
|
||||||
|
<string>Распределения</string>
|
||||||
|
</property>
|
||||||
|
<addaction name="uniformDistributionAction"/>
|
||||||
|
<addaction name="normalDistributionAction"/>
|
||||||
|
<addaction name="exponentialDistributionAction"/>
|
||||||
|
</widget>
|
||||||
<addaction name="filemenu"/>
|
<addaction name="filemenu"/>
|
||||||
<addaction name="generatemenu"/>
|
<addaction name="generatemenu"/>
|
||||||
<addaction name="analyzemenu"/>
|
<addaction name="analyzemenu"/>
|
||||||
<addaction name="modelmenu"/>
|
<addaction name="modelmenu"/>
|
||||||
|
<addaction name="menu"/>
|
||||||
<addaction name="helpmenu"/>
|
<addaction name="helpmenu"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QStatusBar" name="statusbar"/>
|
<widget class="QStatusBar" name="statusbar"/>
|
||||||
@@ -147,6 +156,21 @@
|
|||||||
<string>Использование</string>
|
<string>Использование</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="uniformDistributionAction">
|
||||||
|
<property name="text">
|
||||||
|
<string>Равномерное</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="normalDistributionAction">
|
||||||
|
<property name="text">
|
||||||
|
<string>Нормальное</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="exponentialDistributionAction">
|
||||||
|
<property name="text">
|
||||||
|
<string>Экспоненциальное</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
|
106
statapp/ui/ui_generate_factor_window.py
generated
106
statapp/ui/ui_generate_factor_window.py
generated
@@ -1,4 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
#
|
#
|
||||||
# Copyright (c) 2024 Maxim Slipenko, Eugene Lazurenko.
|
# Copyright (c) 2024 Maxim Slipenko, Eugene Lazurenko.
|
||||||
#
|
#
|
||||||
@@ -19,93 +20,70 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
from PySide2 import QtCore, QtGui, QtWidgets
|
||||||
################################################################################
|
|
||||||
## Form generated from reading UI file 'generate_factor_window.ui'
|
|
||||||
##
|
|
||||||
## Created by: Qt User Interface Compiler version 5.15.2
|
|
||||||
##
|
|
||||||
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
from PySide2.QtCore import *
|
|
||||||
from PySide2.QtGui import *
|
|
||||||
from PySide2.QtWidgets import *
|
|
||||||
|
|
||||||
|
|
||||||
class Ui_GenerateFactorWindow(object):
|
class Ui_GenerateFactorWindow(object):
|
||||||
def setupUi(self, GenerateFactorWindow):
|
def setupUi(self, GenerateFactorWindow):
|
||||||
if not GenerateFactorWindow.objectName():
|
GenerateFactorWindow.setObjectName("GenerateFactorWindow")
|
||||||
GenerateFactorWindow.setObjectName(u"GenerateFactorWindow")
|
|
||||||
GenerateFactorWindow.resize(503, 193)
|
GenerateFactorWindow.resize(503, 193)
|
||||||
self.gridLayout_2 = QGridLayout(GenerateFactorWindow)
|
self.gridLayout_2 = QtWidgets.QGridLayout(GenerateFactorWindow)
|
||||||
self.gridLayout_2.setObjectName(u"gridLayout_2")
|
self.gridLayout_2.setObjectName("gridLayout_2")
|
||||||
self.gridLayout = QGridLayout()
|
self.gridLayout = QtWidgets.QGridLayout()
|
||||||
self.gridLayout.setObjectName(u"gridLayout")
|
self.gridLayout.setObjectName("gridLayout")
|
||||||
self.label = QLabel(GenerateFactorWindow)
|
self.label = QtWidgets.QLabel(GenerateFactorWindow)
|
||||||
self.label.setObjectName(u"label")
|
font = QtGui.QFont()
|
||||||
font = QFont()
|
|
||||||
font.setPointSize(12)
|
font.setPointSize(12)
|
||||||
self.label.setFont(font)
|
self.label.setFont(font)
|
||||||
|
self.label.setObjectName("label")
|
||||||
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
|
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
|
||||||
|
self.label_3 = QtWidgets.QLabel(GenerateFactorWindow)
|
||||||
self.label_3 = QLabel(GenerateFactorWindow)
|
font = QtGui.QFont()
|
||||||
self.label_3.setObjectName(u"label_3")
|
font.setPointSize(12)
|
||||||
self.label_3.setFont(font)
|
self.label_3.setFont(font)
|
||||||
|
self.label_3.setObjectName("label_3")
|
||||||
self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
|
self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
|
||||||
|
self.generatePushButton = QtWidgets.QPushButton(GenerateFactorWindow)
|
||||||
self.generatePushButton = QPushButton(GenerateFactorWindow)
|
font = QtGui.QFont()
|
||||||
self.generatePushButton.setObjectName(u"generatePushButton")
|
font.setPointSize(12)
|
||||||
self.generatePushButton.setFont(font)
|
self.generatePushButton.setFont(font)
|
||||||
|
self.generatePushButton.setObjectName("generatePushButton")
|
||||||
self.gridLayout.addWidget(self.generatePushButton, 3, 0, 1, 2)
|
self.gridLayout.addWidget(self.generatePushButton, 3, 0, 1, 2)
|
||||||
|
self.label_2 = QtWidgets.QLabel(GenerateFactorWindow)
|
||||||
self.label_2 = QLabel(GenerateFactorWindow)
|
font = QtGui.QFont()
|
||||||
self.label_2.setObjectName(u"label_2")
|
font.setPointSize(12)
|
||||||
self.label_2.setFont(font)
|
self.label_2.setFont(font)
|
||||||
|
self.label_2.setObjectName("label_2")
|
||||||
self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
|
self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
|
||||||
|
self.matSpinBox = QtWidgets.QDoubleSpinBox(GenerateFactorWindow)
|
||||||
self.matSpinBox = QDoubleSpinBox(GenerateFactorWindow)
|
font = QtGui.QFont()
|
||||||
self.matSpinBox.setObjectName(u"matSpinBox")
|
font.setPointSize(12)
|
||||||
self.matSpinBox.setFont(font)
|
self.matSpinBox.setFont(font)
|
||||||
self.matSpinBox.setDecimals(5)
|
self.matSpinBox.setDecimals(5)
|
||||||
self.matSpinBox.setMaximum(1000000.000000000000000)
|
self.matSpinBox.setMaximum(1000000.0)
|
||||||
|
self.matSpinBox.setObjectName("matSpinBox")
|
||||||
self.gridLayout.addWidget(self.matSpinBox, 1, 1, 1, 1)
|
self.gridLayout.addWidget(self.matSpinBox, 1, 1, 1, 1)
|
||||||
|
self.deviationSpinBox = QtWidgets.QDoubleSpinBox(GenerateFactorWindow)
|
||||||
self.deviationSpinBox = QDoubleSpinBox(GenerateFactorWindow)
|
font = QtGui.QFont()
|
||||||
self.deviationSpinBox.setObjectName(u"deviationSpinBox")
|
font.setPointSize(12)
|
||||||
self.deviationSpinBox.setFont(font)
|
self.deviationSpinBox.setFont(font)
|
||||||
self.deviationSpinBox.setDecimals(5)
|
self.deviationSpinBox.setDecimals(5)
|
||||||
self.deviationSpinBox.setMaximum(1000000.000000000000000)
|
self.deviationSpinBox.setMaximum(1000000.0)
|
||||||
|
self.deviationSpinBox.setObjectName("deviationSpinBox")
|
||||||
self.gridLayout.addWidget(self.deviationSpinBox, 2, 1, 1, 1)
|
self.gridLayout.addWidget(self.deviationSpinBox, 2, 1, 1, 1)
|
||||||
|
self.typeComboBox = QtWidgets.QComboBox(GenerateFactorWindow)
|
||||||
self.typeComboBox = QComboBox(GenerateFactorWindow)
|
font = QtGui.QFont()
|
||||||
self.typeComboBox.setObjectName(u"typeComboBox")
|
font.setPointSize(12)
|
||||||
self.typeComboBox.setFont(font)
|
self.typeComboBox.setFont(font)
|
||||||
self.typeComboBox.setEditable(False)
|
self.typeComboBox.setObjectName("typeComboBox")
|
||||||
|
|
||||||
self.gridLayout.addWidget(self.typeComboBox, 0, 1, 1, 1)
|
self.gridLayout.addWidget(self.typeComboBox, 0, 1, 1, 1)
|
||||||
|
|
||||||
|
|
||||||
self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
|
self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
|
||||||
|
|
||||||
|
|
||||||
self.retranslateUi(GenerateFactorWindow)
|
self.retranslateUi(GenerateFactorWindow)
|
||||||
|
QtCore.QMetaObject.connectSlotsByName(GenerateFactorWindow)
|
||||||
QMetaObject.connectSlotsByName(GenerateFactorWindow)
|
|
||||||
# setupUi
|
|
||||||
|
|
||||||
def retranslateUi(self, GenerateFactorWindow):
|
def retranslateUi(self, GenerateFactorWindow):
|
||||||
GenerateFactorWindow.setWindowTitle(QCoreApplication.translate("GenerateFactorWindow", u"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432", None))
|
GenerateFactorWindow.setWindowTitle(QtWidgets.QApplication.translate("GenerateFactorWindow", "Генерация факторов", None, -1))
|
||||||
self.label.setText(QCoreApplication.translate("GenerateFactorWindow", u"\u0422\u0438\u043f \u0441\u0432\u044f\u0437\u0438", None))
|
self.label.setText(QtWidgets.QApplication.translate("GenerateFactorWindow", "Тип связи", None, -1))
|
||||||
self.label_3.setText(QCoreApplication.translate("GenerateFactorWindow", u"\u0421\u0440\u0435\u0434\u043d\u0435\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435", None))
|
self.label_3.setText(QtWidgets.QApplication.translate("GenerateFactorWindow", "Среднеквадратичное отклонение", None, -1))
|
||||||
self.generatePushButton.setText(QCoreApplication.translate("GenerateFactorWindow", u"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c", None))
|
self.generatePushButton.setText(QtWidgets.QApplication.translate("GenerateFactorWindow", "Сгенерировать", None, -1))
|
||||||
self.label_2.setText(QCoreApplication.translate("GenerateFactorWindow", u"\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435", None))
|
self.label_2.setText(QtWidgets.QApplication.translate("GenerateFactorWindow", "Математическое ожидание", None, -1))
|
||||||
self.typeComboBox.setCurrentText("")
|
|
||||||
self.typeComboBox.setPlaceholderText("")
|
|
||||||
# retranslateUi
|
|
||||||
|
188
statapp/ui/ui_main_window.py
generated
188
statapp/ui/ui_main_window.py
generated
@@ -1,4 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
#
|
#
|
||||||
# Copyright (c) 2024 Maxim Slipenko, Eugene Lazurenko.
|
# Copyright (c) 2024 Maxim Slipenko, Eugene Lazurenko.
|
||||||
#
|
#
|
||||||
@@ -19,89 +20,74 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
from PySide2 import QtCore, QtGui, QtWidgets
|
||||||
################################################################################
|
|
||||||
## Form generated from reading UI file 'main_window.ui'
|
|
||||||
##
|
|
||||||
## Created by: Qt User Interface Compiler version 5.15.2
|
|
||||||
##
|
|
||||||
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
from PySide2.QtCore import *
|
|
||||||
from PySide2.QtGui import *
|
|
||||||
from PySide2.QtWidgets import *
|
|
||||||
|
|
||||||
|
|
||||||
class Ui_MainWindow(object):
|
class Ui_MainWindow(object):
|
||||||
def setupUi(self, MainWindow):
|
def setupUi(self, MainWindow):
|
||||||
if not MainWindow.objectName():
|
MainWindow.setObjectName("MainWindow")
|
||||||
MainWindow.setObjectName(u"MainWindow")
|
|
||||||
MainWindow.resize(800, 600)
|
MainWindow.resize(800, 600)
|
||||||
self.aboutmenuaction = QAction(MainWindow)
|
self.centralwidget = QtWidgets.QWidget(MainWindow)
|
||||||
self.aboutmenuaction.setObjectName(u"aboutmenuaction")
|
self.centralwidget.setObjectName("centralwidget")
|
||||||
self.generateYaction = QAction(MainWindow)
|
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
|
||||||
self.generateYaction.setObjectName(u"generateYaction")
|
self.gridLayout.setObjectName("gridLayout")
|
||||||
self.generateXaction = QAction(MainWindow)
|
self.label = QtWidgets.QLabel(self.centralwidget)
|
||||||
self.generateXaction.setObjectName(u"generateXaction")
|
self.label.setAlignment(QtCore.Qt.AlignCenter)
|
||||||
self.openfileaction = QAction(MainWindow)
|
self.label.setObjectName("label")
|
||||||
self.openfileaction.setObjectName(u"openfileaction")
|
|
||||||
self.savefileaction = QAction(MainWindow)
|
|
||||||
self.savefileaction.setObjectName(u"savefileaction")
|
|
||||||
self.closefileaction = QAction(MainWindow)
|
|
||||||
self.closefileaction.setObjectName(u"closefileaction")
|
|
||||||
self.varianceAnalysisAction = QAction(MainWindow)
|
|
||||||
self.varianceAnalysisAction.setObjectName(u"varianceAnalysisAction")
|
|
||||||
self.correlationAnalisisAction = QAction(MainWindow)
|
|
||||||
self.correlationAnalisisAction.setObjectName(u"correlationAnalisisAction")
|
|
||||||
self.linearPolynomAction = QAction(MainWindow)
|
|
||||||
self.linearPolynomAction.setObjectName(u"linearPolynomAction")
|
|
||||||
self.squaredPolynomAction = QAction(MainWindow)
|
|
||||||
self.squaredPolynomAction.setObjectName(u"squaredPolynomAction")
|
|
||||||
self.transformPolynomAction = QAction(MainWindow)
|
|
||||||
self.transformPolynomAction.setObjectName(u"transformPolynomAction")
|
|
||||||
self.usageaction = QAction(MainWindow)
|
|
||||||
self.usageaction.setObjectName(u"usageaction")
|
|
||||||
self.centralwidget = QWidget(MainWindow)
|
|
||||||
self.centralwidget.setObjectName(u"centralwidget")
|
|
||||||
self.gridLayout = QGridLayout(self.centralwidget)
|
|
||||||
self.gridLayout.setObjectName(u"gridLayout")
|
|
||||||
self.label = QLabel(self.centralwidget)
|
|
||||||
self.label.setObjectName(u"label")
|
|
||||||
self.label.setAlignment(Qt.AlignCenter)
|
|
||||||
|
|
||||||
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
|
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
|
||||||
|
self.tableView = QtWidgets.QTableView(self.centralwidget)
|
||||||
self.tableView = QTableView(self.centralwidget)
|
self.tableView.setObjectName("tableView")
|
||||||
self.tableView.setObjectName(u"tableView")
|
|
||||||
self.tableView.verticalHeader().setVisible(False)
|
self.tableView.verticalHeader().setVisible(False)
|
||||||
|
|
||||||
self.gridLayout.addWidget(self.tableView, 1, 0, 1, 1)
|
self.gridLayout.addWidget(self.tableView, 1, 0, 1, 1)
|
||||||
|
|
||||||
MainWindow.setCentralWidget(self.centralwidget)
|
MainWindow.setCentralWidget(self.centralwidget)
|
||||||
self.menubar = QMenuBar(MainWindow)
|
self.menubar = QtWidgets.QMenuBar(MainWindow)
|
||||||
self.menubar.setObjectName(u"menubar")
|
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 29))
|
||||||
self.menubar.setGeometry(QRect(0, 0, 800, 22))
|
self.menubar.setObjectName("menubar")
|
||||||
self.filemenu = QMenu(self.menubar)
|
self.filemenu = QtWidgets.QMenu(self.menubar)
|
||||||
self.filemenu.setObjectName(u"filemenu")
|
self.filemenu.setObjectName("filemenu")
|
||||||
self.generatemenu = QMenu(self.menubar)
|
self.generatemenu = QtWidgets.QMenu(self.menubar)
|
||||||
self.generatemenu.setObjectName(u"generatemenu")
|
self.generatemenu.setObjectName("generatemenu")
|
||||||
self.analyzemenu = QMenu(self.menubar)
|
self.analyzemenu = QtWidgets.QMenu(self.menubar)
|
||||||
self.analyzemenu.setObjectName(u"analyzemenu")
|
self.analyzemenu.setObjectName("analyzemenu")
|
||||||
self.modelmenu = QMenu(self.menubar)
|
self.modelmenu = QtWidgets.QMenu(self.menubar)
|
||||||
self.modelmenu.setObjectName(u"modelmenu")
|
self.modelmenu.setObjectName("modelmenu")
|
||||||
self.helpmenu = QMenu(self.menubar)
|
self.helpmenu = QtWidgets.QMenu(self.menubar)
|
||||||
self.helpmenu.setObjectName(u"helpmenu")
|
self.helpmenu.setObjectName("helpmenu")
|
||||||
|
self.menu = QtWidgets.QMenu(self.menubar)
|
||||||
|
self.menu.setObjectName("menu")
|
||||||
MainWindow.setMenuBar(self.menubar)
|
MainWindow.setMenuBar(self.menubar)
|
||||||
self.statusbar = QStatusBar(MainWindow)
|
self.statusbar = QtWidgets.QStatusBar(MainWindow)
|
||||||
self.statusbar.setObjectName(u"statusbar")
|
self.statusbar.setObjectName("statusbar")
|
||||||
MainWindow.setStatusBar(self.statusbar)
|
MainWindow.setStatusBar(self.statusbar)
|
||||||
|
self.aboutmenuaction = QtWidgets.QAction(MainWindow)
|
||||||
self.menubar.addAction(self.filemenu.menuAction())
|
self.aboutmenuaction.setObjectName("aboutmenuaction")
|
||||||
self.menubar.addAction(self.generatemenu.menuAction())
|
self.generateYaction = QtWidgets.QAction(MainWindow)
|
||||||
self.menubar.addAction(self.analyzemenu.menuAction())
|
self.generateYaction.setObjectName("generateYaction")
|
||||||
self.menubar.addAction(self.modelmenu.menuAction())
|
self.generateXaction = QtWidgets.QAction(MainWindow)
|
||||||
self.menubar.addAction(self.helpmenu.menuAction())
|
self.generateXaction.setObjectName("generateXaction")
|
||||||
|
self.openfileaction = QtWidgets.QAction(MainWindow)
|
||||||
|
self.openfileaction.setObjectName("openfileaction")
|
||||||
|
self.savefileaction = QtWidgets.QAction(MainWindow)
|
||||||
|
self.savefileaction.setObjectName("savefileaction")
|
||||||
|
self.closefileaction = QtWidgets.QAction(MainWindow)
|
||||||
|
self.closefileaction.setObjectName("closefileaction")
|
||||||
|
self.varianceAnalysisAction = QtWidgets.QAction(MainWindow)
|
||||||
|
self.varianceAnalysisAction.setObjectName("varianceAnalysisAction")
|
||||||
|
self.correlationAnalisisAction = QtWidgets.QAction(MainWindow)
|
||||||
|
self.correlationAnalisisAction.setObjectName("correlationAnalisisAction")
|
||||||
|
self.linearPolynomAction = QtWidgets.QAction(MainWindow)
|
||||||
|
self.linearPolynomAction.setObjectName("linearPolynomAction")
|
||||||
|
self.squaredPolynomAction = QtWidgets.QAction(MainWindow)
|
||||||
|
self.squaredPolynomAction.setObjectName("squaredPolynomAction")
|
||||||
|
self.transformPolynomAction = QtWidgets.QAction(MainWindow)
|
||||||
|
self.transformPolynomAction.setObjectName("transformPolynomAction")
|
||||||
|
self.usageaction = QtWidgets.QAction(MainWindow)
|
||||||
|
self.usageaction.setObjectName("usageaction")
|
||||||
|
self.uniformDistributionAction = QtWidgets.QAction(MainWindow)
|
||||||
|
self.uniformDistributionAction.setObjectName("uniformDistributionAction")
|
||||||
|
self.normalDistributionAction = QtWidgets.QAction(MainWindow)
|
||||||
|
self.normalDistributionAction.setObjectName("normalDistributionAction")
|
||||||
|
self.exponentialDistributionAction = QtWidgets.QAction(MainWindow)
|
||||||
|
self.exponentialDistributionAction.setObjectName("exponentialDistributionAction")
|
||||||
self.filemenu.addAction(self.openfileaction)
|
self.filemenu.addAction(self.openfileaction)
|
||||||
self.filemenu.addAction(self.savefileaction)
|
self.filemenu.addAction(self.savefileaction)
|
||||||
self.filemenu.addAction(self.closefileaction)
|
self.filemenu.addAction(self.closefileaction)
|
||||||
@@ -114,30 +100,40 @@ class Ui_MainWindow(object):
|
|||||||
self.modelmenu.addAction(self.transformPolynomAction)
|
self.modelmenu.addAction(self.transformPolynomAction)
|
||||||
self.helpmenu.addAction(self.usageaction)
|
self.helpmenu.addAction(self.usageaction)
|
||||||
self.helpmenu.addAction(self.aboutmenuaction)
|
self.helpmenu.addAction(self.aboutmenuaction)
|
||||||
|
self.menu.addAction(self.uniformDistributionAction)
|
||||||
|
self.menu.addAction(self.normalDistributionAction)
|
||||||
|
self.menu.addAction(self.exponentialDistributionAction)
|
||||||
|
self.menubar.addAction(self.filemenu.menuAction())
|
||||||
|
self.menubar.addAction(self.generatemenu.menuAction())
|
||||||
|
self.menubar.addAction(self.analyzemenu.menuAction())
|
||||||
|
self.menubar.addAction(self.modelmenu.menuAction())
|
||||||
|
self.menubar.addAction(self.menu.menuAction())
|
||||||
|
self.menubar.addAction(self.helpmenu.menuAction())
|
||||||
|
|
||||||
self.retranslateUi(MainWindow)
|
self.retranslateUi(MainWindow)
|
||||||
|
QtCore.QMetaObject.connectSlotsByName(MainWindow)
|
||||||
QMetaObject.connectSlotsByName(MainWindow)
|
|
||||||
# setupUi
|
|
||||||
|
|
||||||
def retranslateUi(self, MainWindow):
|
def retranslateUi(self, MainWindow):
|
||||||
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435", None))
|
MainWindow.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "Статистическое моделирование", None, -1))
|
||||||
self.aboutmenuaction.setText(QCoreApplication.translate("MainWindow", u"\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435", None))
|
self.label.setText(QtWidgets.QApplication.translate("MainWindow", "СТАТИСТИЧЕСКИЕ ДАННЫЕ", None, -1))
|
||||||
self.generateYaction.setText(QCoreApplication.translate("MainWindow", u"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430", None))
|
self.filemenu.setTitle(QtWidgets.QApplication.translate("MainWindow", "Файл", None, -1))
|
||||||
self.generateXaction.setText(QCoreApplication.translate("MainWindow", u"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u0430", None))
|
self.generatemenu.setTitle(QtWidgets.QApplication.translate("MainWindow", "Генерация показателей", None, -1))
|
||||||
self.openfileaction.setText(QCoreApplication.translate("MainWindow", u"\u041e\u0442\u043a\u0440\u044b\u0442\u044c", None))
|
self.analyzemenu.setTitle(QtWidgets.QApplication.translate("MainWindow", "Анализ данных", None, -1))
|
||||||
self.savefileaction.setText(QCoreApplication.translate("MainWindow", u"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", None))
|
self.modelmenu.setTitle(QtWidgets.QApplication.translate("MainWindow", "Моделирование", None, -1))
|
||||||
self.closefileaction.setText(QCoreApplication.translate("MainWindow", u"\u0417\u0430\u043a\u0440\u044b\u0442\u044c", None))
|
self.helpmenu.setTitle(QtWidgets.QApplication.translate("MainWindow", "Справка", None, -1))
|
||||||
self.varianceAnalysisAction.setText(QCoreApplication.translate("MainWindow", u"\u0414\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437", None))
|
self.menu.setTitle(QtWidgets.QApplication.translate("MainWindow", "Распределения", None, -1))
|
||||||
self.correlationAnalisisAction.setText(QCoreApplication.translate("MainWindow", u"\u041a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437", None))
|
self.aboutmenuaction.setText(QtWidgets.QApplication.translate("MainWindow", "О программе", None, -1))
|
||||||
self.linearPolynomAction.setText(QCoreApplication.translate("MainWindow", u"\u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043d\u043e\u043c", None))
|
self.generateYaction.setText(QtWidgets.QApplication.translate("MainWindow", "Генерация отклика", None, -1))
|
||||||
self.squaredPolynomAction.setText(QCoreApplication.translate("MainWindow", u"\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043d\u043e\u043c", None))
|
self.generateXaction.setText(QtWidgets.QApplication.translate("MainWindow", "Генерация фактора", None, -1))
|
||||||
self.transformPolynomAction.setText(QCoreApplication.translate("MainWindow", u"\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f", None))
|
self.openfileaction.setText(QtWidgets.QApplication.translate("MainWindow", "Открыть", None, -1))
|
||||||
self.usageaction.setText(QCoreApplication.translate("MainWindow", u"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435", None))
|
self.savefileaction.setText(QtWidgets.QApplication.translate("MainWindow", "Сохранить", None, -1))
|
||||||
self.label.setText(QCoreApplication.translate("MainWindow", u"\u0421\u0422\u0410\u0422\u0418\u0421\u0422\u0418\u0427\u0415\u0421\u041a\u0418\u0415 \u0414\u0410\u041d\u041d\u042b\u0415", None))
|
self.closefileaction.setText(QtWidgets.QApplication.translate("MainWindow", "Закрыть", None, -1))
|
||||||
self.filemenu.setTitle(QCoreApplication.translate("MainWindow", u"\u0424\u0430\u0439\u043b", None))
|
self.varianceAnalysisAction.setText(QtWidgets.QApplication.translate("MainWindow", "Дисперсионный анализ", None, -1))
|
||||||
self.generatemenu.setTitle(QCoreApplication.translate("MainWindow", u"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439", None))
|
self.correlationAnalisisAction.setText(QtWidgets.QApplication.translate("MainWindow", "Корреляционный анализ", None, -1))
|
||||||
self.analyzemenu.setTitle(QCoreApplication.translate("MainWindow", u"\u0410\u043d\u0430\u043b\u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445", None))
|
self.linearPolynomAction.setText(QtWidgets.QApplication.translate("MainWindow", "Линейный полином", None, -1))
|
||||||
self.modelmenu.setTitle(QCoreApplication.translate("MainWindow", u"\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435", None))
|
self.squaredPolynomAction.setText(QtWidgets.QApplication.translate("MainWindow", "Квадратичный полином", None, -1))
|
||||||
self.helpmenu.setTitle(QCoreApplication.translate("MainWindow", u"\u0421\u043f\u0440\u0430\u0432\u043a\u0430", None))
|
self.transformPolynomAction.setText(QtWidgets.QApplication.translate("MainWindow", "Преобразования", None, -1))
|
||||||
# retranslateUi
|
self.usageaction.setText(QtWidgets.QApplication.translate("MainWindow", "Использование", None, -1))
|
||||||
|
self.uniformDistributionAction.setText(QtWidgets.QApplication.translate("MainWindow", "Равномерное", None, -1))
|
||||||
|
self.normalDistributionAction.setText(QtWidgets.QApplication.translate("MainWindow", "Нормальное", None, -1))
|
||||||
|
self.exponentialDistributionAction.setText(QtWidgets.QApplication.translate("MainWindow", "Экспоненциальное", None, -1))
|
||||||
|
@@ -18,11 +18,19 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
from PySide2.QtCore import QUrl
|
from PySide2.QtCore import QUrl
|
||||||
from PySide2.QtWebEngineWidgets import QWebEngineView
|
from PySide2.QtGui import QDesktopServices
|
||||||
|
from PySide2.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
|
||||||
from PySide2.QtWidgets import QMainWindow, QVBoxLayout, QWidget
|
from PySide2.QtWidgets import QMainWindow, QVBoxLayout, QWidget
|
||||||
|
|
||||||
from statapp.utils import addIcon, resourcePath
|
from statapp.utils import addIcon, resourcePath
|
||||||
|
|
||||||
|
class ExternalLinksWebEnginePage(QWebEnginePage):
|
||||||
|
def acceptNavigationRequest(self, url, _type, isMainFrame):
|
||||||
|
if _type == QWebEnginePage.NavigationTypeLinkClicked:
|
||||||
|
QDesktopServices.openUrl(url)
|
||||||
|
return False # Prevent the internal view from navigating to the URL
|
||||||
|
return True # Handle all other navigation requests normally
|
||||||
|
|
||||||
class UsageWindow(QMainWindow):
|
class UsageWindow(QMainWindow):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@@ -32,9 +40,17 @@ class UsageWindow(QMainWindow):
|
|||||||
layout = QVBoxLayout()
|
layout = QVBoxLayout()
|
||||||
|
|
||||||
self.browser = QWebEngineView()
|
self.browser = QWebEngineView()
|
||||||
|
customPage = ExternalLinksWebEnginePage(self.browser)
|
||||||
|
self.browser.setPage(customPage)
|
||||||
|
|
||||||
layout.addWidget(self.browser)
|
layout.addWidget(self.browser)
|
||||||
|
|
||||||
self.browser.load(QUrl.fromLocalFile(resourcePath("docs/README.html")))
|
self.browser.load(QUrl.fromLocalFile(resourcePath("docs/README.html")))
|
||||||
|
|
||||||
widget = QWidget()
|
widget = QWidget()
|
||||||
widget.setLayout(layout)
|
widget.setLayout(layout)
|
||||||
self.setCentralWidget(widget)
|
self.setCentralWidget(widget)
|
||||||
|
|
||||||
|
def onLinkClicked(self, url):
|
||||||
|
# Open the URL in the default web browser instead of the QWebEngineView
|
||||||
|
QDesktopServices.openUrl(url)
|
||||||
|
Reference in New Issue
Block a user