ответвлено от main/python-labs
Сравнить коммиты
10 Коммитов
f1e43207fc
...
main
| Автор | SHA1 | Дата | |
|---|---|---|---|
| e1d0599622 | |||
| e67b412977 | |||
| 69a9d61875 | |||
| 7c1552aa67 | |||
| b3bd732ba8 | |||
| 6053fbe787 | |||
| bdeb1c27f1 | |||
| f6ed84af3d | |||
| d8f5f5b631 | |||
| b643e0a0b2 |
42
TEMA8/16.md
Обычный файл
42
TEMA8/16.md
Обычный файл
@@ -0,0 +1,42 @@
|
|||||||
|
Разработайте функцию с 2 аргументами, которая для заданного словаря (аргумент функции) с любыми ключами и с числовыми значениями создаёт новый словарь с теми же ключами и со значениями, равными синусам от значений из входного словаря с заданным именами. Проверьте функцию на примере двух разных входных словарей.
|
||||||
|
Через модуль:
|
||||||
|
Модуль1
|
||||||
|
```py
|
||||||
|
import math
|
||||||
|
|
||||||
|
def f(a):
|
||||||
|
"""Функция f."""
|
||||||
|
result = {}
|
||||||
|
for k, v in a.items(): # Перебираем все пары ключ-значение
|
||||||
|
result[k] = math.sin(v)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def test():
|
||||||
|
"""Первая тестовая функция."""
|
||||||
|
print("Тест 1", f({'a': 0, 'b': 1.57, 'c': 3.14}))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
test()
|
||||||
|
print("mode1.py работает корректно")
|
||||||
|
```
|
||||||
|
Модуль2:
|
||||||
|
```py
|
||||||
|
from mode1 import f
|
||||||
|
|
||||||
|
def test2():
|
||||||
|
"""Вторая тестовая функция."""
|
||||||
|
print("Тест 2", f({'x': 0.5, 'y': 1.0, 'z': 2.0}))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
test2()
|
||||||
|
print("mode2.py работает корректно")
|
||||||
|
```
|
||||||
|
```py
|
||||||
|
>>> os.chdir('C:\\Users\\Admin\\Documents\\Tsvetkova\\python-labs\\TEMA8')
|
||||||
|
>>> import mode1
|
||||||
|
>>> import mode2
|
||||||
|
>>> mode1.test()
|
||||||
|
Тест 1 {'a': 0.0, 'b': 0.9999996829318346, 'c': 0.0015926529164868282}
|
||||||
|
>>> mode2.test2()
|
||||||
|
Тест 2 {'x': 0.479425538604203, 'y': 0.8414709848078965, 'z': 0.9092974268256817}
|
||||||
|
```
|
||||||
111
TEMA8/1819.md
Обычный файл
111
TEMA8/1819.md
Обычный файл
@@ -0,0 +1,111 @@
|
|||||||
|
16. Разработайте функцию с 2 аргументами, которая для заданного словаря (аргумент функции) с любыми ключами и с числовыми значениями создаёт новый словарь с теми же ключами и со значениями, равными синусам от значений из входного словаря, и записывает новый словарь в бинарный файл с заданным именем (аргумент функции). Проверьте функцию на примере двух разных входных словарей.
|
||||||
|
|
||||||
|
Модуль 1
|
||||||
|
```py
|
||||||
|
import math
|
||||||
|
import pickle
|
||||||
|
|
||||||
|
def slov_sin(input_dict, filename):
|
||||||
|
new_dict = {key: math.sin(value) for key, value in input_dict.items()}
|
||||||
|
with open(filename, 'wb') as f:
|
||||||
|
pickle.dump(new_dict, f)
|
||||||
|
print(f"Файл записан: {filename}")
|
||||||
|
return new_dict
|
||||||
|
|
||||||
|
def read_slov(filename):
|
||||||
|
try:
|
||||||
|
with open(filename, 'rb') as f:
|
||||||
|
loaded_dict = pickle.load(f)
|
||||||
|
print(f"Файл прочитан: {filename}")
|
||||||
|
return loaded_dict
|
||||||
|
|
||||||
|
|
||||||
|
def test1():
|
||||||
|
dict1 = {'a': 0, 'b': math.pi / 2, 'c': math.pi, 'd': 3 * math.pi / 2}
|
||||||
|
file1 = 'sin_values_1.bin'
|
||||||
|
|
||||||
|
saved = slov_sin(dict1, file1)
|
||||||
|
loaded = read_slov(file1)
|
||||||
|
|
||||||
|
print(f"Исходный: {dict1}")
|
||||||
|
print(f"Загруженный: {loaded}")
|
||||||
|
|
||||||
|
if saved == loaded:
|
||||||
|
print("OK")
|
||||||
|
else:
|
||||||
|
print("ERROR")
|
||||||
|
|
||||||
|
return loaded
|
||||||
|
|
||||||
|
def test2():
|
||||||
|
dict2 = {'x': 1.0, 'y': 2.0, 'z': -0.5}
|
||||||
|
file2 = 'sin_values_2.bin'
|
||||||
|
|
||||||
|
saved = slov_sin(dict2, file2)
|
||||||
|
loaded = read_slov(file2)
|
||||||
|
|
||||||
|
print(f"Исходный: {dict2}")
|
||||||
|
print(f"Загруженный: {loaded}")
|
||||||
|
|
||||||
|
if saved == loaded:
|
||||||
|
print("OK")
|
||||||
|
else:
|
||||||
|
print("ERROR")
|
||||||
|
|
||||||
|
return loaded
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print("Тесты запущены")
|
||||||
|
test1()
|
||||||
|
test2()
|
||||||
|
print("\n" + "="*60)
|
||||||
|
print("АВТОТЕСТЫ ЗАВЕРШЕНЫ")
|
||||||
|
print("="*60)
|
||||||
|
```
|
||||||
|
Модуль 2
|
||||||
|
```py
|
||||||
|
import slov_module
|
||||||
|
|
||||||
|
def run_tests():
|
||||||
|
"""Запустить все тесты"""
|
||||||
|
print("Тест 1:")
|
||||||
|
slov_module.test1()
|
||||||
|
|
||||||
|
print("\nТест 2:")
|
||||||
|
slov_module.test2()
|
||||||
|
|
||||||
|
print("\nТест 3 (свой):")
|
||||||
|
d = {'x': 0.5, 'y': 1.0, 'z': 2.0}
|
||||||
|
f = 'my_test.bin'
|
||||||
|
|
||||||
|
s = slov_module.slov_sin(d, f)
|
||||||
|
print(f"Исходный: {d}")
|
||||||
|
print(f"Синусы: {s}")
|
||||||
|
|
||||||
|
l = slov_module.read_slov(f)
|
||||||
|
print(f"Из файла: {l}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
run_tests()
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```py
|
||||||
|
|
||||||
|
>>> import slov_module
|
||||||
|
>>> import test_module
|
||||||
|
>>> slov_module.test1()
|
||||||
|
Файл записан: sin_values_1.bin
|
||||||
|
Файл прочитан: sin_values_1.bin
|
||||||
|
Исходный: {'a': 0, 'b': 1.5707963267948966, 'c': 3.141592653589793, 'd': 4.71238898038469}
|
||||||
|
Загруженный: {'a': 0.0, 'b': 1.0, 'c': 1.2246467991473532e-16, 'd': -1.0}
|
||||||
|
OK
|
||||||
|
{'a': 0.0, 'b': 1.0, 'c': 1.2246467991473532e-16, 'd': -1.0}
|
||||||
|
>>> slov_module.test2()
|
||||||
|
Файл записан: sin_values_2.bin
|
||||||
|
Файл прочитан: sin_values_2.bin
|
||||||
|
Исходный: {'x': 1.0, 'y': 2.0, 'z': -0.5}
|
||||||
|
Загруженный: {'x': 0.8414709848078965, 'y': 0.9092974268256817, 'z': -0.479425538604203}
|
||||||
|
OK
|
||||||
|
{'x': 0.8414709848078965, 'y': 0.9092974268256817, 'z': -0.479425538604203}
|
||||||
|
```
|
||||||
7
TEMA8/Modul1.py
Обычный файл
7
TEMA8/Modul1.py
Обычный файл
@@ -0,0 +1,7 @@
|
|||||||
|
def read (file):
|
||||||
|
""""Чтение данных из файла"""
|
||||||
|
nums = []
|
||||||
|
with open(file, 'r') as file: # Открытие файла для чтения
|
||||||
|
for line in file:
|
||||||
|
nums.extend(map(float, line.split())) # Добавление всех элементов в список
|
||||||
|
return nums
|
||||||
16
TEMA8/Modul2.py
Обычный файл
16
TEMA8/Modul2.py
Обычный файл
@@ -0,0 +1,16 @@
|
|||||||
|
def correlation(list1, list2):
|
||||||
|
"""Расчёт коэффициента корреляции"""
|
||||||
|
n = min(len(list1), len(list2)) # Общая длина
|
||||||
|
list1 = list1[:n]
|
||||||
|
list2 = list2[:n]
|
||||||
|
mean1 = sum(list1) / n
|
||||||
|
mean2 = sum(list2) / n
|
||||||
|
chislitel = sum((list1[i] - mean1) * (list2[i] - mean2) for i in range(n))
|
||||||
|
#Числитель формулы корреляции
|
||||||
|
znamenatel1 = sum((x - mean1) ** 2 for x in list1)
|
||||||
|
znamenatel2 = sum((y - mean2) ** 2 for y in list2)
|
||||||
|
|
||||||
|
if znamenatel1 == 0 or znamenatel2 == 0:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
return chislitel/(znamenatel1 * znamenatel2) ** 0.5
|
||||||
8
TEMA8/Modul3.py
Обычный файл
8
TEMA8/Modul3.py
Обычный файл
@@ -0,0 +1,8 @@
|
|||||||
|
import Modul1
|
||||||
|
import Modul2
|
||||||
|
file1 = input("Введите имя первого файла: ")
|
||||||
|
file2 = input("Введите имя второго файла: ")
|
||||||
|
list1 = Modul1.read(file1)
|
||||||
|
list2 = Modul1.read(file2)
|
||||||
|
corr = Modul2.correlation(list1, list2)
|
||||||
|
print("Коэффициент корреляции:", corr)
|
||||||
4
TEMA8/data1.txt
Обычный файл
4
TEMA8/data1.txt
Обычный файл
@@ -0,0 +1,4 @@
|
|||||||
|
1 2 3
|
||||||
|
4 5
|
||||||
|
6 7 8
|
||||||
|
9
|
||||||
3
TEMA8/data2.txt
Обычный файл
3
TEMA8/data2.txt
Обычный файл
@@ -0,0 +1,3 @@
|
|||||||
|
2 4 6
|
||||||
|
8
|
||||||
|
10 11
|
||||||
71
TEMA8/task.md
Обычный файл
71
TEMA8/task.md
Обычный файл
@@ -0,0 +1,71 @@
|
|||||||
|
# Общее контрольное задание по теме 8
|
||||||
|
|
||||||
|
|
||||||
|
# Задание:
|
||||||
|
1. Разработать программу, состоящую из трех модулей:
|
||||||
|
Модуль 1 содержит функцию считывания числового списка из текстового файла с заданным именем (аргумент функции – имя файла). Элементы в файле могут располагаться по несколько на строке с разделением пробелом. Числа элементов в строках могут быть разными. Полученный список должен возвращаться в вызывающую программу.
|
||||||
|
|
||||||
|
Модуль 2 содержит функцию расчета коэффициента корреляции по двум числовым спискам (аргументы функции – имена двух списков). Числа элементов в списках могут различаться. Значение коэффициента должно возвращаться в вызывающую программу.
|
||||||
|
|
||||||
|
Модуль 3 запрашивает у пользователя и вводит имена двух файлов с исходными данными, дважды вызывает функцию из модуля 1 и считывает два списка из двух текстовых файлов. Затем вызывает функцию расчета коэффициента корреляции с помощью функции из модуля 2 и отображает рассчитанное значение на экране с округлением до трех цифр после точки.
|
||||||
|
|
||||||
|
Подготовить два текстовых файла с числовыми данными и проверить по ним работу программы.
|
||||||
|
|
||||||
|
|
||||||
|
# Решение
|
||||||
|
|
||||||
|
## 1. Модуль 1 - Чтение данных из файла
|
||||||
|
```py
|
||||||
|
def read (file):
|
||||||
|
""""Чтение данных из файла"""
|
||||||
|
nums = []
|
||||||
|
with open(file, 'r') as file: # Открытие файла для чтения
|
||||||
|
for line in file:
|
||||||
|
nums.extend(map(float, line.split())) # Добавление всех элементов в список
|
||||||
|
return nums
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. Модуль 2 - Расчёт коэффициента корреляции
|
||||||
|
```py
|
||||||
|
def correlation(list1, list2):
|
||||||
|
"""Расчёт коэффициента корреляции"""
|
||||||
|
n = min(len(list1), len(list2)) # Общая длина
|
||||||
|
list1 = list1[:n]
|
||||||
|
list2 = list2[:n]
|
||||||
|
mean1 = sum(list1) / n
|
||||||
|
mean2 = sum(list2) / n
|
||||||
|
chislitel = sum((list1[i] - mean1) * (list2[i] - mean2) for i in range(n))
|
||||||
|
#Числитель формулы корреляции
|
||||||
|
znamenatel1 = sum((x - mean1) ** 2 for x in list1) # Знаменатель формулы корреляции
|
||||||
|
znamenatel2 = sum((y - mean2) ** 2 for y in list2)
|
||||||
|
|
||||||
|
if znamenatel1 == 0 or znamenatel2 == 0: # Проверка деления на 0
|
||||||
|
return 0
|
||||||
|
|
||||||
|
return chislitel/(znamenatel1 * znamenatel2) ** 0.5
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Модуль 3 - Запрос у пользователя и ввод имён файлов с исходными данными
|
||||||
|
```py
|
||||||
|
import Modul1
|
||||||
|
import Modul2
|
||||||
|
file1 = input("Введите имя первого файла: ")
|
||||||
|
file2 = input("Введите имя второго файла: ")
|
||||||
|
list1 = Modul1.read(file1)
|
||||||
|
list2 = Modul1.read(file2)
|
||||||
|
corr = Modul2.correlation(list1, list2)
|
||||||
|
print("Коэффициент корреляции:", corr)
|
||||||
|
```
|
||||||
|
|
||||||
|
Были подготовлены два файла с данными data1.txt и data2.txt
|
||||||
|
|
||||||
|
## 4. Тестирование
|
||||||
|
```py
|
||||||
|
>>> import Modul3
|
||||||
|
Введите имя первого файла: data1.txt
|
||||||
|
Введите имя второго файла: data2.txt
|
||||||
|
Коэффициент корреляции: 0.9960784162656539
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -320,3 +320,4 @@ y= 0.9260125207356777
|
|||||||
>>> pylab.show()
|
>>> pylab.show()
|
||||||
lin1
|
lin1
|
||||||
```
|
```
|
||||||
|

|
||||||
|
|||||||
Двоичные данные
TEMA9/Figure_1.png
Обычный файл
Двоичные данные
TEMA9/Figure_1.png
Обычный файл
Двоичный файл не отображается.
|
После Ширина: | Высота: | Размер: 15 KiB |
151
TEMA9/zadanie1.md
Обычный файл
151
TEMA9/zadanie1.md
Обычный файл
@@ -0,0 +1,151 @@
|
|||||||
|
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 бинарных файла: с выборками одинакового размера и с выборками разного размера. Проверьте программу с использованием этих файлов.
|
||||||
|
|
||||||
|
Модуль 1
|
||||||
|
```py
|
||||||
|
import math
|
||||||
|
def disp(s): # функция рассчета дисперсии
|
||||||
|
if len(s) == 0:
|
||||||
|
return [0, 0, 0]
|
||||||
|
sr = sum(s) / len(s)
|
||||||
|
v = sum((x - sr) ** 2 for x in s) / len(s) # среднее квадратов отклонений от среднего
|
||||||
|
m_n = min(s)
|
||||||
|
m_x = max(s)
|
||||||
|
|
||||||
|
return [v, m_n, m_x]
|
||||||
|
|
||||||
|
def fisher_stat(sample_x, sample_y): # статистика фишера
|
||||||
|
stats_x = disp(sample_x)
|
||||||
|
stats_y = disp(sample_y)
|
||||||
|
|
||||||
|
dx = stats_x[0] # дисп х
|
||||||
|
dy = stats_y[0] # дисп у
|
||||||
|
|
||||||
|
if dy == 0:
|
||||||
|
return 0, stats_x, stats_y
|
||||||
|
else:
|
||||||
|
f = dx / dy
|
||||||
|
return f, stats_x, stats_y
|
||||||
|
```
|
||||||
|
Модуль 2
|
||||||
|
```py
|
||||||
|
import pickle
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import M1
|
||||||
|
|
||||||
|
def load_samples(filename): #Загружаем выборки х и у
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
with open(filename, 'rb') as f:
|
||||||
|
data = pickle.load(f)
|
||||||
|
x = data['X']
|
||||||
|
y = data['Y']
|
||||||
|
print(f"Файл {filename} успешно загружен!")
|
||||||
|
return x, y
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(f"Файл {filename} не найден!")
|
||||||
|
filename = input("Введите имя файла снова: ")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Ошибка чтения файла: {e}")
|
||||||
|
filename = input("Введите имя файла снова: ")
|
||||||
|
|
||||||
|
def analysis():
|
||||||
|
x, y = load_samples(input("Введите имя бинарного файла: "))
|
||||||
|
f, stats_x, stats_y = M1.fisher_stat(x, y)
|
||||||
|
|
||||||
|
print("\nРЕЗУЛЬТАТЫ РАСЧЕТА:")
|
||||||
|
print(f"Размер выборки X: {len(x)}, Y: {len(y)}")
|
||||||
|
print(f"X: Дисперсия={stats_x[0]:.4f}, мин={stats_x[1]:.4f}, макс={stats_x[2]:.4f}")
|
||||||
|
print(f"Y: Дисперсия={stats_y[0]:.4f}, мин={stats_y[1]:.4f}, макс={stats_y[2]:.4f}")
|
||||||
|
print(f"Статистика Фишера F = {f:.4f}")
|
||||||
|
|
||||||
|
|
||||||
|
if len(x) == len(y): # График размеры одинаковые
|
||||||
|
plt.figure(figsize=(8, 6))
|
||||||
|
plt.scatter(x, y, alpha=0.7, color='blue')
|
||||||
|
plt.xlabel('X')
|
||||||
|
plt.ylabel('Y')
|
||||||
|
plt.title('Поле рассеивания X-Y')
|
||||||
|
plt.grid(True)
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
# Сохраняем в текстовый файл
|
||||||
|
with open('results.txt', 'w') as f: # Сохраняем в файл
|
||||||
|
f.write("РЕЗУЛЬТАТЫ СТАТИСТИЧЕСКОГО АНАЛИЗА\n")
|
||||||
|
f.write(f"Размер выборки X: {len(x)}\n")
|
||||||
|
f.write(f"Размер выборки Y: {len(y)}\n\n")
|
||||||
|
f.write(f"СТАТИСТИКИ ПО X:\n")
|
||||||
|
f.write(f" Дисперсия DX = {stats_x[0]:.6f}\n")
|
||||||
|
f.write(f" Минимум = {stats_x[1]:.6f}\n")
|
||||||
|
f.write(f" Максимум = {stats_x[2]:.6f}\n")
|
||||||
|
f.write(f"СТАТИСТИКИ ПО Y:\n")
|
||||||
|
f.write(f" Дисперсия DY = {stats_y[0]:.6f}\n")
|
||||||
|
f.write(f" Минимум = {stats_y[1]:.6f}\n")
|
||||||
|
f.write(f" Максимум = {stats_y[2]:.6f}\n")
|
||||||
|
f.write(f"СТАТИСТИКА ФИШЕРА:\n")
|
||||||
|
f.write(f" F = DX/DY = {f:.6f}\n")
|
||||||
|
|
||||||
|
print("Результаты сохранены в файл results.txt")
|
||||||
|
return f, stats_x, stats_y
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
analysis()
|
||||||
|
```
|
||||||
|
Модуль 0
|
||||||
|
```py
|
||||||
|
import M2
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
print("СТАТИСТИЧЕСКИЙ АНАЛИЗ")
|
||||||
|
results = M2.analysis() # Запускаем анализ
|
||||||
|
print("АНАЛИЗ ЗАВЕРШЕН!")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
```
|
||||||
|
|
||||||
|
```py
|
||||||
|
>>> import os
|
||||||
|
>>> os.chdir('C:\\Users\\Admin\\Documents\\Tsvetkova\\python-labs\\TEMA9')
|
||||||
|
>>> import M1
|
||||||
|
>>> import M2
|
||||||
|
>>> import M0
|
||||||
|
>>> M0.main()
|
||||||
|
СТАТИСТИЧЕСКИЙ АНАЛИЗ
|
||||||
|
Введите имя бинарного файла: same_size.bin
|
||||||
|
Файл same_size.bin успешно загружен!
|
||||||
|
|
||||||
|
РЕЗУЛЬТАТЫ РАСЧЕТА:
|
||||||
|
Размер выборки X: 20, Y: 20
|
||||||
|
X: Дисперсия=4.7969, мин=1.4282, макс=9.9043
|
||||||
|
Y: Дисперсия=3.2402, мин=2.1279, макс=7.5406
|
||||||
|
Статистика Фишера F = 1.4804
|
||||||
|
```
|
||||||
|

|
||||||
Ссылка в новой задаче
Block a user