KapitonovMikA 4 недель назад
Родитель e752479f02
Сommit 2614cf05ad

@ -0,0 +1,42 @@
import matplotlib.pyplot as plt
import math
import statistics
def func1(sps):
variation_series = sorted(list(sps))
mean_val = statistics.mean(variation_series)
median_val = statistics.median(variation_series)
if len(variation_series) > 1:
std_val = statistics.stdev(variation_series)
else:
std_val = 0
params = [mean_val, median_val, std_val]
return variation_series, params
def func2(sps, nint):
data = list(sps)
min_val = min(data)
max_val = max(data)
interval_width = (max_val - min_val) / nint
bins = [min_val + i * interval_width for i in range(nint + 1)]
hist = []
bin_edges = []
for i in range(nint):
bin_start = bins[i]
bin_end = bins[i + 1]
if i == nint - 1:
count = sum(1 for x in data if bin_start <= x <= bin_end)
else:
count = sum(1 for x in data if bin_start <= x < bin_end)
hist.append(count)
bin_edges.append((bin_start, bin_end))
plt.figure(figsize=(10, 6))
plt.hist(data, bins=nint, edgecolor='black', alpha=0.7)
plt.title(f'Гистограмма выборки ({nint} интервалов)')
plt.xlabel('Значения')
plt.ylabel('Частота')
plt.grid(True, alpha=0.3)
plt.text(0.02, 0.98, f'Интервалов: {nint}', transform=plt.gca().transAxes,
verticalalignment='top', bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))
plt.show()
histogram_result = [bin_edges, hist]
return histogram_result

@ -0,0 +1,126 @@
# Индивидуальное контрольное задание по модулю 3
Капитонов Михаил, А-02-23
## 1) Создайте модуль М1, содержащий две функции:
- функция 1: аргумент - список или кортеж SPS с элементами случайной выборки; функция должна создать новый список с рассчитанным по выборке вариационным рядом и рассчитать по нему еще один список со средним значением, медианой и оценкой стандартного отклонения; оба списка возвращаются в вызывающую программу;
- функция 2: аргумент - список или кортеж SPS с элементами случайной выборки и целочисленный параметр NINT; функция должна рассчитать по выборке гистограмму с NINT интервалами разбиения диапазона изменения случайной величины; гистограмма должна быть представлена графически на экране, а также возвращена в виде списка в вызывающую программу.
## 2) Создайте еще один модуль М2, в котором должны выполняться следующие операции:
- запрашивается имя текстового файла с выборкой, проверяется его наличие и при отсутствии - повторение запроса;
- выборка вводится из файла и записывается в объект-список;
- вызывается функция 1;
- у пользователя запрашивается число NINT интервалов в гистограмме; при нарушении неравенств 1<NINT<12 запрос повторяется;
- вызывается функция 2 с исходным списком и заданным числом интервалов;
- запрашивается имя бинарного файла для сохранения результатов расчета;
- списки с вариационным рядом, статистическими параметрами и гистограммой записываются в бинарный файл.
## 3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчета (вариационный ряд, параметры, список с гистограммой) на экране.
## 4) Проверьте программу с 2 файлами с исходными данными. В одном - выборка из 20 элементами, подчиняющимися нормальному распределению с математическим ожиданием -23 и дисперсией 100. В другом - выборка с 50 целочисленными случайными элементами из диапазона значений от -10 до +30.
```py
#Модуль М1
import matplotlib.pyplot as plt
import math
import statistics
def func1(sps):
variation_series = sorted(list(sps))
mean_val = statistics.mean(variation_series)
median_val = statistics.median(variation_series)
if len(variation_series) > 1:
std_val = statistics.stdev(variation_series)
else:
std_val = 0
params = [mean_val, median_val, std_val]
return variation_series, params
def func2(sps, nint):
data = list(sps)
min_val = min(data)
max_val = max(data)
interval_width = (max_val - min_val) / nint
bins = [min_val + i * interval_width for i in range(nint + 1)]
hist = []
bin_edges = []
for i in range(nint):
bin_start = bins[i]
bin_end = bins[i + 1]
if i == nint - 1:
count = sum(1 for x in data if bin_start <= x <= bin_end)
else:
count = sum(1 for x in data if bin_start <= x < bin_end)
hist.append(count)
bin_edges.append((bin_start, bin_end))
plt.figure(figsize=(10, 6))
plt.hist(data, bins=nint, edgecolor='black', alpha=0.7)
plt.title(f'Гистограмма выборки ({nint} интервалов)')
plt.xlabel('Значения')
plt.ylabel('Частота')
plt.grid(True, alpha=0.3)
plt.text(0.02, 0.98, f'Интервалов: {nint}', transform=plt.gca().transAxes,
verticalalignment='top', bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))
plt.show()
histogram_result = [bin_edges, hist]
return histogram_result
#Модуль М2
import os
import pickle
from M1 import func1, func2
def process_data():
while True:
filename = input("Введите имя файла с выборкой: ")
if os.path.exists(filename):
try:
with open(filename, 'r') as file:
data_str = file.read()
data_list = []
for item in data_str.replace(',', ' ').split():
try:
data_list.append(float(item))
if len(data_list) == 0:
print("Файл не содержит числовых данных. Попробуйте другой файл.")
continue
break
else:
print()
variation_series, params = func1(data_list)
while True:
try:
nint_input = input("\nВведите число интервалов для гистограммы (1 < NINT < 12): ")
nint = int(nint_input)
if 1 < nint < 12:
break
else:
print("Число интервалов должно быть больше 1 и меньше 12!")
print("\nСтроится гистограмма...")
histogram_result = func2(data_list, nint)
while True:
output_filename = input("\nВведите имя бинарного файла для сохранения результатов: ")
if not output_filename:
print("Имя файла не может быть пустым!")
continue
if not output_filename.endswith('.dat'):
output_filename += '.dat'
if os.path.exists(output_filename):
overwrite = input(f"Файл '{output_filename}' уже существует. Перезаписать? (да/нет): ")
if overwrite.lower() not in ['да', 'yes', 'y', 'д']:
continue
try:
results = {
'variation_series': variation_series,
'statistical_params': params,
'histogram': histogram_result,
'original_data': data_list,
'nint': nint
}
with open(output_filename, 'wb') as f:
pickle.dump(results, f)
break
return variation_series, params, histogram_result, data_list, nint, filename
```

@ -0,0 +1,55 @@
import os
import pickle
from M1 import func1, func2
def process_data():
while True:
filename = input("Введите имя файла с выборкой: ")
if os.path.exists(filename):
try:
with open(filename, 'r') as file:
data_str = file.read()
data_list = []
for item in data_str.replace(',', ' ').split():
try:
data_list.append(float(item))
if len(data_list) == 0:
print("Файл не содержит числовых данных. Попробуйте другой файл.")
continue
break
else:
print()
variation_series, params = func1(data_list)
while True:
try:
nint_input = input("\nВведите число интервалов для гистограммы (1 < NINT < 12): ")
nint = int(nint_input)
if 1 < nint < 12:
break
else:
print("Число интервалов должно быть больше 1 и меньше 12!")
print("\nСтроится гистограмма...")
histogram_result = func2(data_list, nint)
while True:
output_filename = input("\nВведите имя бинарного файла для сохранения результатов: ")
if not output_filename:
print("Имя файла не может быть пустым!")
continue
if not output_filename.endswith('.dat'):
output_filename += '.dat'
if os.path.exists(output_filename):
overwrite = input(f"Файл '{output_filename}' уже существует. Перезаписать? (да/нет): ")
if overwrite.lower() not in ['да', 'yes', 'y', 'д']:
continue
try:
results = {
'variation_series': variation_series,
'statistical_params': params,
'histogram': histogram_result,
'original_data': data_list,
'nint': nint
}
with open(output_filename, 'wb') as f:
pickle.dump(results, f)
break
return variation_series, params, histogram_result, data_list, nint, filename
Загрузка…
Отмена
Сохранить