Compare commits
17 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
8ba4c15f08 | ||
db4e791823 | |||
981580f46d | |||
ded55cb5d7 | |||
9766ecb7f5 | |||
|
8b09a76b32 | ||
aafa5a0ebb | |||
30447a801a | |||
240a517dd6 | |||
27c1455120 | |||
63f80819d2 | |||
d0053df261 | |||
fcddf84839 | |||
|
6b18bb1f82 | ||
871d9ad746 | |||
|
71e68a645d | ||
|
c36e1aa733 |
2
.idea/misc.xml
generated
@@ -3,5 +3,5 @@
|
|||||||
<component name="Black">
|
<component name="Black">
|
||||||
<option name="sdkName" value="Poetry (statapp)" />
|
<option name="sdkName" value="Poetry (statapp)" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="statapp" project-jdk-type="Python SDK" />
|
<component name="ProjectRootManager" version="2" project-jdk-name="Poetry (statapp) (2)" project-jdk-type="Python SDK" />
|
||||||
</project>
|
</project>
|
||||||
|
2
.idea/stat.iml
generated
@@ -2,7 +2,7 @@
|
|||||||
<module type="PYTHON_MODULE" version="4">
|
<module type="PYTHON_MODULE" version="4">
|
||||||
<component name="NewModuleRootManager">
|
<component name="NewModuleRootManager">
|
||||||
<content url="file://$MODULE_DIR$" />
|
<content url="file://$MODULE_DIR$" />
|
||||||
<orderEntry type="jdk" jdkName="statapp" jdkType="Python SDK" />
|
<orderEntry type="inheritedJdk" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
||||||
|
@@ -11,7 +11,7 @@ repos:
|
|||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
- id: check-yaml
|
- id: check-yaml
|
||||||
- id: check-added-large-files
|
#- id: check-added-large-files
|
||||||
- repo: https://github.com/johann-petrak/licenseheaders.git
|
- repo: https://github.com/johann-petrak/licenseheaders.git
|
||||||
rev: v0.8.8
|
rev: v0.8.8
|
||||||
hooks:
|
hooks:
|
||||||
|
@@ -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]
|
||||||
@@ -24,4 +24,5 @@ disable=
|
|||||||
missing-docstring,
|
missing-docstring,
|
||||||
too-many-public-methods,
|
too-many-public-methods,
|
||||||
too-few-public-methods,
|
too-few-public-methods,
|
||||||
too-many-arguments
|
too-many-arguments,
|
||||||
|
broad-except
|
||||||
|
40
CHANGELOG.md
@@ -1,5 +1,45 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [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)
|
||||||
|
|
||||||
|
|
||||||
|
### Новые функции
|
||||||
|
|
||||||
|
* добавлен пункт "Использование" ([#108](https://github.com/shizand/statapp/issues/108)) ([aafa5a0](https://github.com/shizand/statapp/commit/aafa5a0ebbb772b6aa55699d8a50587a8fe6c8e0)), closes [#70](https://github.com/shizand/statapp/issues/70)
|
||||||
|
* добавлена возможность удалить факторы ([#103](https://github.com/shizand/statapp/issues/103)) ([30447a8](https://github.com/shizand/statapp/commit/30447a801afdac80da948a6f0961ce7b08591f4f)), closes [#102](https://github.com/shizand/statapp/issues/102)
|
||||||
|
|
||||||
|
|
||||||
|
### Исправления
|
||||||
|
|
||||||
|
* добавлена легенда графика ([#104](https://github.com/shizand/statapp/issues/104)) ([240a517](https://github.com/shizand/statapp/commit/240a517dd6691d45253b5863b54b4b035aaea8f1)), closes [#101](https://github.com/shizand/statapp/issues/101)
|
||||||
|
|
||||||
|
## [0.10.2](https://github.com/shizand/statapp/compare/v0.10.1...v0.10.2) (2024-02-01)
|
||||||
|
|
||||||
|
|
||||||
|
### Исправления
|
||||||
|
|
||||||
|
* исправлена опечатка в характеристиках модели ([871d9ad](https://github.com/shizand/statapp/commit/871d9ad746c51351bee9097d9f56903c8e1d1873))
|
||||||
|
|
||||||
|
## [0.10.1](https://github.com/shizand/statapp/compare/v0.10.0...v0.10.1) (2024-01-29)
|
||||||
|
|
||||||
|
|
||||||
|
### Исправления
|
||||||
|
|
||||||
|
* Добавлена обработка ошибок ([#98](https://github.com/shizand/statapp/issues/98)) ([c36e1aa](https://github.com/shizand/statapp/commit/c36e1aa733269720366c4d7dea48d2bdc966a59a))
|
||||||
|
|
||||||
## [0.10.0](https://github.com/shizand/statapp/compare/v0.9.0...v0.10.0) (2024-01-08)
|
## [0.10.0](https://github.com/shizand/statapp/compare/v0.9.0...v0.10.0) (2024-01-08)
|
||||||
|
|
||||||
|
|
||||||
|
10
README.md
@@ -39,9 +39,17 @@ poetry install
|
|||||||
pyinstaller statapp.spec # или pyinstaller statapp.spec -- --one-file
|
pyinstaller statapp.spec # или pyinstaller statapp.spec -- --one-file
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Документация собирается с помощью [grip](https://github.com/joeyespo/grip)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo "STYLE_URLS = [\"https://cdn.jsdelivr.net/gh/shizand/statapp@main/statapp/docs/grip.css\"]" > ~/.grip/settings.py
|
||||||
|
cd docs
|
||||||
|
grip .
|
||||||
|
```
|
||||||
|
|
||||||
## Использование
|
## Использование
|
||||||
|
|
||||||
<!-- TODO -->
|
Использование описано в [Руководстве пользователя](docs/README.md).
|
||||||
|
|
||||||
## Чем я могу помочь проекту?
|
## Чем я могу помочь проекту?
|
||||||
|
|
||||||
|
155
environment.yml
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
name: statapp
|
||||||
|
channels:
|
||||||
|
- conda-forge
|
||||||
|
- defaults
|
||||||
|
dependencies:
|
||||||
|
- _libgcc_mutex=0.1=conda_forge
|
||||||
|
- _openmp_mutex=4.5=2_gnu
|
||||||
|
- alsa-lib=1.2.10=hd590300_0
|
||||||
|
- attr=2.5.1=h166bdaf_1
|
||||||
|
- bzip2=1.0.8=hd590300_5
|
||||||
|
- ca-certificates=2024.2.2=hbcca054_0
|
||||||
|
- cairo=1.16.0=h6cf1ce9_1008
|
||||||
|
- dbus=1.13.6=h48d8840_2
|
||||||
|
- expat=2.5.0=hcb278e6_1
|
||||||
|
- font-ttf-dejavu-sans-mono=2.37=hab24e00_0
|
||||||
|
- font-ttf-inconsolata=3.000=h77eed37_0
|
||||||
|
- font-ttf-source-code-pro=2.038=h77eed37_0
|
||||||
|
- font-ttf-ubuntu=0.83=h77eed37_1
|
||||||
|
- fontconfig=2.14.2=h14ed4e7_0
|
||||||
|
- fonts-conda-ecosystem=1=0
|
||||||
|
- fonts-conda-forge=1=0
|
||||||
|
- freetype=2.12.1=h267a509_2
|
||||||
|
- gettext=0.21.1=h27087fc_0
|
||||||
|
- glib=2.68.4=h9c3ff4c_0
|
||||||
|
- glib-tools=2.68.4=h9c3ff4c_0
|
||||||
|
- graphite2=1.3.13=h58526e2_1001
|
||||||
|
- gst-plugins-base=1.18.4=h29181c9_0
|
||||||
|
- gstreamer=1.18.5=h76c114f_0
|
||||||
|
- harfbuzz=3.0.0=h83ec7ef_1
|
||||||
|
- icu=68.2=h9c3ff4c_0
|
||||||
|
- jpeg=9e=h166bdaf_2
|
||||||
|
- keyutils=1.6.1=h166bdaf_0
|
||||||
|
- krb5=1.19.3=h3790be6_0
|
||||||
|
- lame=3.100=h166bdaf_1003
|
||||||
|
- ld_impl_linux-64=2.38=h1181459_1
|
||||||
|
- libcap=2.69=h0f662aa_0
|
||||||
|
- libclang=11.1.0=default_ha53f305_1
|
||||||
|
- libclang13=14.0.6=default_h9986a30_1
|
||||||
|
- libcups=2.3.3=h3e49a29_2
|
||||||
|
- libedit=3.1.20191231=he28a2e2_2
|
||||||
|
- libevent=2.1.10=h9b69904_4
|
||||||
|
- libexpat=2.5.0=hcb278e6_1
|
||||||
|
- libffi=3.3=h58526e2_2
|
||||||
|
- libflac=1.4.3=h59595ed_0
|
||||||
|
- libgcc-ng=13.2.0=h807b86a_5
|
||||||
|
- libgcrypt=1.10.3=hd590300_0
|
||||||
|
- libglib=2.68.4=h3e27bee_0
|
||||||
|
- libgomp=13.2.0=h807b86a_5
|
||||||
|
- libgpg-error=1.47=h71f35ed_0
|
||||||
|
- libiconv=1.17=hd590300_2
|
||||||
|
- libjpeg-turbo=2.1.4=h166bdaf_0
|
||||||
|
- libllvm11=11.1.0=he0ac6c6_5
|
||||||
|
- libllvm14=14.0.6=hcd5def8_4
|
||||||
|
- libogg=1.3.4=h7f98852_1
|
||||||
|
- libopus=1.3.1=h7f98852_1
|
||||||
|
- libpng=1.6.42=h2797004_0
|
||||||
|
- libpq=13.8=hd77ab85_0
|
||||||
|
- libsndfile=1.2.2=hc60ed4a_1
|
||||||
|
- libsqlite=3.44.2=h2797004_0
|
||||||
|
- libstdcxx-ng=13.2.0=h7e041cc_5
|
||||||
|
- libsystemd0=255=h3516f8a_0
|
||||||
|
- libuuid=2.38.1=h0b41bf4_0
|
||||||
|
- libvorbis=1.3.7=h9c3ff4c_0
|
||||||
|
- libxcb=1.15=h0b41bf4_0
|
||||||
|
- libxkbcommon=1.0.3=he3ba5ed_0
|
||||||
|
- libxml2=2.9.12=h72842e0_0
|
||||||
|
- libxslt=1.1.33=h15afd5d_2
|
||||||
|
- libzlib=1.2.13=hd590300_5
|
||||||
|
- lz4-c=1.9.4=hcb278e6_0
|
||||||
|
- mpg123=1.32.4=h59595ed_0
|
||||||
|
- mysql-common=8.0.32=h14678bc_0
|
||||||
|
- mysql-libs=8.0.32=h54cf53e_0
|
||||||
|
- ncurses=6.4=h6a678d5_0
|
||||||
|
- nspr=4.35=h27087fc_0
|
||||||
|
- nss=3.97=h1d7d5a4_0
|
||||||
|
- openssl=1.1.1w=hd590300_0
|
||||||
|
- pcre=8.45=h9c3ff4c_0
|
||||||
|
- pcre2=10.42=hcad00b1_0
|
||||||
|
- pip=23.3.1=py38h06a4308_0
|
||||||
|
- pixman=0.43.2=h59595ed_0
|
||||||
|
- pthread-stubs=0.4=h36c2ea0_1001
|
||||||
|
- pyside2=5.13.2=py38h2009f50_7
|
||||||
|
- python=3.8.10=h49503c6_1_cpython
|
||||||
|
- python_abi=3.8=2_cp38
|
||||||
|
- qt=5.12.9=hda022c4_4
|
||||||
|
- readline=8.2=h5eee18b_0
|
||||||
|
- setuptools=68.2.2=py38h06a4308_0
|
||||||
|
- sqlite=3.41.2=h5eee18b_0
|
||||||
|
- tk=8.6.12=h1ccaba5_0
|
||||||
|
- wheel=0.41.2=py38h06a4308_0
|
||||||
|
- xcb-util=0.4.0=hd590300_1
|
||||||
|
- xcb-util-image=0.4.0=h8ee46fc_1
|
||||||
|
- xcb-util-keysyms=0.4.0=h8ee46fc_1
|
||||||
|
- xcb-util-renderutil=0.3.9=hd590300_1
|
||||||
|
- xcb-util-wm=0.4.1=h8ee46fc_1
|
||||||
|
- xkeyboard-config=2.40=hd590300_0
|
||||||
|
- xorg-kbproto=1.0.7=h7f98852_1002
|
||||||
|
- xorg-libice=1.1.1=hd590300_0
|
||||||
|
- xorg-libsm=1.2.4=h7391055_0
|
||||||
|
- xorg-libx11=1.8.7=h8ee46fc_0
|
||||||
|
- xorg-libxau=1.0.11=hd590300_0
|
||||||
|
- xorg-libxdmcp=1.1.3=h7f98852_0
|
||||||
|
- xorg-libxext=1.3.4=h0b41bf4_2
|
||||||
|
- xorg-libxrender=0.9.11=hd590300_0
|
||||||
|
- xorg-renderproto=0.11.1=h7f98852_1002
|
||||||
|
- xorg-xextproto=7.3.0=h0b41bf4_1003
|
||||||
|
- xorg-xf86vidmodeproto=2.3.1=h7f98852_1002
|
||||||
|
- xorg-xproto=7.0.31=h7f98852_1007
|
||||||
|
- xz=5.4.5=h5eee18b_0
|
||||||
|
- zlib=1.2.13=hd590300_5
|
||||||
|
- zstd=1.5.5=hfc55251_0
|
||||||
|
- pip:
|
||||||
|
- altgraph==0.17.4
|
||||||
|
- astroid==2.15.8
|
||||||
|
- cfgv==3.4.0
|
||||||
|
- contourpy==1.1.1
|
||||||
|
- cycler==0.12.1
|
||||||
|
- dill==0.3.7
|
||||||
|
- distlib==0.3.7
|
||||||
|
- filelock==3.12.4
|
||||||
|
- fonttools==4.43.1
|
||||||
|
- identify==2.5.30
|
||||||
|
- importlib-metadata==6.8.0
|
||||||
|
- importlib-resources==6.1.0
|
||||||
|
- isort==5.12.0
|
||||||
|
- kiwisolver==1.4.5
|
||||||
|
- lazy-object-proxy==1.9.0
|
||||||
|
- matplotlib==3.7.3
|
||||||
|
- mccabe==0.7.0
|
||||||
|
- mpmath==1.3.0
|
||||||
|
- nodeenv==1.8.0
|
||||||
|
- numpy==1.24.4
|
||||||
|
- packaging==23.2
|
||||||
|
- pandas==2.0.3
|
||||||
|
- pillow==9.5.0
|
||||||
|
- platformdirs==3.11.0
|
||||||
|
- pre-commit==3.5.0
|
||||||
|
- pyinstaller==6.1.0
|
||||||
|
- pyinstaller-hooks-contrib==2023.10
|
||||||
|
- pylint==2.17.7
|
||||||
|
- pyparsing==3.1.1
|
||||||
|
- python-dateutil==2.8.2
|
||||||
|
- pytz==2023.3.post1
|
||||||
|
- pyyaml==6.0.1
|
||||||
|
- setuptools-scm==8.0.4
|
||||||
|
- six==1.16.0
|
||||||
|
- sympy==1.12
|
||||||
|
- tomli==2.0.1
|
||||||
|
- tomlkit==0.12.1
|
||||||
|
- typing-extensions==4.8.0
|
||||||
|
- tzdata==2023.3
|
||||||
|
- virtualenv==20.24.5
|
||||||
|
- wrapt==1.15.0
|
||||||
|
- zipp==3.17.0
|
||||||
|
prefix: /home/maxim/miniconda3/envs/statapp
|
BIN
literature/Кадочникова Е. И. Эконометрика. Конспект лекций.pdf
Normal file
BIN
literature/Касьянов В. А. Эконометрика.pdf
Normal file
@@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "statapp"
|
name = "statapp"
|
||||||
version = "0.10.0"
|
version = "0.12.0"
|
||||||
description = ""
|
description = ""
|
||||||
authors = [
|
authors = [
|
||||||
"Maxim Slipenko <statapp@maks1ms.addy.io>"
|
"Maxim Slipenko <statapp@maks1ms.addy.io>"
|
||||||
|
@@ -17,7 +17,11 @@ parser = argparse.ArgumentParser()
|
|||||||
parser.add_argument("--one-file", action="store_true")
|
parser.add_argument("--one-file", action="store_true")
|
||||||
options = parser.parse_args()
|
options = parser.parse_args()
|
||||||
|
|
||||||
datas = [('statapp/ui/images/*', 'ui/images')]
|
datas = [
|
||||||
|
('statapp/ui/images/*', 'ui/images'),
|
||||||
|
('statapp/docs/files/*', 'docs/files'),
|
||||||
|
('statapp/docs/README.html', 'docs')
|
||||||
|
]
|
||||||
datas += copy_metadata('statapp')
|
datas += copy_metadata('statapp')
|
||||||
|
|
||||||
|
|
||||||
|
@@ -26,15 +26,14 @@ from statapp.main_window import MainWindow
|
|||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_ShareOpenGLContexts)
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
|
|
||||||
translator = QtCore.QTranslator(app)
|
translator = QtCore.QTranslator(app)
|
||||||
locale = QtCore.QLocale.system().name()
|
locale = QtCore.QLocale.system().name()
|
||||||
path = QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)
|
path = QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)
|
||||||
translator.load(f'qt_{locale}', path)
|
translator.load(f'qt_{locale}', path)
|
||||||
translator.load(f'qtbase_{locale}', path)
|
translator.load(f'qtbase_{locale}', path)
|
||||||
app.installTranslator(translator)
|
app.installTranslator(translator)
|
||||||
|
|
||||||
window = MainWindow()
|
window = MainWindow()
|
||||||
window.show()
|
window.show()
|
||||||
return app.exec_()
|
return app.exec_()
|
||||||
|
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
|
583
statapp/docs/README.html
Normal file
236
statapp/docs/README.md
Normal file
@@ -0,0 +1,236 @@
|
|||||||
|
<!--
|
||||||
|
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/>.
|
||||||
|
-->
|
||||||
|
# Руководство пользователя для программы "Statapp"
|
||||||
|
|
||||||
|
## Условные обозначения
|
||||||
|
|
||||||
|
`Взаимодействие` - так отображается интерфестные части приложения с которыми пользователь может и должен взаимодействовать. к тами относятся кнопки, пункты меню, окна приложения, страницы в моделировании и тд.
|
||||||
|
|
||||||
|
*Пример* - так отображаются комментарии или описания. Обычно используются в качестве подписей к картинкам.
|
||||||
|
|
||||||
|
***Параметр*** - так отображаются параметры, которые пользователь может получить в результате вычислений в приложении.
|
||||||
|
|
||||||
|
## Введение
|
||||||
|
"Statapp" — это программное решение для статистического анализа и регрессионного моделирования, позволяющее специалистам в области данных проводить глубокий анализ и создавать точные прогностические модели.
|
||||||
|
|
||||||
|
## Дополнительная литература
|
||||||
|
|
||||||
|
- [Гмурман В. Е. Теория вероятностей и математическая статистика. Учеб. пособие для вузов.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%3A%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%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/https%3A%2F%2Fraw.githubusercontent.com%2Fshizand%2Fstatapp%2Fv0.12.0%2Fliterature%2F%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)
|
||||||
|
|
||||||
|
## Краткие теоретические сведения
|
||||||
|
|
||||||
|
*-- В разработке --*
|
||||||
|
|
||||||
|
## Начало работы
|
||||||
|
|
||||||
|
### Генерация показателей
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
### Генерация отклика
|
||||||
|
|
||||||
|
Перед тем как начать анализ, необходимо сгенерировать ***отклики***, которые будут использоваться как зависимые переменные в моделях:
|
||||||
|
|
||||||
|
1. Перейдите в меню `Генерация показателей`.
|
||||||
|
2. Выберите `Генерация отклика`.
|
||||||
|
|
||||||
|
После этого откроется окно `Генерация отклика`:
|
||||||
|
|
||||||
|
<image src="files/Генерация показателей - Генерация отклика.PNG">
|
||||||
|
|
||||||
|
*Пример пункта меню* `Генерация отклика`
|
||||||
|
|
||||||
|
3. Укажите необходимые параметры для генерации данных и нажмите кнопку `Сгенерировать`.
|
||||||
|
|
||||||
|
<image src="files/Окно - Генерация отклика.PNG" width=400>
|
||||||
|
|
||||||
|
*Пример окна* `Генерация отклика`
|
||||||
|
|
||||||
|
После этого окно должно закрыться и на `Белом листе` в `Главном окне` появится колонка со случайно сгенерированными данными отклика по заданным показателям.
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
### Генерация фактора
|
||||||
|
|
||||||
|
После генерации ***откликов*** следует сгенерировать ***факторы***, которые будут служить независимыми переменными. Для генерации ***факторов*** необходимо выполнить следующие шаги:
|
||||||
|
|
||||||
|
1. Перейдите в меню `Генерация показателей`.
|
||||||
|
2. Выберите `Генерация фактора`.
|
||||||
|
|
||||||
|
После этого откроется окно `Генерация фактора`:
|
||||||
|
|
||||||
|
<image src="files/Генерация показателей - Генерация фактора.PNG">
|
||||||
|
|
||||||
|
*Пример пункта меню* `Генерация фактора`
|
||||||
|
|
||||||
|
3. Выберите нужный тип связи к ***отклику*** (прямая или обратная).
|
||||||
|
4. Укажите оставшиеся параметры для генерации данных и нажмите кнопку `Сгенерировать`.
|
||||||
|
|
||||||
|
<image src="files/Окно - Генерация фактора.PNG" width=400>
|
||||||
|
|
||||||
|
*Пример окна* `Генерация отклика`
|
||||||
|
|
||||||
|
Можно добавлять несколько факторов.
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
### Удаление факторов
|
||||||
|
|
||||||
|
Так как программа `Statapp` генерирует показатели ***Факторов*** случайным образом в границах заданого ***Среднеквадратического отклонения*** то при генерации нескольких ***Факторов*** может возникнуть необходимость удаления некоторых из них. Для этого необходимо выполнить следующие шаги:
|
||||||
|
|
||||||
|
1. Выберите необходимый ***Фактор*** для удаления и кликните по `Заголовку` с обозначением `Xn` правой кнопкой мыши.
|
||||||
|
2. Нажмите на появившуюся кнопку `Удалить` для удаления выбранного ***Фактора***.
|
||||||
|
|
||||||
|
*Внимание после удаления ***Фактора*** действие уже нельзя будет отменить*
|
||||||
|
|
||||||
|
<image src="files/Окно - Удаление.PNG">
|
||||||
|
|
||||||
|
*Пример появившейся кнопки* `Удалить`
|
||||||
|
|
||||||
|
Удаленный ***Фактор*** пропадет из таблицы и более не будет учитываться в `Анализе` и `Моделировании`.
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
### Анализ данных
|
||||||
|
|
||||||
|
После генерации ***отклика*** и ***факторов*** можно приступать к анализу данных.
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
### Дисперсионный анализ
|
||||||
|
|
||||||
|
1. Перейдите в меню `Анализ данных`.
|
||||||
|
2. Выберите `Дисперсионный анализ`.
|
||||||
|
|
||||||
|
<image src="files/Анализ данных - Дисперсионный анализ.PNG">
|
||||||
|
|
||||||
|
*Пример пункта меню* `Дисперсионный анализ`
|
||||||
|
|
||||||
|
После этого откроется окно `Дисперсионный анализ`:
|
||||||
|
|
||||||
|
<image src="files/Окно - Дисперсионный анализ.PNG">
|
||||||
|
|
||||||
|
*Пример окна* `Дисперсионный анализ`
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
### Корреляционный анализ
|
||||||
|
|
||||||
|
1. Перейдите в меню `Анализ данных`.
|
||||||
|
2. Выберите `Корреляционный анализ`.
|
||||||
|
|
||||||
|
<image src="files/Анализ данных - Корреляционный анализ.PNG">
|
||||||
|
|
||||||
|
*Пример пункта меню* `Корреляционный анализ`
|
||||||
|
|
||||||
|
После этого откроется окно `Корреляционный анализ`:
|
||||||
|
|
||||||
|
<image src="files/Окно - Корреляционный анализ.PNG">
|
||||||
|
|
||||||
|
*Пример окна* `Корреляционный анализ`
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
### Моделирование
|
||||||
|
|
||||||
|
После генерации отклика и факторов можно перейти к построению регрессионных моделей.
|
||||||
|
|
||||||
|
Здесь вы можете увидеть параметры модели, её характеристики, прогноз и отклонения, а также график прогноза и отклонения.
|
||||||
|
|
||||||
|
1. Перейдите на вкладку `Моделирование`.
|
||||||
|
2. Выберите тип модели для построения: `Линейный полином`, `Квадратичный полином` или `Преобразования`.
|
||||||
|
|
||||||
|
<image src="files/Моделирование - Линейный полином.PNG">
|
||||||
|
|
||||||
|
*Пример список пунктов меню* `Моделирование`
|
||||||
|
|
||||||
|
На странице `Модель` любого окна из `Моделирование` можно увидеть данные ***Коэффициент регрессии*** и ***Коэффициент значимости*** в виде таблицы для отклика и каждого из факторов. В нижней части окна располагаются вычисленные значения для параметров: ***Остаточная дисперсия***, ***Остаточная дисперсия (масштабированная)***, ***F1 - отношение Фишера***, ***Коэффициент множественной детерминации***,
|
||||||
|
|
||||||
|
<image src="files/Окно - Полином (Линейный полином).PNG">
|
||||||
|
|
||||||
|
*Пример страницы* `Модель` *окна* `Линейный полином`
|
||||||
|
|
||||||
|
На странице `Прогноз` любого окна из `Моделирование` можно увидеть значения ***Прогноза*** и ***Отклонения*** для каждого ранее сгенерированного значения ***Отклика***.
|
||||||
|
|
||||||
|
<image src="files/Окно - Полином - Прогноз.PNG">
|
||||||
|
|
||||||
|
*Пример страницы* `Прогноз` *окна* `Линейный полином`
|
||||||
|
|
||||||
|
На странице `График` любого окна из `Моделирование` можно увидеть график ***Прогноза*** (график) и ***Отклонения*** (точки).
|
||||||
|
|
||||||
|
<image src="files/Окно - Полином - График.PNG">
|
||||||
|
|
||||||
|
*Пример страницы* `График` *окна* `Линейный полином`
|
||||||
|
|
||||||
|
При необходимости, в окне `Моделирование` - `Преобразования` для каждого фактора вы можете выбрать одно из доступных преобразований.
|
||||||
|
|
||||||
|
<image src="files/Окно - Полином (Преобразования).PNG">
|
||||||
|
|
||||||
|
*Пример окна* `Преобразования`
|
||||||
|
|
||||||
|
Для выбора преобразования для определенного фактора необходимо выполнить следующие шаги:
|
||||||
|
|
||||||
|
1. Перейдите на страницу `Модель` в окне `Преобразования`.
|
||||||
|
2. Дважды нажмите на нужную ячейку в колонке ***Преобразования***.
|
||||||
|
3. Выберите необходимое преобразование из выпадающего списка.
|
||||||
|
|
||||||
|
<image src="files/Преобразования - Выбор преобразования.PNG">
|
||||||
|
|
||||||
|
*Пример списка выбора* ***Преобразования*** *фактора в окне* `Преобразования`
|
||||||
|
|
||||||
|
*Комментарий: если значения не персчитались попробуйте снять выделение с ячейки, путем нажатия на другую ячейку*
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
### Сохранение и открытие файла
|
||||||
|
|
||||||
|
Сгенерированные значения ***отклика*** и ***фактора*** из таблицы в `Главном окне` можно сохранить или зугрузить из файла ***.txt*** и ***.csv***.
|
||||||
|
|
||||||
|
### Сохранение файла
|
||||||
|
|
||||||
|
1. Перейдите в меню `Файл`.
|
||||||
|
2. Выберите `Сохранить`.
|
||||||
|
|
||||||
|
<image src="files/Файл - Сохранить.PNG">
|
||||||
|
|
||||||
|
*Пример пункта меню* `Сохранить файл`
|
||||||
|
|
||||||
|
3. Выберите путь сохранения и тип файла и нажмите кнопку `Сохранить`.
|
||||||
|
|
||||||
|
Теперь файл будет сохранен по указаному вами пути, его можно переместить куда необходимо и при необходимости загрузить обратно в приложение.
|
||||||
|
|
||||||
|
### Открытие файла
|
||||||
|
|
||||||
|
1. Перейдите в меню `Файл`.
|
||||||
|
2. Выберите `Открыть`.
|
||||||
|
|
||||||
|
<image src="files/Файл - Открыть.PNG">
|
||||||
|
|
||||||
|
*Пример пункта меню* `Открыть файл`
|
||||||
|
|
||||||
|
3. Выберите путь до открываемого файла и нажмите кнопку `Открыть`.
|
||||||
|
|
||||||
|
Приложение загрузит нужный вам файл, и при необходимости спросит нужно ли сохранять ваши текущие данные.
|
6711
statapp/docs/README.pdf
Normal file
BIN
statapp/docs/files/Анализ данных - Дисперсионный анализ.PNG
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
statapp/docs/files/Анализ данных - Корреляционный анализ.PNG
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
statapp/docs/files/Генерация показателей - Генерация отклика.PNG
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
statapp/docs/files/Генерация показателей - Генерация фактора.PNG
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
statapp/docs/files/Моделирование - Линейный полином.PNG
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
statapp/docs/files/Окно - Генерация отклика.PNG
Normal file
After Width: | Height: | Size: 7.8 KiB |
BIN
statapp/docs/files/Окно - Генерация фактора.PNG
Normal file
After Width: | Height: | Size: 7.4 KiB |
BIN
statapp/docs/files/Окно - Дисперсионный анализ.PNG
Normal file
After Width: | Height: | Size: 9.7 KiB |
BIN
statapp/docs/files/Окно - Корреляционный анализ.PNG
Normal file
After Width: | Height: | Size: 6.7 KiB |
BIN
statapp/docs/files/Окно - Полином (Линейный полином).PNG
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
statapp/docs/files/Окно - Полином (Преобразования).PNG
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
statapp/docs/files/Окно - Полином - График.PNG
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
statapp/docs/files/Окно - Полином - Прогноз.PNG
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
statapp/docs/files/Окно - Удаление.PNG
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
statapp/docs/files/Преобразования - Выбор преобразования.PNG
Normal file
After Width: | Height: | Size: 8.2 KiB |
BIN
statapp/docs/files/Файл - Открыть.PNG
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
statapp/docs/files/Файл - Сохранить.PNG
Normal file
After Width: | Height: | Size: 2.5 KiB |
36
statapp/docs/grip.css
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
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/>.
|
||||||
|
*/
|
||||||
|
#preview-page {
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#readme {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#readme > .Box-header {
|
||||||
|
border: none;
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#readme > .Box-body {
|
||||||
|
border: none;
|
||||||
|
}
|
@@ -19,11 +19,13 @@
|
|||||||
#
|
#
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from PySide2 import QtCore
|
from PySide2 import QtCore
|
||||||
from PySide2.QtCore import Slot
|
from PySide2.QtCore import Slot, Qt, QPoint
|
||||||
from PySide2.QtWidgets import QMainWindow, QMessageBox
|
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
|
||||||
@@ -33,7 +35,8 @@ from statapp.about_window import AboutWindow
|
|||||||
from statapp.models.fileslc_model import FileSLCModel
|
from statapp.models.fileslc_model import FileSLCModel
|
||||||
from statapp.polynoms.squared_polynom_window import SquaredPolynomWindow
|
from statapp.polynoms.squared_polynom_window import SquaredPolynomWindow
|
||||||
from statapp.ui.ui_main_window import Ui_MainWindow
|
from statapp.ui.ui_main_window import Ui_MainWindow
|
||||||
from statapp.utils import buildMessageBox, addIcon, FloatDelegate
|
from statapp.usage_window import UsageWindow
|
||||||
|
from statapp.utils import buildMessageBox, addIcon, FloatDelegate, onError
|
||||||
from statapp.variance_analysis import VarianceAnalysisWindow
|
from statapp.variance_analysis import VarianceAnalysisWindow
|
||||||
from statapp.correlation_analysis import CorrelationAnalysisWindow
|
from statapp.correlation_analysis import CorrelationAnalysisWindow
|
||||||
from statapp.polynoms.transform_polynom_window import TransformPolynomWindow
|
from statapp.polynoms.transform_polynom_window import TransformPolynomWindow
|
||||||
@@ -61,6 +64,7 @@ class MainWindow(QMainWindow):
|
|||||||
]
|
]
|
||||||
|
|
||||||
self.aboutWindow = None
|
self.aboutWindow = None
|
||||||
|
self.usageWindow = None
|
||||||
|
|
||||||
self.isDataChanged = False
|
self.isDataChanged = False
|
||||||
self.model = InputValuesModel()
|
self.model = InputValuesModel()
|
||||||
@@ -79,6 +83,27 @@ class MainWindow(QMainWindow):
|
|||||||
# x1 = generateXValues(20, 2, 0, y)
|
# x1 = generateXValues(20, 2, 0, y)
|
||||||
# x2 = generateXValues(10, 1, 0, y)
|
# x2 = generateXValues(10, 1, 0, y)
|
||||||
# self.model.updateAllData(np.concatenate([y, x1, x2], axis=1))
|
# self.model.updateAllData(np.concatenate([y, x1, x2], axis=1))
|
||||||
|
self.ui.tableView.horizontalHeader().setContextMenuPolicy(Qt.CustomContextMenu)
|
||||||
|
self.ui.tableView.horizontalHeader().customContextMenuRequested.connect(self.removeColumn)
|
||||||
|
|
||||||
|
|
||||||
|
def removeColumn(self, event: QPoint):
|
||||||
|
menu = QMenu(self)
|
||||||
|
|
||||||
|
col = self.ui.tableView.columnAt(event.x())
|
||||||
|
|
||||||
|
if col == 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
def fun():
|
||||||
|
self.model.removeCol(col)
|
||||||
|
self.isDataChanged = True
|
||||||
|
|
||||||
|
selectAction = QAction("Удалить", self)
|
||||||
|
selectAction.triggered.connect(fun)
|
||||||
|
menu.addAction(selectAction)
|
||||||
|
menu.exec_(self.ui.tableView.mapToGlobal(event))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def updateActionsEnabled(self):
|
def updateActionsEnabled(self):
|
||||||
@@ -103,101 +128,160 @@ class MainWindow(QMainWindow):
|
|||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def on_openfileaction_triggered(self):
|
def on_openfileaction_triggered(self):
|
||||||
currentData = self.model.getData()
|
try:
|
||||||
data = np.array([])
|
currentData = self.model.getData()
|
||||||
if currentData.size > 1:
|
data = np.array([])
|
||||||
file = ''
|
if currentData.size > 1:
|
||||||
if self.fileModel.fileName:
|
file = ''
|
||||||
file = '\nФайл сохранения: ' + self.fileModel.fileName
|
if self.fileModel.fileName:
|
||||||
|
file = '\nФайл сохранения: ' + self.fileModel.fileName
|
||||||
|
|
||||||
msgBox = buildMessageBox \
|
msgBox = buildMessageBox \
|
||||||
('Сохранение данных',
|
('Сохранение данных',
|
||||||
"Сохранить данные?" + file,
|
"Сохранить данные?" + file,
|
||||||
QMessageBox.Question,
|
QMessageBox.Question,
|
||||||
QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel,
|
QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel,
|
||||||
QMessageBox.Cancel)
|
QMessageBox.Cancel)
|
||||||
|
|
||||||
reply = msgBox.exec_()
|
reply = msgBox.exec_()
|
||||||
if reply == QMessageBox.StandardButton.Yes:
|
if reply == QMessageBox.StandardButton.Yes:
|
||||||
self.fileModel.saveFile(self.model.getData())
|
self.fileModel.saveFile(self.model.getData())
|
||||||
|
|
||||||
data = self.fileModel.loadFile()
|
data = self.fileModel.loadFile()
|
||||||
if data is not None and data.shape[0] > 0:
|
if data is not None and data.shape[0] > 0:
|
||||||
self.model.updateAllData(data)
|
self.model.updateAllData(data)
|
||||||
self.isDataChanged = False
|
self.isDataChanged = False
|
||||||
elif reply == QMessageBox.StandardButton.Cancel:
|
elif reply == QMessageBox.StandardButton.Cancel:
|
||||||
return
|
return
|
||||||
|
else:
|
||||||
|
data = self.fileModel.loadFile()
|
||||||
|
if data is not None and data.shape[0] > 0:
|
||||||
|
self.model.updateAllData(data)
|
||||||
|
self.isDataChanged = False
|
||||||
else:
|
else:
|
||||||
data = self.fileModel.loadFile()
|
data = self.fileModel.loadFile()
|
||||||
if data is not None and data.shape[0] > 0:
|
if data is not None and data.shape[0] > 0:
|
||||||
self.model.updateAllData(data)
|
self.model.updateAllData(data)
|
||||||
self.isDataChanged = False
|
self.isDataChanged = False
|
||||||
else:
|
except Exception as error:
|
||||||
data = self.fileModel.loadFile()
|
onError(error)
|
||||||
if data is not None and data.shape[0] > 0:
|
|
||||||
self.model.updateAllData(data)
|
|
||||||
self.isDataChanged = False
|
|
||||||
|
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def on_savefileaction_triggered(self):
|
def on_savefileaction_triggered(self):
|
||||||
self.isDataChanged = not self.fileModel.saveFile(self.model.getData())
|
try:
|
||||||
|
self.isDataChanged = not self.fileModel.saveFile(self.model.getData())
|
||||||
|
except Exception as error:
|
||||||
|
onError(error)
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def on_closefileaction_triggered(self):
|
def on_closefileaction_triggered(self):
|
||||||
self.fileModel.closeFile()
|
try:
|
||||||
self.isDataChanged = False
|
self.fileModel.closeFile()
|
||||||
|
self.isDataChanged = False
|
||||||
|
except Exception as error:
|
||||||
|
onError(error)
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def on_generateYaction_triggered(self):
|
def on_generateYaction_triggered(self):
|
||||||
gw = GenerateWindow()
|
try:
|
||||||
|
gw = GenerateWindow()
|
||||||
|
|
||||||
if gw.exec():
|
if gw.exec():
|
||||||
y = generateYValues(gw.mat, gw.deviation, gw.count)
|
y = generateYValues(gw.mat, gw.deviation, gw.count)
|
||||||
self.model.updateAllData(y.round(NUMBERS_PRECISION))
|
self.model.updateAllData(y.round(NUMBERS_PRECISION))
|
||||||
self.isDataChanged = True
|
self.isDataChanged = True
|
||||||
|
except Exception as error:
|
||||||
|
onError(error)
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def on_generateXaction_triggered(self):
|
def on_generateXaction_triggered(self):
|
||||||
gfw = GenerateFactorWindow()
|
try:
|
||||||
|
gfw = GenerateFactorWindow()
|
||||||
|
|
||||||
if gfw.exec():
|
if gfw.exec():
|
||||||
data = self.model.getData()
|
data = self.model.getData()
|
||||||
y = self.model.getY()
|
y = self.model.getY()
|
||||||
xValues = generateXValues(gfw.mat, gfw.deviation, gfw.typeConnection, y)
|
xValues = generateXValues(gfw.mat, gfw.deviation, gfw.typeConnection, y)
|
||||||
data = np.concatenate((data, xValues.round(NUMBERS_PRECISION)), axis=1)
|
data = np.concatenate((data, xValues.round(NUMBERS_PRECISION)), axis=1)
|
||||||
self.model.updateAllData(data)
|
self.model.updateAllData(data)
|
||||||
self.isDataChanged = True
|
self.isDataChanged = True
|
||||||
|
except Exception as error:
|
||||||
|
onError(error)
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def on_aboutmenuaction_triggered(self):
|
def on_aboutmenuaction_triggered(self):
|
||||||
self.aboutWindow = AboutWindow()
|
self.aboutWindow = AboutWindow()
|
||||||
self.aboutWindow.show()
|
self.aboutWindow.show()
|
||||||
|
|
||||||
|
@Slot()
|
||||||
|
def on_usageaction_triggered(self):
|
||||||
|
self.usageWindow = UsageWindow()
|
||||||
|
self.usageWindow.show()
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def on_varianceAnalysisAction_triggered(self):
|
def on_varianceAnalysisAction_triggered(self):
|
||||||
dw = VarianceAnalysisWindow(self.model.getData())
|
try:
|
||||||
dw.exec()
|
dw = VarianceAnalysisWindow(self.model.getData())
|
||||||
|
dw.exec()
|
||||||
|
except Exception as error:
|
||||||
|
onError(error)
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def on_correlationAnalisisAction_triggered(self):
|
def on_correlationAnalisisAction_triggered(self):
|
||||||
dw = CorrelationAnalysisWindow(self.model.getData())
|
try:
|
||||||
dw.exec()
|
dw = CorrelationAnalysisWindow(self.model.getData())
|
||||||
|
dw.exec()
|
||||||
|
except Exception as error:
|
||||||
|
onError(error)
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def on_linearPolynomAction_triggered(self):
|
def on_linearPolynomAction_triggered(self):
|
||||||
dw = LinearPolynomWindow(self.model.getData())
|
try:
|
||||||
dw.exec()
|
dw = LinearPolynomWindow(self.model.getData())
|
||||||
|
dw.exec()
|
||||||
|
except Exception as error:
|
||||||
|
onError(error)
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def on_squaredPolynomAction_triggered(self):
|
def on_squaredPolynomAction_triggered(self):
|
||||||
dw = SquaredPolynomWindow(self.model.getData())
|
try:
|
||||||
dw.exec()
|
dw = SquaredPolynomWindow(self.model.getData())
|
||||||
|
dw.exec()
|
||||||
|
except Exception as error:
|
||||||
|
onError(error)
|
||||||
|
|
||||||
@Slot()
|
@Slot()
|
||||||
def on_transformPolynomAction_triggered(self):
|
def on_transformPolynomAction_triggered(self):
|
||||||
dw = TransformPolynomWindow(self.model.getData())
|
try:
|
||||||
dw.exec()
|
dw = TransformPolynomWindow(self.model.getData())
|
||||||
|
dw.exec()
|
||||||
|
except Exception as 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:
|
||||||
|
@@ -33,3 +33,6 @@ class InputValuesModel(EditableTableModel):
|
|||||||
|
|
||||||
def getY(self):
|
def getY(self):
|
||||||
return self._data[:, 0]
|
return self._data[:, 0]
|
||||||
|
|
||||||
|
def removeCol(self, index: int):
|
||||||
|
self.updateAllData(np.delete(self._data, index, axis=1))
|
||||||
|
@@ -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)
|
||||||
|
@@ -28,7 +28,7 @@ from statapp.models.prediction_table_model import PreditionTableModel
|
|||||||
from statapp.models.transform_polynom_model import TransformPolynomModel, TRANSFORMS
|
from statapp.models.transform_polynom_model import TransformPolynomModel, TRANSFORMS
|
||||||
from statapp.polynoms.polynom_window import MplCanvas
|
from statapp.polynoms.polynom_window import MplCanvas
|
||||||
from statapp.ui.ui_polynom_window import Ui_PolynomWindow
|
from statapp.ui.ui_polynom_window import Ui_PolynomWindow
|
||||||
from statapp.utils import addIcon
|
from statapp.utils import addIcon, onError
|
||||||
|
|
||||||
|
|
||||||
class TransformPolynomWindow(QDialog):
|
class TransformPolynomWindow(QDialog):
|
||||||
@@ -41,8 +41,11 @@ class TransformPolynomWindow(QDialog):
|
|||||||
|
|
||||||
self.data = data
|
self.data = data
|
||||||
result = linearPolynom(data)
|
result = linearPolynom(data)
|
||||||
|
try:
|
||||||
|
predictionResult = prediction(data, result)
|
||||||
|
except Exception as error:
|
||||||
|
onError(error)
|
||||||
|
|
||||||
predictionResult = prediction(data, result)
|
|
||||||
self.predictionModel = PreditionTableModel(predictionResult)
|
self.predictionModel = PreditionTableModel(predictionResult)
|
||||||
self.ui.predictionTableView.setModel(self.predictionModel)
|
self.ui.predictionTableView.setModel(self.predictionModel)
|
||||||
header = self.ui.predictionTableView.horizontalHeader()
|
header = self.ui.predictionTableView.horizontalHeader()
|
||||||
@@ -84,13 +87,15 @@ 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)
|
||||||
data[i][j] = TRANSFORMS[tr](data[i][j])
|
data[i][j] = TRANSFORMS[tr](data[i][j])
|
||||||
|
|
||||||
self.rebuildData(data)
|
try:
|
||||||
|
self.rebuildData(data)
|
||||||
|
except Exception as error:
|
||||||
|
onError(error)
|
||||||
|
|
||||||
def rebuildData(self, data):
|
def rebuildData(self, data):
|
||||||
result = linearPolynom(data)
|
result = linearPolynom(data)
|
||||||
|
@@ -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>21</height>
|
<height>29</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="filemenu">
|
<widget class="QMenu" name="filemenu">
|
||||||
@@ -77,12 +77,22 @@
|
|||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Справка</string>
|
<string>Справка</string>
|
||||||
</property>
|
</property>
|
||||||
|
<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"/>
|
||||||
@@ -141,6 +151,26 @@
|
|||||||
<string>Преобразования</string>
|
<string>Преобразования</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="usageaction">
|
||||||
|
<property name="text">
|
||||||
|
<string>Использование</string>
|
||||||
|
</property>
|
||||||
|
</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/>
|
||||||
|
@@ -82,7 +82,7 @@
|
|||||||
<item row="3" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QLabel" name="rSquaredLabel">
|
<widget class="QLabel" name="rSquaredLabel">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Коэффициент множественной дереминизации</string>
|
<string>Коэффициент множественной детерминации</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -124,10 +124,17 @@
|
|||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>График</string>
|
<string>График</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QGridLayout" name="gridLayout_5">
|
<layout class="QGridLayout" name="gridLayout_5" rowstretch="1,0">
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<layout class="QGridLayout" name="plotContainer"/>
|
<layout class="QGridLayout" name="plotContainer"/>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Точки - отклик. Линия - прогноз</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
|
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
|
|
||||||
|
186
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,87 +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.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, 21))
|
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)
|
||||||
@@ -110,30 +98,42 @@ class Ui_MainWindow(object):
|
|||||||
self.modelmenu.addAction(self.linearPolynomAction)
|
self.modelmenu.addAction(self.linearPolynomAction)
|
||||||
self.modelmenu.addAction(self.squaredPolynomAction)
|
self.modelmenu.addAction(self.squaredPolynomAction)
|
||||||
self.modelmenu.addAction(self.transformPolynomAction)
|
self.modelmenu.addAction(self.transformPolynomAction)
|
||||||
|
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.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.savefileaction.setText(QtWidgets.QApplication.translate("MainWindow", "Сохранить", None, -1))
|
||||||
self.filemenu.setTitle(QCoreApplication.translate("MainWindow", u"\u0424\u0430\u0439\u043b", None))
|
self.closefileaction.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.varianceAnalysisAction.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.correlationAnalisisAction.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.linearPolynomAction.setText(QtWidgets.QApplication.translate("MainWindow", "Линейный полином", None, -1))
|
||||||
self.helpmenu.setTitle(QCoreApplication.translate("MainWindow", u"\u0421\u043f\u0440\u0430\u0432\u043a\u0430", None))
|
self.squaredPolynomAction.setText(QtWidgets.QApplication.translate("MainWindow", "Квадратичный полином", None, -1))
|
||||||
# retranslateUi
|
self.transformPolynomAction.setText(QtWidgets.QApplication.translate("MainWindow", "Преобразования", None, -1))
|
||||||
|
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))
|
||||||
|
9
statapp/ui/ui_polynom_window.py
generated
@@ -126,6 +126,12 @@ class Ui_PolynomWindow(object):
|
|||||||
|
|
||||||
self.gridLayout_5.addLayout(self.plotContainer, 0, 0, 1, 1)
|
self.gridLayout_5.addLayout(self.plotContainer, 0, 0, 1, 1)
|
||||||
|
|
||||||
|
self.label = QLabel(self.tab)
|
||||||
|
self.label.setObjectName(u"label")
|
||||||
|
|
||||||
|
self.gridLayout_5.addWidget(self.label, 1, 0, 1, 1)
|
||||||
|
|
||||||
|
self.gridLayout_5.setRowStretch(0, 1)
|
||||||
self.tabWidget.addTab(self.tab, "")
|
self.tabWidget.addTab(self.tab, "")
|
||||||
|
|
||||||
self.gridLayout_2.addWidget(self.tabWidget, 0, 6, 1, 1)
|
self.gridLayout_2.addWidget(self.tabWidget, 0, 6, 1, 1)
|
||||||
@@ -146,10 +152,11 @@ class Ui_PolynomWindow(object):
|
|||||||
self.fStatisticLabel.setText(QCoreApplication.translate("PolynomWindow", u"F1 - \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0424\u0438\u0448\u0435\u0440\u0430", None))
|
self.fStatisticLabel.setText(QCoreApplication.translate("PolynomWindow", u"F1 - \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0424\u0438\u0448\u0435\u0440\u0430", None))
|
||||||
self.residualVarianceLabel.setText(QCoreApplication.translate("PolynomWindow", u"\u041e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430\u044f \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u044f:", None))
|
self.residualVarianceLabel.setText(QCoreApplication.translate("PolynomWindow", u"\u041e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430\u044f \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u044f:", None))
|
||||||
self.scaledResidualVarianceLabel.setText(QCoreApplication.translate("PolynomWindow", u"\u041e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430\u044f \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u044f (\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f):", None))
|
self.scaledResidualVarianceLabel.setText(QCoreApplication.translate("PolynomWindow", u"\u041e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430\u044f \u0434\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u044f (\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f):", None))
|
||||||
self.rSquaredLabel.setText(QCoreApplication.translate("PolynomWindow", u"\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0434\u0435\u0440\u0435\u043c\u0438\u043d\u0438\u0437\u0430\u0446\u0438\u0438", None))
|
self.rSquaredLabel.setText(QCoreApplication.translate("PolynomWindow", u"\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0446\u0438\u0438", None))
|
||||||
self.fStatisticValueLabel.setText(QCoreApplication.translate("PolynomWindow", u"undefined", None))
|
self.fStatisticValueLabel.setText(QCoreApplication.translate("PolynomWindow", u"undefined", None))
|
||||||
self.rSquaredValueLabel.setText(QCoreApplication.translate("PolynomWindow", u"undefined", None))
|
self.rSquaredValueLabel.setText(QCoreApplication.translate("PolynomWindow", u"undefined", None))
|
||||||
self.tabWidget.setTabText(self.tabWidget.indexOf(self.model), QCoreApplication.translate("PolynomWindow", u"\u041c\u043e\u0434\u0435\u043b\u044c", None))
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.model), QCoreApplication.translate("PolynomWindow", u"\u041c\u043e\u0434\u0435\u043b\u044c", None))
|
||||||
self.tabWidget.setTabText(self.tabWidget.indexOf(self.prediction), QCoreApplication.translate("PolynomWindow", u"\u041f\u0440\u043e\u0433\u043d\u043e\u0437", None))
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.prediction), QCoreApplication.translate("PolynomWindow", u"\u041f\u0440\u043e\u0433\u043d\u043e\u0437", None))
|
||||||
|
self.label.setText(QCoreApplication.translate("PolynomWindow", u"\u0422\u043e\u0447\u043a\u0438 - \u043e\u0442\u043a\u043b\u0438\u043a. \u041b\u0438\u043d\u0438\u044f - \u043f\u0440\u043e\u0433\u043d\u043e\u0437", None))
|
||||||
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("PolynomWindow", u"\u0413\u0440\u0430\u0444\u0438\u043a", None))
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("PolynomWindow", u"\u0413\u0440\u0430\u0444\u0438\u043a", None))
|
||||||
# retranslateUi
|
# retranslateUi
|
||||||
|
56
statapp/ui/ui_usage_window.py
generated
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
## Form generated from reading UI file 'usage_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_UsageWindow(object):
|
||||||
|
def setupUi(self, UsageWindow):
|
||||||
|
if not UsageWindow.objectName():
|
||||||
|
UsageWindow.setObjectName(u"UsageWindow")
|
||||||
|
UsageWindow.resize(400, 300)
|
||||||
|
self.gridLayout = QGridLayout(UsageWindow)
|
||||||
|
self.gridLayout.setObjectName(u"gridLayout")
|
||||||
|
self.browserContainer = QVBoxLayout()
|
||||||
|
self.browserContainer.setObjectName(u"browserContainer")
|
||||||
|
|
||||||
|
self.gridLayout.addLayout(self.browserContainer, 0, 0, 1, 1)
|
||||||
|
|
||||||
|
|
||||||
|
self.retranslateUi(UsageWindow)
|
||||||
|
|
||||||
|
QMetaObject.connectSlotsByName(UsageWindow)
|
||||||
|
# setupUi
|
||||||
|
|
||||||
|
def retranslateUi(self, UsageWindow):
|
||||||
|
UsageWindow.setWindowTitle(QCoreApplication.translate("UsageWindow", u"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435", None))
|
||||||
|
# retranslateUi
|
24
statapp/ui/usage_window.ui
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>UsageWindow</class>
|
||||||
|
<widget class="QDialog" name="UsageWindow">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>400</width>
|
||||||
|
<height>300</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Использование</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<layout class="QVBoxLayout" name="browserContainer"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
56
statapp/usage_window.py
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
from PySide2.QtCore import QUrl
|
||||||
|
from PySide2.QtGui import QDesktopServices
|
||||||
|
from PySide2.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
|
||||||
|
from PySide2.QtWidgets import QMainWindow, QVBoxLayout, QWidget
|
||||||
|
|
||||||
|
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):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
self.setWindowTitle("Использование")
|
||||||
|
addIcon(self)
|
||||||
|
|
||||||
|
layout = QVBoxLayout()
|
||||||
|
|
||||||
|
self.browser = QWebEngineView()
|
||||||
|
customPage = ExternalLinksWebEnginePage(self.browser)
|
||||||
|
self.browser.setPage(customPage)
|
||||||
|
|
||||||
|
layout.addWidget(self.browser)
|
||||||
|
|
||||||
|
self.browser.load(QUrl.fromLocalFile(resourcePath("docs/README.html")))
|
||||||
|
|
||||||
|
widget = QWidget()
|
||||||
|
widget.setLayout(layout)
|
||||||
|
self.setCentralWidget(widget)
|
||||||
|
|
||||||
|
def onLinkClicked(self, url):
|
||||||
|
# Open the URL in the default web browser instead of the QWebEngineView
|
||||||
|
QDesktopServices.openUrl(url)
|
@@ -59,8 +59,19 @@ def buildMessageBox(title, text, icon, buttons, defaultButton):
|
|||||||
msgBox.setStandardButtons(buttons)
|
msgBox.setStandardButtons(buttons)
|
||||||
msgBox.setDefaultButton(defaultButton)
|
msgBox.setDefaultButton(defaultButton)
|
||||||
|
|
||||||
|
addIcon(msgBox)
|
||||||
|
|
||||||
return msgBox
|
return msgBox
|
||||||
|
|
||||||
|
def onError(errorName: Exception):
|
||||||
|
msgBox = buildMessageBox \
|
||||||
|
('Ошибка',
|
||||||
|
"Упс.. Произошла ошибка:\n" + str(errorName),
|
||||||
|
QMessageBox.Critical,
|
||||||
|
QMessageBox.Ok,
|
||||||
|
QMessageBox.Ok)
|
||||||
|
|
||||||
|
msgBox.exec_()
|
||||||
|
|
||||||
class FloatDelegate(QStyledItemDelegate):
|
class FloatDelegate(QStyledItemDelegate):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
|