На этом шаге мы приведем решение сформулированной в конце предыдущего шага задачи.
Попробуем решить сформулированную в конце предыдущего шага задачу на основе данных о зарплате Алисы, Боба и Тима. Похоже, что у Боба последние три года самая высокая зарплата из наших троих друзей. Но приносит ли он домой действительно больше всех денег с учетом индивидуальных ставок налогообложения? Посмотрим на пример 3.4.
## Зависимости import numpy as np ## Данные: годовые зарплаты в тысячах долларов (за 2017, 2018 и 2019 гг.) alice = [99, 101, 103] bob = [110, 108, 105] tim = [90, 88, 85] salaries = np.array([alice, bob, tim]) taxation = np.array([[0.2, 0.25, 0.22], [0.4, 0.5, 0.5], [0.1, 0.2, 0.1]]) ## Однострочник max_income = np.max(salaries - salaries * taxation) ## Результат print(max_income)
Попробуйте догадаться: каковы будут результаты выполнения этого кода?
После импорта библиотеки NumPy мы помещаем данные в двумерный массив NumPy, содержащий три строки (по одной строке для каждого человека: Алисы, Боба и Тима) и три столбца (по одному столбцу для каждого года: 2017, 2018 и 2019). У нас два двумерных массива:
Для вычисления чистого дохода необходимо вычесть налоги (в долларах) из валового дохода, хранящегося в массиве salaries. Для этого мы воспользуемся перегруженными операторами NumPy - и *, выполняющими поэлементные вычисления с массивами NumPy.
Поэлементное произведение двух многомерных массивов называется произведением Адамара.
Пример 3.5 демонстрирует, как выглядит массив NumPy после вычитания налогов из валового дохода.
print(salaries - salaries * taxation) # [[79.2 75.75 80.34] # [66. 54. 52.5 ] # [81. 70.4 76.5 ]]
Как видим из второй строки, высокий доход Боба существенно снизился после уплаты 40 и 50% налогов.
Предыдущий фрагмент кода выводит максимальное значение этого итогового массива. Функция np.max() просто находит в массиве максимальное значение, которое мы затем сохраняем в переменной max_income. Максимальным значением оказывается доход Тима, равный 90 000 долларов в 2017 году, облагаемый налогом всего 10% - результат выполнения однострочника равен 81. (опять же, точка в конце указывает на тип данных float).
С помощью простейших поэлементных арифметических операций над массивами NumPy мы проанализировали ставки налогов группы людей. Воспользуемся тем же набором данных для демонстрации более сложных понятий NumPy: срезов и транслирования.
На следующем шаге мы рассмотрим срезы, транслирование и типы массивов.