python

Проблема

Если вы когда-либо «гуглили» одни и теже вопросы, термины или синтаксис снова и снова, знайте — вы не одиноки.

Я делаю это постоянно! Это нормально, если вы постоянно заглядываете на StackOverflow или на другие ресурсы в поисках ответов на ваши вопросы. Однако это замедляет ваш рабочий процесс и ставит знак вопроса относительно вашего полного понимания языка. Сегодня, у нас есть бесконечное множество свободных и доступных источников информации, найти которые мы можем по одному запросу в поисковике — в любое удобное для нас время. Однако данное явление может стать как благословением, так и проклятием. Иногда мы просто не в состоянии эффективно обрабатывать большие объемы информации. Кроме того, ежеминутно обращаясь к различным информационным ресурсам, мы начинаем зависеть от них — что в долгосрочной перспективе может стать очень плохой привычкой.
Однажды, я заметил за собой одну особенность: на протяжении определенного времени, я несколько раз просто копировал фрагменты кода с различных тематических форумов, вместо того чтобы заняться изучением и закреплением на практике некоторых концепций в языке, чтобы в будущем подобных проблем у меня не возникло. Такой подход я называю ленивым подходом. Конечно, в краткосрочной перспективе это сэкономит вам определенное количество времени, однако в конечном итоге вы станете менее продуктивным и это немало навредит вашему профессиональному и карьерному росту.

Цель

Не так давно я начал изучать онлайн-курс на Udemy под названиями «Python for Data Science and Machine Learning» («О я говорю как этот парень с Youtube»). На первых занятиях мне напомнили некоторые концепции и синтаксис, которые я постоянно упускаю из виду при выполнении анализа данных на Python. Для того чтобы закрепить в памяти изученный материал и немного упростить вам жизнь и сэкономить время — я написал эту статью. В ней мы рассмотрим несколько концепций, которые многие из нас забывают при работе с Python, NumPy и Pandas. Для каждой концепции я написал краткое описание и примеры. Для лучшего усвоения, я добавил ссылки на видео-уроки и другие ресурсы, которые также помогут вам в изучении каждой концепции.

Понимание однострочных списков

Писать цикл for каждый раз, когда вам нужно определить какой-то список — утомительно. К счастью, Python может решить эту проблему одной строчкой кода. Синтаксис может показаться вам немного сложным для понимания, но как только вы познакомитесь с ним и научитесь применять его на практике- вы будете использовать его довольно часто.
Source: Trey Hunner
Посмотрите на примеры выше и ниже. Здесь вы увидите, как мы обычно понимаем списки в Python с помощью цикла for против создания списка с помощью одной единственной строчки кода, о чем я и говорил.
x = [1,2,3,4]
out = []
for item in x:
    out.append(item**2)
print(out)
[1, 4, 9, 16]
# vs.
x = [1,2,3,4]
out = [item**2 for item in x]
print(out)
[1, 4, 9, 16]

Lambda — функции

Вы когда-нибудь уставали от создания функции после функции ограниченного использования? Если да, то Lambda придет к вам на помощь! Лямбда-функции используются для создания небольших, одноразовых и анонимных объектов функций в Python. Они позволяют создавать функции без создания функции. Основной синтаксис Lambda- функции:
lambda arguments: expression
Обратите ваше внимание на то, что Lambda- функции могут выполнять все то же самое, что и обычные функции, если есть только одно выражение. Ознакомьтесь с простым примером ниже, и видео, которое будет далее, для того чтобы лучше разобраться с функцией Lambda и познать всю ее мощь:
double = lambda x: x * 2
print(double(5))
10

Map и Filter

Как только вы полностью разберетесь с Lambda- функциями, изучите возможность их сопряжения с функциями map и filter — в дальнейшем это может стать мощным инструментом для вас. В частности, map берет список и преобразует его в новый список, выполняя определенные операции над каждым элементом. В примере ниже она проходит через каждый элемент и выводит результат в новый список. Обратите внимание: функция list просто преобразует вывод в список.
# Map
seq = [1, 2, 3, 4, 5]
result = list(map(lambda var: var*2, seq))
print(result)
[2, 4, 6, 8, 10]
Функция Filter принимает список и правило фильтрации, подобно функции map, однако возвращает подмножество исходного списка, сравнивая каждый элемент с логическим правилом фильтрации.
# Filter
seq = [1, 2, 3, 4, 5]
result = list(filter(lambda x: x > 2, seq))
print(result)
[3, 4, 5]

Arange и Linspace

Для создания быстрых и простых массивов в NumPy используйте функции arange и linspace. Каждая из этих функций имеет свое специфическое предназначение, но они привлекательны (в отличии от использования диапазона) тем что они выводят массивы NumPy, с которыми зачастую, в дальнейшем, намного проще работать. Arange возвращает равномерно расположенные значения в пределах заданного интервала. Наряду с начальной и конечной точкой вы также можете определить размер шага или тип данных, если это необходимо. Обратите внимание на то, что конечная точка интервала значится как ‘cut-off’, поэтому она не будет включена в выходные данные массива.
# np.arange(start, stop, step)
np.arange(3, 7, 2)
array([3, 5])
Linspace очень похож на функцию Arange. Функция Linspace возвращает равномерно расположенные числа за указанный интервал, при этом учитывая начальную и конечную точку интервала и ряд других данных — все это linspace равномерно распределит в массиве NumPy. Это особенно полезно для визуализации данных и при построении осей графика.
# np.linspace(start, stop, num)
np.linspace(2.0, 3.0, num=5)
array([ 2.0,  2.25,  2.5,  2.75, 3.0])

Что на самом деле обозначает ось?

Вы наверняка сталкивались с этим, когда удаляли столбец в Pandas или складывали значения в матрице NumPy. Если же не сталкивались, готовьтесь к тому, что этот момент обязательно наступит. Сейчас мы рассмотрим эту проблему на примере удаления столбца:
df.drop('Column A', axis=1)
df.drop('Row A', axis=0)
Уже и не помню, сколько раз я писал эти строки кода, прежде чем понял, для чего я прописывал значения осям. Как вы можете догадаться, исходя из вышеприведенного кода, установив значение на 1, вы получите столбцы, а значение 0 дает строки. Но почему именно так? Вот мое мнение на этот счет:
df.shape
(# of Rows, # of Columns)
Вызов атрибута shape из датафрейма Pandas возвращает нам tuple (кортеж) с первым значением, обозначающим число строк, и вторым значением, обозначающим количество столбцов. Вы можете спросить: «Как это индексируется в Python?». Так вот, строки находятся в 0, а столбцы в 1, так же, как и при значении оси.

Функция Concat, Merge и Join

Если вы знакомы с SQL, то вам будет намного проще разобраться с этим функциями. А если не знакомы, достаточно знать, что эти функции объединяют датафреймы конкретными методами. Но бывает достаточно тяжело отследить, в какое время и при каких обстоятельствах использовать эти функции. Не бойтесь, я вам в этом помогу. Функция Concat позволяет пользователю добавлять один или несколько датафреймов друг к другу, либо в столбец, либо друг за другом в ряд(в зависимости от того, как вы определяете ось).
Функция Merge объединяет несколько датафреймов в определенных, общих столбцах, которые служат в качестве первичного ключа.
Функция Join, подобно Merge, объединяет два датафрейма. Однако она объединяет их на основе индексов, а не общего столбца.
Для более полного понимания, ознакомьтесь с документацией Pandas. Узнайте больше про особый синтаксис, а также прочтите про специальные случаи, с которыми вам скорее всего придется столкнуться.

Использование Apply в Pandas

Apply это что-то вроде map функции, но в датафреймах Pandas или скорее в Series. Если вы не знаете, Series во многом очень схож с массивами NumPy. Apply передает функцию каждому элементу вдоль столбца или строки, в зависимости от того, что вы задали. Вы даже не можете себе представить, насколько это полезно, особенно для форматирования и обработки значений по всему столбцу датафреймов, без необходимости в циклах.

Сводные таблицы

Последним, но не менее важным пунктом стоят сводные таблицы. Если вы знакомы с Microsoft Excel, то вы, с вероятностью в 100%, слышали о сводных таблицах. Встроенная функция pivot_table в Pandas создает сводную электронную таблицу в виде датафрейма. Обратите внимание, что уровни в сводной таблице хранятся в виде мультииндексовых объектов.

Заключение

Вот и все, что я хотел вам рассказать. Я надеюсь, что эта статья помогла вам понять или может быть освежить в памяти важные, но в некоторых моментах сложные методы, функции и концепции, с которыми вы часто сталкиваетесь при использовании Python в работе с данными. По личному опыту могу сказать, что даже само написание этой статьи помог мне во многом разобраться. Перевод статьи Conor DeweyPython for Data Science: 8 Concepts You May Have Forgotten