diff --git a/conditions/sem02/lesson07/images/task1_expected.png b/conditions/sem02/lesson07/images/task1_expected.png new file mode 100644 index 00000000..b7696dab Binary files /dev/null and b/conditions/sem02/lesson07/images/task1_expected.png differ diff --git a/conditions/sem02/lesson07/images/task2_expected.png b/conditions/sem02/lesson07/images/task2_expected.png new file mode 100644 index 00000000..81b13b82 Binary files /dev/null and b/conditions/sem02/lesson07/images/task2_expected.png differ diff --git a/conditions/sem02/lesson07/tasks.md b/conditions/sem02/lesson07/tasks.md new file mode 100644 index 00000000..319fdc38 --- /dev/null +++ b/conditions/sem02/lesson07/tasks.md @@ -0,0 +1,51 @@ +## Задача 1. Распределения на любой вкус + +Реализуйте функцию `visualize_diagrams`, которая позволяет построить диаграмму рассеяния данных и распределения данных вдоль координатных осей. + +Допишите код функции `visualize_diagrams` в файле [task1](../../../solutions/sem02/lesson07/task1.py). + +**Входные данные**: +- `abscissa` - одномерный `np.ndarray` чисел с плавающей точкой - абсциссы визуализируемых точек. +- `ordinates` - одномерный `np.ndarray` чисел с плавающей точкой - ординаты визуализируемых точек. +- `diagram_type` - строка, тип визуализации распределения данных вдоль осей. `diagram_type` должен принимать одно из трех значений: `hist` - в этом случае распределение строится в виде гистограммы, `violin` в этом случае распределение строится в виде скрипичной диаграммы, `box` - в этом случае распределение строится в виде ящика с усами. + +**Сторонние эффекты**: +- После выполнения функции на экране должно отображаться изображение с визуализацией, похожей на визуализацию из последнего примера с семинара (добавьте что-то от себя, например, поменяйте цвет или оформление): + +![expected-result](./images/task1_expected.png) +- Если размеры массивов `abscissa` и `ordinates` не равны, необходимо возбудить исключение `ShapeMismatchError`. +- Если значение `diagram_type` не является допустимым значением, необходимо возбудить `ValueError`. + +## Задача 2. Сердечная задача + +Представим, что вы работаете аналитиком данных в некоторой медицинской компании, которая занимается изготовлением кардио-имплантов. В данный момент кампания планирует запустить в серийное производство новый кардио-имплант, устанавливаемый при митральной недостаточности (неправильное функционирование митрального клапана сердца, при котором возникает обратное движение крови из левого желудочка в левое предсердие во время сокращения желудочков сердца вследствие неполного смыкания створок клапана). Прежде, чем запускать новую разработку в серийное производство было произведено исследования эффективности импланта. Исследование происходило следующим образом: +- У пациентов, принимающих участие в исследовании, фиксировалась текущая степень митральной недостаточности. Всего степеней митральное недостаточности 4: первая степень - самая легкая, четвертая - самая опасная. +- Затем участникам исследования устанавливался кардио-имплант. +- Спустя некоторое время повторно определялась степень митральной недостаточности. + +Данные о степенях митральной недостаточности пациентов до и после установки импланта были записаны в файл [`medic_data.json`](../../../solutions/sem02/lesson07/data/medic_data.json) в следующем формате: +```python +{ + "before": [ + "I", + "II", + ... + ], + "after": [ + "I", + "II", + ... + ] +} +``` + +Ключу `"before"` соответствует список со степенями митральной недостаточности пациентов до установки импланта, а ключу `"after"` - после. Сами степени записаны в виде строковых литералов, которые стоит интерпретировать, как числа, записанные латинскими цифрами. + +Ваша задача - реализовать функционал для визуализации распределения пациентов по степеням митральной недостаточности до и после установки импланта. Для этого вам необходимо прочитать данные из файла [`medic_data.json`](../../../solutions/sem02/lesson07/data/medic_data.json), рассчитать число пациентов для каждой группы митральной недостаточности, построить столбчатые диаграммы, сохранить изображение с диаграммами в память компьютера. + +В результате выполнения приведенной последовательности действий вы должны получить картинку, похожую на эту (добавьте что-то от себя, например, поменяйте цвет или оформление): +![expected-result](./images/task2_expected.png) + +Напишите код в файле [task2](../../../solutions/sem02/lesson07/task2.py). + +Проанализируйте, полученную вами диаграмму. Какой вывод об эффективности импланта можно сделать, если стадия I самая безопасная, а стадия IV - самая опасная? diff --git a/tests/test_lesson05_tasks.py b/deprecated_tests/sem02/tests/task5/test_lesson05_tasks.py similarity index 100% rename from tests/test_lesson05_tasks.py rename to deprecated_tests/sem02/tests/task5/test_lesson05_tasks.py diff --git a/tests/test_data/lesson05/Vj_data.npy b/deprecated_tests/sem02/tests/test_data/lesson05/Vj_data.npy similarity index 100% rename from tests/test_data/lesson05/Vj_data.npy rename to deprecated_tests/sem02/tests/test_data/lesson05/Vj_data.npy diff --git a/tests/test_data/lesson05/Vs_data.npy b/deprecated_tests/sem02/tests/test_data/lesson05/Vs_data.npy similarity index 100% rename from tests/test_data/lesson05/Vs_data.npy rename to deprecated_tests/sem02/tests/test_data/lesson05/Vs_data.npy diff --git a/tests/test_data/lesson05/diag_A_data.npy b/deprecated_tests/sem02/tests/test_data/lesson05/diag_A_data.npy similarity index 100% rename from tests/test_data/lesson05/diag_A_data.npy rename to deprecated_tests/sem02/tests/test_data/lesson05/diag_A_data.npy diff --git a/tests/test_data/lesson05/y_data.npy b/deprecated_tests/sem02/tests/test_data/lesson05/y_data.npy similarity index 100% rename from tests/test_data/lesson05/y_data.npy rename to deprecated_tests/sem02/tests/test_data/lesson05/y_data.npy diff --git a/solutions/sem02/lesson07/data/medic_data.json b/solutions/sem02/lesson07/data/medic_data.json new file mode 100644 index 00000000..ab77636f --- /dev/null +++ b/solutions/sem02/lesson07/data/medic_data.json @@ -0,0 +1,406 @@ +{ + "before": [ + "III", + "II", + "I", + "II", + "II", + "III", + "III", + "III", + "II", + "II", + "III", + "III", + "II", + "II", + "III", + "III", + "II", + "III", + "III", + "I", + "II", + "III", + "I", + "III", + "II", + "III", + "I", + "IV", + "II", + "IV", + "III", + "II", + "III", + "II", + "II", + "IV", + "II", + "II", + "II", + "IV", + "III", + "III", + "III", + "II", + "II", + "II", + "III", + "III", + "II", + "II", + "II", + "I", + "III", + "IV", + "IV", + "III", + "II", + "II", + "II", + "I", + "II", + "III", + "II", + "III", + "III", + "III", + "III", + "IV", + "II", + "II", + "IV", + "IV", + "III", + "II", + "III", + "III", + "II", + "II", + "II", + "IV", + "II", + "III", + "II", + "III", + "II", + "II", + "II", + "III", + "III", + "III", + "II", + "III", + "II", + "III", + "II", + "II", + "III", + "IV", + "I", + "I", + "III", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "III", + "II", + "II", + "II", + "I", + "II", + "IV", + "II", + "I", + "II", + "III", + "III", + "III", + "III", + "III", + "III", + "II", + "III", + "II", + "III", + "I", + "II", + "II", + "III", + "II", + "II", + "IV", + "II", + "III", + "I", + "III", + "I", + "III", + "III", + "II", + "II", + "III", + "III", + "IV", + "II", + "III", + "II", + "IV", + "II", + "I", + "II", + "II", + "IV", + "II", + "IV", + "III", + "IV", + "I", + "III", + "I", + "III", + "III", + "III", + "II", + "III", + "II", + "II", + "IV", + "II", + "II", + "I", + "II", + "II", + "III", + "II", + "III", + "II", + "II", + "II", + "II", + "II", + "III", + "III", + "II", + "II", + "II", + "IV", + "II", + "I", + "II", + "II", + "II", + "III", + "III", + "III" + ], + "after": [ + "I", + "II", + "II", + "II", + "I", + "I", + "II", + "IV", + "II", + "II", + "II", + "I", + "II", + "III", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "I", + "III", + "II", + "II", + "II", + "II", + "III", + "II", + "II", + "III", + "III", + "II", + "III", + "IV", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "IV", + "I", + "II", + "II", + "IV", + "I", + "III", + "I", + "IV", + "II", + "II", + "II", + "II", + "I", + "II", + "III", + "I", + "III", + "II", + "II", + "II", + "II", + "II", + "II", + "I", + "II", + "II", + "I", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "I", + "I", + "II", + "II", + "II", + "II", + "II", + "I", + "II", + "III", + "II", + "II", + "II", + "II", + "III", + "II", + "II", + "III", + "II", + "III", + "II", + "II", + "III", + "II", + "II", + "I", + "I", + "II", + "II", + "II", + "III", + "II", + "I", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "I", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "I", + "II", + "II", + "II", + "II", + "IV", + "III", + "II", + "II", + "III", + "II", + "II", + "IV", + "II", + "I", + "IV", + "III", + "II", + "III", + "II", + "I", + "I", + "II", + "II", + "II", + "III", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "III", + "II", + "II", + "II", + "III", + "I", + "II", + "II", + "I", + "II", + "II", + "II", + "IV", + "I", + "I", + "III", + "I", + "II", + "II", + "II", + "II", + "II", + "II", + "II", + "I" + ] +} \ No newline at end of file diff --git a/solutions/sem02/lesson07/task1.py b/solutions/sem02/lesson07/task1.py new file mode 100644 index 00000000..3a505d89 --- /dev/null +++ b/solutions/sem02/lesson07/task1.py @@ -0,0 +1,28 @@ +from typing import Any + +import matplotlib.pyplot as plt +import numpy as np + + +class ShapeMismatchError(Exception): + pass + + +def visualize_diagrams( + abscissa: np.ndarray, + ordinates: np.ndarray, + diagram_type: Any, +) -> None: + # ваш код + pass + + +if __name__ == "__main__": + mean = [2, 3] + cov = [[1, 1], [1, 2]] + space = 0.2 + + abscissa, ordinates = np.random.multivariate_normal(mean, cov, size=1000).T + + visualize_diagrams(abscissa, ordinates, "hist") + plt.show() diff --git a/solutions/sem02/lesson07/task2.py b/solutions/sem02/lesson07/task2.py new file mode 100644 index 00000000..decd607e --- /dev/null +++ b/solutions/sem02/lesson07/task2.py @@ -0,0 +1 @@ +# ваш код (используйте функции или классы для решения данной задачи)