Какие понимания есть в Python и почему они так полезны

Введение

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

Кроме того, понимание особенно важно для науки о данных. Конечно, всегда будут сценарии разработки программного обеспечения, в которых понимание приходит и оказывается удобным, и используются списки, но в области науки о данных гораздо более распространено применение операций ко всему диапазону данных. Мы могли бы думать об пониманиях как об обычном утверждении. Если бы мы установили значение, равное чему-то в обычном смысле, в данных ничего не изменилось бы, однако, если мы добавим операцию, мы приравняем данные к чему-то еще, прежде чем создавать их. Понимания имеют аналогичное применение, где они могут изменять или генерировать данные до утверждения. Это относится к структурам данных. Само собой разумеется, поскольку мы часто работаем со списками или сериями Pandas в Julia, понимание может быть очень сильным инструментом для науки о данных и разработки программного обеспечения в целом в Python.

"Блокнот"

Различные типы понимания

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

Список понятий

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

def define_list(x : int):
    lst = []
    for i in range(1, 50):
        lst.append(x * i)
    return(lst)

В этом случае нужно проделать гораздо больше работы только потому, что мы не использовали включения. Прежде всего, если мы хотим, чтобы наше окончательное значение было общедоступным для функции, нам нужно будет определить его до запуска цикла for. Это связано с тем, что каждый итеративный цикл устанавливает новую частную область внутри функции, поэтому мы также не можем получить доступ к «i» после выхода из этого цикла for. Здесь мы тратим впустую все виды строк вдобавок к замедлению алгоритма с помощью метода append(), а не просто с помощью понимания списка. Мы могли бы сократить всю эту функцию до одной строки, за исключением оператора возврата и определения, используя здесь простое понимание списка. Мы делаем понимание списка, используя стандартные разделители массивов, [ и ], и вкладываем в него какую-то шаблонную или итеративную логику. В предыдущем примере они выглядят примерно так:

def def_list2(x: int):
    return([x * i for i in range(1, 50)])

Излишне говорить, что это намного более лаконично. Более того, код также получает повышение производительности, так что на самом деле нет веских причин не использовать включения. Включения также обеспечивают возврат, то есть мы можем установить что-то равное ему, и это значение станет списком, который мы напишем для создания включения.

Диктовки

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

input = [5, 10, 15, 20]
{x:x ** 3 for x in input if x % 2 != 0}

Приложения понимания в науке о данных

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

import pandas as pd
df = pd.DataFrame({"A" : [5, 10, 15, 20], "B" : [5, 10, 15, 20]})
mask = df["A"] > 5
mask
newdf = df[mask]

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

df = pd.DataFrame({"height (cm)" : [182, 125, 102, 190, 140, 150], "sex" : ['m', 'f', 'f', 'm', 'f', 'm']})

Мы хотели провести t-критерий Стьюдента, чтобы выяснить, оказывает ли пол человека статистически значимое влияние на его рост. Мы могли бы использовать понимание, чтобы отделить самцов от самок и сравнить их с популяцией.

from scipy.stats import ttest_ind
male_mask = df["sex"] == 'm'
female_mask = df["sex"] == 'f'
male_df = df[male_mask]
female_df = df[female_mask]
ttest_ind(df["height (cm)"], female_df["height (cm)"])
Ttest_indResult(statistic=1.2115133507714908, pvalue=0.26500459971996915)

Еще одним отличным приложением для понимания является разработка функций. Часто в науке о данных функции не совсем такие, какими мы хотим их видеть. Иногда мы хотим предсказать с помощью или на основе вещей, которых нет в данных, но которые могут быть созданы с использованием данных. Для этого очень хорошо подходят включения, поскольку они обеспечивают адекватную отдачу и могут быть очень легко построены из других списков, таких как другие функции внутри фрейма данных. Мы попробуем это, разработав новую функцию на другом фрейме данных. Хотя эта функция будет бесполезна, она станет хорошей демонстрацией того, как тот же метод можно применить к гораздо более полезному экземпляру.

df["height (in)"] = [x * 0.393701 for x in df["height (cm)"]]

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

Выводы

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

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