форкнуто от main/python-labs
Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
190 строки
6.6 KiB
Markdown
190 строки
6.6 KiB
Markdown
# Тест по модулю 3
|
|
|
|
Савин Семён, А-02-23
|
|
|
|
## Задание
|
|
|
|
M3_14
|
|
1) Создайте модуль М1, содержащий две функции:
|
|
|
|
- функция 1: аргумент - список или кортеж с выборкой; функция должна произвести расчет по выборке списка с наименьшим и наибольшим значениями, размахом (разность наибольшего и наименьшего значений), оценкой стандартного отклонения и отношением размаха к стандартному отклонению;
|
|
|
|
- функция 2: аргументы - список или кортеж с выборкой и целочисленный параметр m; функция должна обратиться к функции 1 и затем определить границы m непересекающихся интервалов в диапазоне величины между наибольшим и наименьшим значениями по выборке, содержащих примерно одинаковое число элементов выборки; функция должна вернуть 2 списка: со значениями границ интервалов и с числами элементов в интервалах.
|
|
|
|
2) Создайте еще один модуль М2, в котором должны выполняться следующие операции:
|
|
|
|
- запрашивается имя текстового файла с выборкой, проверяется его наличие и при отсутствии - повторяется запрос;
|
|
|
|
- выборка вводится из файла и записывается в список (в строках файла может быть разное число значений, разделенных пробелами);
|
|
|
|
- запрашиваются у пользователя число интервалов разбиения;
|
|
|
|
- с помощью функций 1 и 2 производится определение границ интервалов и чисел элементов в них;
|
|
|
|
- отображается столбиковая диаграмма с интервалами и числами элементов выборки в них.
|
|
|
|
3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчета на экране.
|
|
|
|
4) Проведите расчеты при 2-х разных файлах с выборками
|
|
|
|
## Решение
|
|
|
|
Содержимое модуля module3M1.py - расчеты
|
|
|
|
```py
|
|
import math
|
|
|
|
def calc(sample):
|
|
minimum =min(sample)
|
|
maximum=max(sample)
|
|
print(minimum,maximum)
|
|
ran = maximum-minimum
|
|
|
|
n= len(sample)
|
|
mean = sum(sample)/n
|
|
sum1 = 0
|
|
for i in range(n):
|
|
sum1 = (sample[i]-mean)**2
|
|
std_dev = math.sqrt(1/n*sum1)
|
|
ratio = ran/std_dev if std_dev != 0 else 0
|
|
|
|
return {'min': minimum, 'max': maximum, 'range': ran, 'deviation': std_dev,'range to stddev': ratio, 'samplesize': n}
|
|
|
|
def intervals(sample,m):
|
|
stats =calc(sample)
|
|
|
|
minimum = stats['min']
|
|
maximum =stats['max']
|
|
|
|
sortedsam = sorted(sample)
|
|
n=len(sortedsam)
|
|
|
|
width =(maximum-minimum)/m
|
|
bounds = [minimum + i*width for i in range(m+1)]
|
|
|
|
c = [0]*m
|
|
s = 0
|
|
|
|
for i in range(m):
|
|
lower = bounds[i]
|
|
upper = bounds[i+1]
|
|
|
|
while s < n and sortedsam[s] <= upper:
|
|
if i ==m-1:
|
|
if sortedsam[s] >= lower:
|
|
c[i]+=1
|
|
else:
|
|
if lower <=sortedsam[s] < upper:
|
|
c[i]+=1
|
|
s +=1
|
|
|
|
return bounds, c
|
|
```
|
|
|
|
Содержимое модуля module3M2.py - чтение, вывод, обработка данных и передача в M1
|
|
|
|
```py
|
|
import os
|
|
import module3M1
|
|
|
|
def reader(filename):
|
|
sample = []
|
|
with open(filename, 'r', encoding = 'utf-8') as file:
|
|
for line in file:
|
|
vals = line.strip().split()
|
|
for val in vals:
|
|
sample.append(float(val))
|
|
return sample
|
|
|
|
def display(bounds,c):
|
|
maxcount =max(c)
|
|
|
|
for i,count in enumerate(c):
|
|
lowers = bounds[i]
|
|
uppers =bounds[i+1]
|
|
bar = '[|]'*int(count)
|
|
print(f'({lowers}, {uppers}) : {count} элементов | {bar}')
|
|
|
|
|
|
def process():
|
|
while True:
|
|
filename = input('Имя файла:')
|
|
if os.path.exists(filename):
|
|
break
|
|
print(f'Еще раз, {filename} неверное название')
|
|
|
|
sample = reader(filename)
|
|
|
|
while True:
|
|
m =int(input('Введите число разбиений'))
|
|
if m > 0:
|
|
break
|
|
else:
|
|
('Введите ненулевое целое значение')
|
|
|
|
stats =module3M1.calc(sample)
|
|
|
|
print('Максимум: ', stats['max'])
|
|
print('Минимум: ', stats['min'])
|
|
print('Размах: ', stats['range'])
|
|
print('СО: ', stats['deviation'])
|
|
print('Отношение размаха к отклоеннию: ', stats['range to stddev'])
|
|
bounds, c = module3M1.intervals(sample,m)
|
|
|
|
display(bounds,c)
|
|
```
|
|
|
|
Главные модуль вызова:
|
|
|
|
```py
|
|
import module3M2
|
|
|
|
def main():
|
|
|
|
print('Расчет 1')
|
|
module3M2.process()
|
|
|
|
print('\n' + '_+++++++++_')
|
|
print('\n Расчет 2')
|
|
module3M2.process()
|
|
```
|
|
|
|
Вывод в консоли:
|
|
|
|
```py
|
|
>>> main()
|
|
Расчет 1
|
|
Имя файла:mod3.txt
|
|
Введите число разбиений5
|
|
2.0 26.0
|
|
Максимум: 26.0
|
|
Минимум: 2.0
|
|
Размах: 24.0
|
|
СО: 3.0295336397000234
|
|
Отношение размаха к отклоеннию: 7.922011389969717
|
|
2.0 26.0
|
|
(2.0, 6.8) : 2 элементов | [|][|]
|
|
(6.8, 11.6) : 2 элементов | [|][|]
|
|
(11.6, 16.4) : 5 элементов | [|][|][|][|][|]
|
|
(16.4, 21.2) : 5 элементов | [|][|][|][|][|]
|
|
(21.2, 26.0) : 1 элементов | [|]
|
|
|
|
_+++++++++_
|
|
|
|
Расчет 2
|
|
Имя файла:mod31.txt
|
|
Введите число разбиений6
|
|
17.0 65.0
|
|
Максимум: 65.0
|
|
Минимум: 17.0
|
|
Размах: 48.0
|
|
СО: 2.8733473510872303
|
|
Отношение размаха к отклоеннию: 16.705254929181304
|
|
17.0 65.0
|
|
(17.0, 25.0) : 6 элементов | [|][|][|][|][|][|]
|
|
(25.0, 33.0) : 4 элементов | [|][|][|][|]
|
|
(33.0, 41.0) : 4 элементов | [|][|][|][|]
|
|
(41.0, 49.0) : 1 элементов | [|]
|
|
(49.0, 57.0) : 2 элементов | [|][|]
|
|
(57.0, 65.0) : 1 элементов | [|]
|
|
``` |