habrahabr

3 продвинутых функции на Python для анализа данных

  • вторник, 29 октября 2019 г. в 00:27:25
https://habr.com/ru/company/otus/blog/473422/
  • Блог компании OTUS. Онлайн-образование
  • Python
  • Программирование
  • Машинное обучение


Всего два дня остается до старта новой группы самого хардкорного курса от OTUS — «Разработчик Python». В преддверии старта курса делимся с вами еще одним полезным материалом.




Python – это весело. Несложно заново изобрести какую-либо встроенную функцию, о существовании которой вы не знаете, но зачем? Сегодня мы познакомимся с тремя функциями, которые теперь я использую практически каждый день, но о которых не знал большую часть своей карьеры в области анализа данных.

Несмотря на то, что они не сэкономят время работы программы (если вы понимаете в производительности хоть что-то), они сделают ваш код чище. Может быть для вас это звучит не так впечатляюще, но поверьте, в будущем вы будете благодарны.

Пару недель назад я опубликовал статью о некоторых важных навыках чистого Python. Она охватывает другие интересные встроенные функции, поэтому не поленитесь с ней ознакомиться.

Что ж, самое время перейти от слов к делу!

map()


map() – это встроенная функция Python, используемая для применения функции к последовательности элементов, таких как список или словарь. Она, наверное, является самым чистым и читаемым способом применить какую-либо операцию к вашим данным.

В примере, приведенном ниже, цель состоит в том, чтобы возвести в квадрат все числа из списка. Для начала функцию нужно объявить, затем я продемонстрирую, как вы сможете сделать ту же операцию с функцией map() и без нее, в стиле программирования на Python и без него.

nums = [1, 2, 3, 4, 5]
# эта функция будет вычислять квадрат числа
def square_num(x): 
    return x**2
# подход не в стиле Python
squares = []
for num in nums:
    squares.append(square_num(num))
 
print('Non-Pythonic Approach: ', squares)
# подход в стиле Python
x = map(square_num, nums)
print('Pythonic Approach: ', list(x))

Результат, по сути, будет одинаковым, но посмотрите, насколько чище выглядит подход к программированию в стиле Python. Заодно убирается необходимость использовать циклы.

zip()


zip() – одна из моих любимых функций. Она позволяет вам итерироваться по двум и более спискам одновременно. Она может очень помочь при работе с датами и временем.

Например, я каждый день использую ее в своей работе, когда у меня появляется атрибут, который представляет из себя время начала некоторого события, и второй атрибут, который представляет время окончания события. Для дальнейшего анализа почти всегда необходимо вычислить разницу во времени между ними, и zip() предоставляет самый простой сделать это.

В данном примере я создал два списка, содержащих числа, и задача состоит в том, чтобы просуммировать соответствующие элементы:

first = [1, 3, 8, 4, 9]
second = [2, 2, 7, 5, 8]
# Происходит проход по двум или более спискам одновременно
for x, y in zip(first, second):
    print(x + y)

Вот так чисто и просто.

filter()


Функция filter() очень похожа на функцию map(), она также применяет какую-либо функцию к определенной последовательности. Разница лишь в том, что filter() возвращает только элементы, значения которых подошли под условие, то есть были оценены как True.

В примере ниже я создал произвольный список из чисел и функцию, которая возвращает True, если число четное. Еще раз повторюсь, что я продемонстрирую как выполнить эту операцию в стиле Python и без него.

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Вернет true, если число четное
def even(x):
    return x % 2 == 0
# подход не в стиле Python
even_nums = []
for num in numbers:
    if even(num):
        even_nums.append(num)
 
print('Non-Pythonic Approach: ', even_nums)
# подход в стиле Python
even_n = filter(even, numbers)
print('Pythonic Approach: ', list(even_n))

И снова, в стиле Python код получается более читабельным. Поверьте, в будущем вы это оцените.

И напоследок…


Есть множество функций, подходящих на три приведенные, но я считаю, что именно эти очень часто применяются в анализе данных. Не забывайте о них и используйте, когда вы столкнетесь с какой-либо проблемой на работе или в учебе. Порой заново изобрести колесо легко, но в этом нет никакого смысла.