форкнуто от main/python-labs
Родитель
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
|
||||
Загрузка…
Ссылка в новой задаче