форкнуто от main/python-labs
Родитель
55a6c7da23
Сommit
c2d6a44d5c
|
После Ширина: | Высота: | Размер: 17 KiB |
|
После Ширина: | Высота: | Размер: 9.4 KiB |
|
После Ширина: | Высота: | Размер: 8.3 KiB |
|
После Ширина: | Высота: | Размер: 14 KiB |
|
После Ширина: | Высота: | Размер: 13 KiB |
@ -0,0 +1,232 @@
|
||||
# Тест по Теме 9 Модуль 3
|
||||
|
||||
Володин Денис, А-02-23
|
||||
|
||||
## Задание (Вариант 1)
|
||||
|
||||
M3_1
|
||||
|
||||
1) Создайте модуль М1, содержащий две функции:
|
||||
|
||||
- функция 1: аргумент - список или кортеж с выборкой; функция должна произвести расчет по выборке оценки её дисперсии DX, а также наименьшего и наибольшего значений и вернуть эти значения в вызывающую программу в виде списка;
|
||||
|
||||
- функция 2: аргументы - два списка или кортежа с выборками X и Y; функция должна произвести с помощью функции 1 расчет статистик по выборкам и рассчитать статистику Фишера: F=DX/DY
|
||||
|
||||
2) Создайте еще один модуль М2, в котором должны выполняться следующие операции:
|
||||
|
||||
- запрашивается имя бинарного файла с выборками X и Y, проверяется его наличие и при отсутствии - повторяется запрос;
|
||||
|
||||
- выборки считываются из файлов;
|
||||
|
||||
- с помощью функции 1 по выборкам рассчитываются их статистики,
|
||||
|
||||
- с помощью функции 2 рассчитывается значение статистики Фишера,
|
||||
|
||||
- если числа элементов в выборках одинаково, графически отображается поле рассеивания для Х и Y;
|
||||
|
||||
- результаты расчета с соответствующими заголовками выводятся в текстовый файл.
|
||||
|
||||
3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчета на экране.
|
||||
|
||||
4) Создайте 2 бинарных файла: с выборками одинакового размера и с выборками разного размера. Проверьте программу с использованием этих файлов.
|
||||
|
||||
## Решение
|
||||
|
||||
## Создание бинарных файлов
|
||||
|
||||
```py
|
||||
import pickle
|
||||
import random
|
||||
from m2 import save_samples
|
||||
|
||||
def create_test_files():
|
||||
print("\n1. Создание файла с выборками одинакового размера:")
|
||||
sample_x1 = [random.uniform(1, 10) for _ in range(10)]
|
||||
sample_y1 = [random.uniform(5, 15) for _ in range(10)]
|
||||
save_samples("test1.pkl", sample_x1, sample_y1)
|
||||
print("\n2. Создание файла с выборками разного размера:")
|
||||
sample_x2 = [random.uniform(0, 20) for _ in range(15)]
|
||||
sample_y2 = [random.uniform(10, 30) for _ in range(8)]
|
||||
save_samples("test2.pkl", sample_x2, sample_y2)
|
||||
print("\n1. test1.pkl - одинаковый размер (10 и 10)")
|
||||
print("2. test2.pkl - разный размер (15 и 8)\n")
|
||||
|
||||
create_test_files()
|
||||
```
|
||||
|
||||
## M1
|
||||
|
||||
```py
|
||||
def calculate_stats(sample):
|
||||
n = len(sample)
|
||||
mean = sum(sample) / n
|
||||
var = sum((x - mean) ** 2 for x in sample) / (n - 1) if n > 1 else 0
|
||||
min_val = min(sample)
|
||||
max_val = max(sample)
|
||||
return [var, min_val, max_val]
|
||||
|
||||
def calculate_f_statistic(sample_x, sample_y):
|
||||
stats_x = calculate_stats(sample_x)
|
||||
stats_y = calculate_stats(sample_y)
|
||||
dx = stats_x[0]
|
||||
dy = stats_y[0]
|
||||
f_statistic = dx / dy
|
||||
return f_statistic
|
||||
```
|
||||
|
||||
## M2
|
||||
|
||||
```py
|
||||
|
||||
import os
|
||||
import pickle
|
||||
import matplotlib.pyplot as plt
|
||||
from m1 import calculate_stats, calculate_f_statistic
|
||||
|
||||
def save_samples(filename, sample_x, sample_y):
|
||||
data = {
|
||||
'sample_x': sample_x,
|
||||
'sample_y': sample_y,
|
||||
'info': f"Выборки: X({len(sample_x)}), Y({len(sample_y)})"
|
||||
}
|
||||
with open(filename, 'wb') as f:
|
||||
pickle.dump(data, f)
|
||||
print(f"Файл сохранен: {filename}")
|
||||
|
||||
def read_samples(filename):
|
||||
with open(filename, 'rb') as f:
|
||||
data = pickle.load(f)
|
||||
return data['sample_x'], data['sample_y']
|
||||
|
||||
def get_valid_filename():
|
||||
while True:
|
||||
filename = input("Введите имя файла с выборками (.pkl): ")
|
||||
if not filename.endswith('.pkl'):
|
||||
filename += '.pkl'
|
||||
if os.path.exists(filename):
|
||||
return filename
|
||||
else:
|
||||
print(f"Файл '{filename}' не найден.")
|
||||
|
||||
def show_plot(sample_x, sample_y, filename):
|
||||
if len(sample_x) != len(sample_y):
|
||||
print(f"Размеры выборок не совпадают: X={len(sample_x)}, Y={len(sample_y)}")
|
||||
return
|
||||
plt.figure(figsize=(8, 6))
|
||||
plt.scatter(sample_x, sample_y, color='blue', alpha=0.6)
|
||||
plt.xlabel('Выборка X')
|
||||
plt.ylabel('Выборка Y')
|
||||
plt.title(f'Поле рассеивания ({filename})')
|
||||
plt.grid(True)
|
||||
plt.show()
|
||||
|
||||
def process_samples():
|
||||
filename = get_valid_filename()
|
||||
print(f"\nЧтение файла: {filename}")
|
||||
sample_x, sample_y = read_samples(filename)
|
||||
print(f"Выборка X: {len(sample_x)} элементов")
|
||||
print(f"Выборка Y: {len(sample_y)} элементов")
|
||||
stats_x = calculate_stats(sample_x)
|
||||
stats_y = calculate_stats(sample_y)
|
||||
f_value = calculate_f_statistic(sample_x, sample_y)
|
||||
result_file = filename.replace('.pkl', '_results.txt')
|
||||
with open(result_file, 'w', encoding='utf-8') as f:
|
||||
f.write("РЕЗУЛЬТАТЫ АНАЛИЗА\n\n")
|
||||
f.write(f"Файл данных: {filename}\n")
|
||||
f.write(f"Размер X: {len(sample_x)}\n")
|
||||
f.write(f"Размер Y: {len(sample_y)}\n\n")
|
||||
f.write("ВЫБОРКА X:\n")
|
||||
f.write(f" Дисперсия: {stats_x[0]:.6f}\n")
|
||||
f.write(f" Минимум: {stats_x[1]:.6f}\n")
|
||||
f.write(f" Максимум: {stats_x[2]:.6f}\n\n")
|
||||
f.write("ВЫБОРКА Y:\n")
|
||||
f.write(f"Дисперсия: {stats_y[0]:.6f}\n")
|
||||
f.write(f"Минимум: {stats_y[1]:.6f}\n")
|
||||
f.write(f"Максимум: {stats_y[2]:.6f}\n\n")
|
||||
f.write("СТАТИСТИКА ФИШЕРА:\n")
|
||||
f.write(f" F = {f_value:.6f}\n\n")
|
||||
|
||||
if len(sample_x) == len(sample_y):
|
||||
show_plot(sample_x, sample_y, filename)
|
||||
|
||||
return {
|
||||
'filename': filename,
|
||||
'x_size': len(sample_x),
|
||||
'y_size': len(sample_y),
|
||||
'x_variance': stats_x[0],
|
||||
'y_variance': stats_y[0],
|
||||
'f_value': f_value,
|
||||
'result_file': result_file
|
||||
}
|
||||
```
|
||||
|
||||
## M0
|
||||
|
||||
```py
|
||||
from m2 import process_samples
|
||||
|
||||
results = process_samples()
|
||||
if results:
|
||||
print("\n=== РЕЗУЛЬТАТЫ НА ЭКРАНЕ ===")
|
||||
print(f"Файл: {results['filename']}")
|
||||
print(f"Размеры: X={results['x_size']}, Y={results['y_size']}")
|
||||
print(f"\nДисперсия X: {results['x_variance']:.4f}")
|
||||
print(f"Дисперсия Y: {results['y_variance']:.4f}")
|
||||
print(f"Статистика Фишера F: {results['f_value']:.4f}")
|
||||
print("\nПрограмма завершена.")
|
||||
```
|
||||
|
||||
## Результаты
|
||||
|
||||
```py
|
||||
1. Создание файла с выборками одинакового размера:
|
||||
Файл сохранен: test1.pkl
|
||||
|
||||
2. Создание файла с выборками разного размера:
|
||||
Файл сохранен: test2.pkl
|
||||
|
||||
1. test1.pkl - одинаковый размер (10 и 10)
|
||||
2. test2.pkl - разный размер (15 и 8)
|
||||
|
||||
Введите имя файла с выборками (.pkl): test1.pkl
|
||||
|
||||
Чтение файла: test1.pkl
|
||||
Выборка X: 10 элементов
|
||||
Выборка Y: 10 элементов
|
||||
|
||||
=== РЕЗУЛЬТАТЫ НА ЭКРАНЕ ===
|
||||
Файл: test1.pkl
|
||||
Размеры: X=10, Y=10
|
||||
|
||||
Дисперсия X: 3.4989
|
||||
Дисперсия Y: 9.8973
|
||||
Статистика Фишера F: 0.3535
|
||||
|
||||
Программа завершена.
|
||||
|
||||
Введите имя файла с выборками (.pkl): test2.pkl
|
||||
|
||||
Чтение файла: test2.pkl
|
||||
Выборка X: 15 элементов
|
||||
Выборка Y: 8 элементов
|
||||
|
||||
=== РЕЗУЛЬТАТЫ НА ЭКРАНЕ ===
|
||||
Файл: test2.pkl
|
||||
Размеры: X=15, Y=8
|
||||
|
||||
Дисперсия X: 55.5074
|
||||
Дисперсия Y: 28.3171
|
||||
Статистика Фишера F: 1.9602
|
||||
|
||||
Программа завершена.
|
||||
```
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
Загрузка…
Ссылка в новой задаче