форкнуто от main/python-labs
main
Родитель
9d685a2ec0
Сommit
7df5fb8d16
|
После Ширина: | Высота: | Размер: 15 KiB |
@ -0,0 +1,43 @@
|
|||||||
|
import M2
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"Главная программа"
|
||||||
|
print("=" * 40)
|
||||||
|
print("АНАЛИЗ ВЫБОРКИ")
|
||||||
|
print("=" * 40)
|
||||||
|
|
||||||
|
r = M2.main()
|
||||||
|
|
||||||
|
if r:
|
||||||
|
d, mx, v, sx, med, ma = r
|
||||||
|
|
||||||
|
print("\n" + "-" * 40)
|
||||||
|
print("РЕЗУЛЬТАТЫ:")
|
||||||
|
print(f"n = {len(d)}")
|
||||||
|
print(f"min = {min(d):.4f}")
|
||||||
|
print(f"max = {max(d):.4f}")
|
||||||
|
print(f"mx = {mx:.4f}")
|
||||||
|
print(f"v = {v:.4f}")
|
||||||
|
print(f"sx = {sx:.4f}")
|
||||||
|
print(f"med = {med:.4f}")
|
||||||
|
print(f"ma = {ma:.4f}")
|
||||||
|
|
||||||
|
if abs(ma) < 0.5:
|
||||||
|
t = "~симм"
|
||||||
|
elif ma > 0:
|
||||||
|
t = "вправо"
|
||||||
|
else:
|
||||||
|
t = "влево"
|
||||||
|
|
||||||
|
print(f"тип: {t}")
|
||||||
|
|
||||||
|
if mx != 0:
|
||||||
|
cv = sx / mx * 100
|
||||||
|
print(f"CV = {cv:.1f}%")
|
||||||
|
|
||||||
|
print("\n" + "=" * 40)
|
||||||
|
print("КОНЕЦ")
|
||||||
|
print("=" * 40)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
|
||||||
|
import math as m
|
||||||
|
|
||||||
|
def f1(d):
|
||||||
|
"Функция 1: среднее, дисперсия, откл, медиана"
|
||||||
|
if not d:
|
||||||
|
return 0, 0, 0, 0
|
||||||
|
|
||||||
|
n = len(d)
|
||||||
|
mx = sum(d) / n
|
||||||
|
|
||||||
|
v = sum((x - mx) ** 2 for x in d) / (n - 1) if n > 1 else 0
|
||||||
|
sx = m.sqrt(v) if v > 0 else 0
|
||||||
|
|
||||||
|
sd = sorted(d)
|
||||||
|
if n % 2 == 1:
|
||||||
|
med = sd[n // 2]
|
||||||
|
else:
|
||||||
|
med = (sd[n // 2 - 1] + sd[n // 2]) / 2
|
||||||
|
|
||||||
|
return mx, v, sx, med
|
||||||
|
|
||||||
|
def f2(d):
|
||||||
|
"""Функция 2: коэффициент асимметрии"""
|
||||||
|
if not d:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
mx, _, sx, _ = f1(d)
|
||||||
|
|
||||||
|
if sx == 0:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
n = len(d)
|
||||||
|
sc = sum((x - mx) ** 3 for x in d)
|
||||||
|
ma = sc / ((n - 1) * (sx ** 3)) if n > 1 else 0
|
||||||
|
|
||||||
|
return ma
|
||||||
@ -0,0 +1,107 @@
|
|||||||
|
import os
|
||||||
|
import struct
|
||||||
|
import math
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import M1
|
||||||
|
|
||||||
|
|
||||||
|
def read_file():
|
||||||
|
"Чтение файла с выборкой"
|
||||||
|
while True:
|
||||||
|
filename = input("Введите имя файла: ").strip()
|
||||||
|
if not filename.endswith('.txt'):
|
||||||
|
filename += '.txt'
|
||||||
|
|
||||||
|
if os.path.exists(filename):
|
||||||
|
try:
|
||||||
|
with open(filename, 'r', encoding='utf-8') as file:
|
||||||
|
content = file.read()
|
||||||
|
numbers = []
|
||||||
|
for part in content.split():
|
||||||
|
cleaned = part.strip(',;:')
|
||||||
|
try:
|
||||||
|
numbers.append(float(cleaned))
|
||||||
|
except ValueError:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if numbers:
|
||||||
|
print(f"Прочитано {len(numbers)} чисел из файла {filename}")
|
||||||
|
return numbers
|
||||||
|
else:
|
||||||
|
print("Файл не содержит чисел")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Ошибка при чтении файла: {e}")
|
||||||
|
else:
|
||||||
|
print(f"Файл {filename} не найден")
|
||||||
|
|
||||||
|
|
||||||
|
def create_histogram(data):
|
||||||
|
"Создание и отображение гистограммы"
|
||||||
|
if not data:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Определяем количество интервалов
|
||||||
|
num_bins = min(15, int(math.sqrt(len(data))))
|
||||||
|
|
||||||
|
plt.figure(figsize=(10, 6))
|
||||||
|
plt.hist(data, bins=num_bins, edgecolor='black', alpha=0.7)
|
||||||
|
plt.title('Гистограмма выборки')
|
||||||
|
plt.xlabel('Значения')
|
||||||
|
plt.ylabel('Частота')
|
||||||
|
plt.grid(True, alpha=0.3)
|
||||||
|
|
||||||
|
|
||||||
|
plt.savefig('histogram.png')
|
||||||
|
print("Гистограмма сохранена")
|
||||||
|
|
||||||
|
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
|
def save_to_binary(stats, asymmetry):
|
||||||
|
"Сохранение результатов в бинарный файл"
|
||||||
|
try:
|
||||||
|
with open('Res3737.bin', 'wb') as file:
|
||||||
|
# Записываем все 5 значений
|
||||||
|
for value in [stats[0], stats[1], stats[2], stats[3], asymmetry]:
|
||||||
|
file.write(struct.pack('d', value))
|
||||||
|
print("Результаты сохранены в файл 'Res3737.bin'")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Ошибка при сохранении в файл: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"Основная функция модуля M2"
|
||||||
|
|
||||||
|
sample = read_file()
|
||||||
|
if not sample:
|
||||||
|
print("Не удалось получить выборку. Программа завершена.")
|
||||||
|
return
|
||||||
|
|
||||||
|
print(f"\nХарактеристики выборки:")
|
||||||
|
print(f"Размер выборки: {len(sample)}")
|
||||||
|
print(f"Минимальное значение: {min(sample):.4f}")
|
||||||
|
print(f"Максимальное значение: {max(sample):.4f}")
|
||||||
|
|
||||||
|
# Расчет статистик
|
||||||
|
mean, variance, std_dev, median = M1.f1(sample)
|
||||||
|
asymmetry_coeff = M1.f2(sample)
|
||||||
|
|
||||||
|
print(f"\nРезультаты расчетов:")
|
||||||
|
print(f"Математическое ожидание: {mean:.4f}")
|
||||||
|
print(f"Дисперсия: {variance:.4f}")
|
||||||
|
print(f"Стандартное отклонение: {std_dev:.4f}")
|
||||||
|
print(f"Медиана: {median:.4f}")
|
||||||
|
print(f"Коэффициент асимметрии: {asymmetry_coeff:.4f}")
|
||||||
|
|
||||||
|
|
||||||
|
create_histogram(sample)
|
||||||
|
|
||||||
|
|
||||||
|
save_to_binary((mean, variance, std_dev, median), asymmetry_coeff)
|
||||||
|
|
||||||
|
return sample, mean, variance, std_dev, median, asymmetry_coeff
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Двоичный файл не отображается.
|
После Ширина: | Высота: | Размер: 15 KiB |
@ -0,0 +1,300 @@
|
|||||||
|
# Тест по модулю 3
|
||||||
|
|
||||||
|
Сарайкина Вера, А-02-23
|
||||||
|
|
||||||
|
## Задание
|
||||||
|
|
||||||
|
M3_24
|
||||||
|
1) Создайте модуль М1, содержащий две функции:
|
||||||
|
|
||||||
|
- функция 1: аргумент - список или кортеж с выборкой; функция должна рассчитать по выборке оценки математического ожидания, дисперсии, стандартного отклонения и медианы;
|
||||||
|
|
||||||
|
- функция 2: аргумент - список или кортеж с выборкой; функция должна произвести расчет по той же выборке оценки коэффициента асимметрии:
|
||||||
|
|
||||||
|
ma=[(x1-Mx)3+:+xN-Mx)^3]/[(N-1)*sx^3],
|
||||||
|
|
||||||
|
где Mx,sx - оценки математического ожидания и стандартного отклонения по выборке. При этом среднее значение и стандартное отклонение должны быть вычислены с помощью функции 1.
|
||||||
|
|
||||||
|
2) Создайте еще один модуль М2, в котором должны выполняться следующие операции:
|
||||||
|
|
||||||
|
- запрашивается имя текстового файла с выборкой, проверяется его наличие и при отсутствии - повторяется запрос;
|
||||||
|
|
||||||
|
- выборка вводится из файла и записывается в список;
|
||||||
|
|
||||||
|
- с помощью функций 1 и 2 по выборке рассчитываются оценки математического ожидания, дисперсии, стандартного отклонения, медианы и коэффициента асимметрии,
|
||||||
|
|
||||||
|
- по выборке рассчитывается гистограмма и отображается в виде графика на экране;
|
||||||
|
|
||||||
|
- результаты расчета записываются в бинарный файл с именем Res3737.bin.
|
||||||
|
|
||||||
|
3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчетов на экране.
|
||||||
|
|
||||||
|
4) Подготовьте 2 текстовых файла с выборками и проверьте программу.
|
||||||
|
|
||||||
|
## Выполнение
|
||||||
|
## модуль 1
|
||||||
|
```py
|
||||||
|
|
||||||
|
import math as m
|
||||||
|
|
||||||
|
def f1(d):
|
||||||
|
"Функция 1: среднее, дисперсия, откл, медиана"
|
||||||
|
if not d:
|
||||||
|
return 0, 0, 0, 0
|
||||||
|
|
||||||
|
n = len(d)
|
||||||
|
mx = sum(d) / n
|
||||||
|
|
||||||
|
v = sum((x - mx) ** 2 for x in d) / (n - 1) if n > 1 else 0
|
||||||
|
sx = m.sqrt(v) if v > 0 else 0
|
||||||
|
|
||||||
|
sd = sorted(d)
|
||||||
|
if n % 2 == 1:
|
||||||
|
med = sd[n // 2]
|
||||||
|
else:
|
||||||
|
med = (sd[n // 2 - 1] + sd[n // 2]) / 2
|
||||||
|
|
||||||
|
return mx, v, sx, med
|
||||||
|
|
||||||
|
def f2(d):
|
||||||
|
"""Функция 2: коэффициент асимметрии"""
|
||||||
|
if not d:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
mx, _, sx, _ = f1(d)
|
||||||
|
|
||||||
|
if sx == 0:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
n = len(d)
|
||||||
|
sc = sum((x - mx) ** 3 for x in d)
|
||||||
|
ma = sc / ((n - 1) * (sx ** 3)) if n > 1 else 0
|
||||||
|
|
||||||
|
return ma
|
||||||
|
|
||||||
|
```
|
||||||
|
## модуль 2
|
||||||
|
```py
|
||||||
|
import os
|
||||||
|
import struct
|
||||||
|
import math
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import M1
|
||||||
|
|
||||||
|
|
||||||
|
def read_file():
|
||||||
|
"Чтение файла с выборкой"
|
||||||
|
while True:
|
||||||
|
filename = input("Введите имя файла: ").strip()
|
||||||
|
if not filename.endswith('.txt'):
|
||||||
|
filename += '.txt'
|
||||||
|
|
||||||
|
if os.path.exists(filename):
|
||||||
|
try:
|
||||||
|
with open(filename, 'r', encoding='utf-8') as file:
|
||||||
|
content = file.read()
|
||||||
|
numbers = []
|
||||||
|
for part in content.split():
|
||||||
|
cleaned = part.strip(',;:')
|
||||||
|
try:
|
||||||
|
numbers.append(float(cleaned))
|
||||||
|
except ValueError:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if numbers:
|
||||||
|
print(f"Прочитано {len(numbers)} чисел из файла {filename}")
|
||||||
|
return numbers
|
||||||
|
else:
|
||||||
|
print("Файл не содержит чисел")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Ошибка при чтении файла: {e}")
|
||||||
|
else:
|
||||||
|
print(f"Файл {filename} не найден")
|
||||||
|
|
||||||
|
|
||||||
|
def create_histogram(data):
|
||||||
|
"Создание и отображение гистограммы"
|
||||||
|
if not data:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Определяем количество интервалов
|
||||||
|
num_bins = min(15, int(math.sqrt(len(data))))
|
||||||
|
|
||||||
|
plt.figure(figsize=(10, 6))
|
||||||
|
plt.hist(data, bins=num_bins, edgecolor='black', alpha=0.7)
|
||||||
|
plt.title('Гистограмма выборки')
|
||||||
|
plt.xlabel('Значения')
|
||||||
|
plt.ylabel('Частота')
|
||||||
|
plt.grid(True, alpha=0.3)
|
||||||
|
|
||||||
|
|
||||||
|
plt.savefig('histogram.png')
|
||||||
|
print("Гистограмма сохранена в файл ")
|
||||||
|
|
||||||
|
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
|
def save_to_binary(stats, asymmetry):
|
||||||
|
"Сохранение результатов в бинарный файл"
|
||||||
|
try:
|
||||||
|
with open('Res3737.bin', 'wb') as file:
|
||||||
|
# Записываем все 5 значений
|
||||||
|
for value in [stats[0], stats[1], stats[2], stats[3], asymmetry]:
|
||||||
|
file.write(struct.pack('d', value))
|
||||||
|
print("Результаты сохранены в файл 'Res3737.bin'")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Ошибка при сохранении в файл: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"Основная функция модуля M2"
|
||||||
|
|
||||||
|
sample = read_file()
|
||||||
|
if not sample:
|
||||||
|
print("Не удалось получить выборку. Программа завершена.")
|
||||||
|
return
|
||||||
|
|
||||||
|
print(f"\nХарактеристики выборки:")
|
||||||
|
print(f"Размер выборки: {len(sample)}")
|
||||||
|
print(f"Минимальное значение: {min(sample):.4f}")
|
||||||
|
print(f"Максимальное значение: {max(sample):.4f}")
|
||||||
|
|
||||||
|
# Расчет статистик
|
||||||
|
mean, variance, std_dev, median = M1.f1(sample)
|
||||||
|
asymmetry_coeff = M1.f2(sample)
|
||||||
|
|
||||||
|
print(f"\nРезультаты расчетов:")
|
||||||
|
print(f"Математическое ожидание: {mean:.4f}")
|
||||||
|
print(f"Дисперсия: {variance:.4f}")
|
||||||
|
print(f"Стандартное отклонение: {std_dev:.4f}")
|
||||||
|
print(f"Медиана: {median:.4f}")
|
||||||
|
print(f"Коэффициент асимметрии: {asymmetry_coeff:.4f}")
|
||||||
|
|
||||||
|
|
||||||
|
create_histogram(sample)
|
||||||
|
|
||||||
|
|
||||||
|
save_to_binary((mean, variance, std_dev, median), asymmetry_coeff)
|
||||||
|
|
||||||
|
return sample, mean, variance, std_dev, median, asymmetry_coeff
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
```
|
||||||
|
## основной модуль
|
||||||
|
```py
|
||||||
|
import M2
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"Главная программа"
|
||||||
|
print("=" * 40)
|
||||||
|
print("АНАЛИЗ ВЫБОРКИ")
|
||||||
|
print("=" * 40)
|
||||||
|
|
||||||
|
r = M2.main()
|
||||||
|
|
||||||
|
if r:
|
||||||
|
d, mx, v, sx, med, ma = r
|
||||||
|
|
||||||
|
print("\n" + "-" * 40)
|
||||||
|
print("РЕЗУЛЬТАТЫ:")
|
||||||
|
print(f"n = {len(d)}")
|
||||||
|
print(f"min = {min(d):.4f}")
|
||||||
|
print(f"max = {max(d):.4f}")
|
||||||
|
print(f"mx = {mx:.4f}")
|
||||||
|
print(f"v = {v:.4f}")
|
||||||
|
print(f"sx = {sx:.4f}")
|
||||||
|
print(f"med = {med:.4f}")
|
||||||
|
print(f"ma = {ma:.4f}")
|
||||||
|
|
||||||
|
if abs(ma) < 0.5:
|
||||||
|
t = "~симм"
|
||||||
|
elif ma > 0:
|
||||||
|
t = "вправо"
|
||||||
|
else:
|
||||||
|
t = "влево"
|
||||||
|
|
||||||
|
print(f"тип: {t}")
|
||||||
|
|
||||||
|
if mx != 0:
|
||||||
|
cv = sx / mx * 100
|
||||||
|
print(f"CV = {cv:.1f}%")
|
||||||
|
|
||||||
|
print("\n" + "=" * 40)
|
||||||
|
print("КОНЕЦ")
|
||||||
|
print("=" * 40)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
||||||
|
```
|
||||||
|
## Вывод для test1
|
||||||
|
```py
|
||||||
|
C:\Users\Yarik\PycharmProjects\PythonProject1\.venv\Scripts\python.exe C:\Users\Yarik\Desktop\labi\python-labs\TEMA9\M0.py
|
||||||
|
========================================
|
||||||
|
АНАЛИЗ ВЫБОРКИ
|
||||||
|
========================================
|
||||||
|
Введите имя файла: test1
|
||||||
|
Прочитано 10 чисел из файла test1.txt
|
||||||
|
|
||||||
|
Характеристики выборки:
|
||||||
|
Размер выборки: 10
|
||||||
|
Минимальное значение: 12.5000
|
||||||
|
Максимальное значение: 17.4000
|
||||||
|
|
||||||
|
Результаты расчетов:
|
||||||
|
Математическое ожидание: 14.5900
|
||||||
|
Дисперсия: 2.4766
|
||||||
|
Стандартное отклонение: 1.5737
|
||||||
|
Медиана: 14.5000
|
||||||
|
Коэффициент асимметрии: 0.2955
|
||||||
|
Гистограмма сохранена в файл
|
||||||
|
|
||||||
|
```
|
||||||
|

|
||||||
|
## Вывод для test2
|
||||||
|
```py
|
||||||
|
C:\Users\Yarik\PycharmProjects\PythonProject1\.venv\Scripts\python.exe C:\Users\Yarik\Desktop\labi\python-labs\TEMA9\M0.py
|
||||||
|
========================================
|
||||||
|
АНАЛИЗ ВЫБОРКИ
|
||||||
|
========================================
|
||||||
|
Введите имя файла: test2
|
||||||
|
Прочитано 15 чисел из файла test2.txt
|
||||||
|
|
||||||
|
Характеристики выборки:
|
||||||
|
Размер выборки: 15
|
||||||
|
Минимальное значение: 95.0000
|
||||||
|
Максимальное значение: 110.0000
|
||||||
|
|
||||||
|
Результаты расчетов:
|
||||||
|
Математическое ожидание: 102.2667
|
||||||
|
Дисперсия: 23.3524
|
||||||
|
Стандартное отклонение: 4.8324
|
||||||
|
Медиана: 102.0000
|
||||||
|
Коэффициент асимметрии: 0.1178
|
||||||
|
Гистограмма сохранена
|
||||||
|
Результаты сохранены в файл 'Res3737.bin'
|
||||||
|
|
||||||
|
----------------------------------------
|
||||||
|
РЕЗУЛЬТАТЫ:
|
||||||
|
n = 15
|
||||||
|
min = 95.0000
|
||||||
|
max = 110.0000
|
||||||
|
mx = 102.2667
|
||||||
|
v = 23.3524
|
||||||
|
sx = 4.8324
|
||||||
|
med = 102.0000
|
||||||
|
ma = 0.1178
|
||||||
|
тип: ~симм
|
||||||
|
CV = 4.7%
|
||||||
|
|
||||||
|
========================================
|
||||||
|
КОНЕЦ
|
||||||
|
========================================
|
||||||
|
|
||||||
|
Process finished with exit code 0
|
||||||
|
|
||||||
|
```
|
||||||
|

|
||||||
@ -0,0 +1,2 @@
|
|||||||
|
12.5 15.3 14.8 13.2 16.1
|
||||||
|
17.4 12.9 15.8 14.2 13.7
|
||||||
@ -0,0 +1 @@
|
|||||||
|
100 105 98 102 110 95 103 107 99 101 104 96 109 97 108
|
||||||
Загрузка…
Ссылка в новой задаче