diff --git a/TEMA9/Figure_1.png b/TEMA9/Figure_1.png new file mode 100644 index 0000000..23e23de Binary files /dev/null and b/TEMA9/Figure_1.png differ diff --git a/TEMA9/M0.py b/TEMA9/M0.py new file mode 100644 index 0000000..c24e1ae --- /dev/null +++ b/TEMA9/M0.py @@ -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() diff --git a/TEMA9/M1.py b/TEMA9/M1.py new file mode 100644 index 0000000..b24abaf --- /dev/null +++ b/TEMA9/M1.py @@ -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 diff --git a/TEMA9/M2.py b/TEMA9/M2.py new file mode 100644 index 0000000..99cf04f --- /dev/null +++ b/TEMA9/M2.py @@ -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() \ No newline at end of file diff --git a/TEMA9/Res3737.bin b/TEMA9/Res3737.bin new file mode 100644 index 0000000..5eeb03a Binary files /dev/null and b/TEMA9/Res3737.bin differ diff --git a/TEMA9/histogram.png b/TEMA9/histogram.png new file mode 100644 index 0000000..23e23de Binary files /dev/null and b/TEMA9/histogram.png differ diff --git a/TEMA9/test.md b/TEMA9/test.md new file mode 100644 index 0000000..9acea7b --- /dev/null +++ b/TEMA9/test.md @@ -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 +Гистограмма сохранена в файл + +``` +![](histogram.png) +## Вывод для 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 + +``` +![](Figure_1.png) \ No newline at end of file diff --git a/TEMA9/test1.txt b/TEMA9/test1.txt new file mode 100644 index 0000000..4a8400b --- /dev/null +++ b/TEMA9/test1.txt @@ -0,0 +1,2 @@ +12.5 15.3 14.8 13.2 16.1 +17.4 12.9 15.8 14.2 13.7 \ No newline at end of file diff --git a/TEMA9/test2.txt b/TEMA9/test2.txt new file mode 100644 index 0000000..887f746 --- /dev/null +++ b/TEMA9/test2.txt @@ -0,0 +1 @@ +100 105 98 102 110 95 103 107 99 101 104 96 109 97 108 \ No newline at end of file