11 Commits

Author SHA1 Message Date
github-actions[bot]
3f1bd27535 chore(main): release 0.12.2 (#119)
🤖 I have created a release *beep* *boop*
---


##
[0.12.2](https://github.com/shizand/statapp/compare/v0.12.1...v0.12.2)
(2024-02-12)


### Исправления

* Добавлены краткие теоретические сведения README
([34bcee2](34bcee2acf))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-02-12 16:46:13 +03:00
34bcee2acf fix: Добавлены краткие теоретические сведения README 2024-02-12 16:25:26 +03:00
github-actions[bot]
78f59a4574 chore(main): release 0.12.1 (#118)
🤖 I have created a release *beep* *boop*
---


##
[0.12.1](https://github.com/shizand/statapp/compare/v0.12.0...v0.12.1)
(2024-02-11)


### Исправления

* добавлено отключение "Распределения" при отсутствии отклика
([8ca535c](8ca535cc8f))
* исправлены ссылки на некоторую дополнительную литературу
([c23e1f8](c23e1f81a9))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-02-11 22:03:35 +03:00
8ca535cc8f fix: добавлено отключение "Распределения" при отсутствии отклика 2024-02-11 21:54:46 +03:00
918cd6fb9b Merge remote-tracking branch 'origin/main' 2024-02-11 21:46:00 +03:00
c23e1f81a9 fix: исправлены ссылки на некоторую дополнительную литературу 2024-02-11 21:45:50 +03:00
github-actions[bot]
8ba4c15f08 chore(main): release 0.12.0 (#109)
🤖 I have created a release *beep* *boop*
---


##
[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](ded55cb5d7)),
closes [#114](https://github.com/shizand/statapp/issues/114)
* добавлены "Распределения"
([#116](https://github.com/shizand/statapp/issues/116))
([981580f](981580f46d)),
closes [#111](https://github.com/shizand/statapp/issues/111)
[#112](https://github.com/shizand/statapp/issues/112)


### Исправления

* Дополнил README
([9766ecb](9766ecb7f5))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-02-11 21:30:32 +03:00
db4e791823 chore: try fix 2024-02-11 21:22:08 +03:00
981580f46d feat: добавлены "Распределения" (#116)
Closes #110 
Closes #111
Closes #112
2024-02-11 21:09:52 +03:00
ded55cb5d7 feat: Добавлена дополнительная литература (#117)
Closes #114
2024-02-11 21:08:52 +03:00
9766ecb7f5 fix: Дополнил README 2024-02-05 11:38:09 +03:00
33 changed files with 180941 additions and 229 deletions

View File

@@ -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]

View File

@@ -1,5 +1,33 @@
# Changelog # Changelog
## [0.12.2](https://github.com/shizand/statapp/compare/v0.12.1...v0.12.2) (2024-02-12)
### Исправления
* Добавлены краткие теоретические сведения README ([34bcee2](https://github.com/shizand/statapp/commit/34bcee2acf3a7cee806d2da49ca0e546df8d1e3f))
## [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)

View File

@@ -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 .
``` ```

View File

@@ -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

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "statapp" name = "statapp"
version = "0.11.0" version = "0.12.2"
description = "" description = ""
authors = [ authors = [
"Maxim Slipenko <statapp@maks1ms.addy.io>" "Maxim Slipenko <statapp@maks1ms.addy.io>"

View 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

View File

@@ -28,12 +28,62 @@ 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)
## Краткие теоретические сведения
В рамках ***дисперсионного анализа*** для каждой величины вычисляются следующие характеристики.
***Математическое ожидание*** характеризует среднее значение величины:
<image src="files/Формула 1.PNG">
*где n количество значений величины, i номер значения.*
***Дисперсия*** характеризует разброс величины относительно среднего значения:
<image src="files/Формула 2.PNG">
***Среднеквадратичное отклонение*** характеризует разброс величины относительно среднего значения:
<image src="files/Формула 3.PNG">
В результате ***корреляционного анализа*** вычисляется ***корреляционная матрица***. ***Коэффициент корреляции*** (rij) характеризует взаимосвязь между величинами. Взаимосвязь считается сильной, если выполняется условие:
<image src="files/Формула 4.PNG">
Знак ***коэффициента корреляции*** показывает характер влияния величин. Если знак положительный (прямая связь), то увеличение значения одной величины приводит к увеличению значения другой. Иначе увеличение значения одной величины приводит к уменьшению значения другой (обратная связь).
При осуществлении каскадного регрессионного анализа вычисляются параметры и оценки модели. В основе анализа лежит понятие коэффициента значимости (tj), который характеризует степень влияния фактора на модель. Фактор считается значимым, если выполняется условие:
<image src="files/Формула 5.PNG">
На каждом шаге вычисляются оценки полученной зависимости.
***Остаточная дисперсия масштабированная*** показывает, какая часть статистического материала не была охвачена полученной зависимостью.
<image src="files/Формула 6.PNG">
***Отношение Фишера*** (F1) показывает во сколько раз полученная зависимость лучше полинома y=yср, где yср математическое ожидание y.
<image src="files/Формула 7.PNG">
***Коэффициент множественной детерминации*** (R) характеризует степень близости полученной зависимости к реальному поведению объекта.
<image src="files/Формула 8.PNG">
Механизм процедуры ***каскадного регрессионного анализа***.
На 1-м шаге анализа строится модель, которая включает все ***факторы***. Далее производится исключение ***фактора*** tj с наименьшим по модулю значением ***коэффициента значимости*** и строится новая модель. Если оценки модели ухудшились, то ***каскадная процедура исключения факторов*** останавливается и лучшей считается модель, полученная на предыдущем шаге. Иначе исключение ***факторов*** продолжается до тех пор, пока не ухудшатся оценки модели либо пока для всех ***факторов*** будет выполняться условие.
## Начало работы ## Начало работы
@@ -43,7 +93,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
### Генерация отклика ### Генерация отклика
Перед тем как начать анализ, необходимо сгенерировать отклики, которые будут использоваться как зависимые переменные в моделях: Перед тем как начать анализ, необходимо сгенерировать ***отклики***, которые будут использоваться как зависимые переменные в моделях:
1. Перейдите в меню `Генерация показателей`. 1. Перейдите в меню `Генерация показателей`.
2. Выберите `Генерация отклика`. 2. Выберите `Генерация отклика`.
@@ -66,7 +116,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
### Генерация фактора ### Генерация фактора
После генерации откликов следует сгенерировать факторы, которые будут служить независимыми переменными. Для генерации факторов необходимо выполнить следующие шаги: После генерации ***откликов*** следует сгенерировать ***факторы***, которые будут служить независимыми переменными. Для генерации ***факторов*** необходимо выполнить следующие шаги:
1. Перейдите в меню `Генерация показателей`. 1. Перейдите в меню `Генерация показателей`.
2. Выберите `Генерация фактора`. 2. Выберите `Генерация фактора`.
@@ -77,7 +127,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 +138,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 +248,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
### Сохранение и открытие файла ### Сохранение и открытие файла
Сгенерированные значения ***Отклика*** и ***Фактора*** из таблицы в `Главном окне` можно сохранить или зугрузить из файла ***.txt*** и ***.csv***. Сгенерированные значения ***отклика*** и ***фактора*** из таблицы в `Главном окне` можно сохранить или зугрузить из файла ***.txt*** и ***.csv***.
### Сохранение файла ### Сохранение файла

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 976 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 934 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 678 B

View File

@@ -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 = ''

View 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)

View File

@@ -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)

View File

@@ -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>

View File

@@ -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/>

View File

@@ -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

View File

@@ -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))

View File

@@ -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)