{"id":14277,"url":"\/distributions\/14277\/click?bit=1&hash=17ce698c744183890278e5e72fb5473eaa8dd0a28fac1d357bd91d8537b18c22","title":"\u041e\u0446\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0442\u0440\u044b \u0431\u0435\u043d\u0437\u0438\u043d\u0430 \u0438\u043b\u0438 \u0437\u043e\u043b\u043e\u0442\u044b\u0435 \u0443\u043a\u0440\u0430\u0448\u0435\u043d\u0438\u044f","buttonText":"\u041a\u0430\u043a?","imageUuid":"771ad34a-9f50-5b0b-bc84-204d36a20025"}

5 признаков того, что вы стали продвинутым пользователем Pandas, даже не осознавая этого

Введение

Ловите ли вы себя на мысли о том, что мечтаете о фреймах и сериях данных Pandas? Проводите ли вы часы подряд, выполняя сложные манипуляции и агрегации, едва замечая боль в спине и всё время думая: “как же это интересно”?

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

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

0. Знайте, когда нужно отказаться от Pandas

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

Однако с опытом вы придёте к пониманию того, что у Pandas много недостатков. Вместо того, чтобы слепо использовать его для решения любой задачи, связанной с данными, вы знаете, как сделать шаг назад и спросить себя: “Является ли Pandas лучшим вариантом в решении данной проблемы?”

Есть несколько сценариев, в которых ответом на этот вопрос будет большое "НЕТ". К ним относятся обработка данных в реальном времени, обработка массивных наборов данных, высокопроизводительные вычисления и конвейеры данных производственного уровня.

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

Мягко говоря, Pandas задохнутся бы от такого уровня обработки данных. Вместо этого вам следует использовать библиотеки вроде Apache Kafka.

2) Когда дело доходит до массивных наборов данных, у Уэса Маккинни, создателя Pandas, было эмпирическое правило:

Объём оперативной памяти должен в 5-10 раз превышать размер набора данных, чтобы Pandas работал оптимально.

“Достаточно просто”, - сказали бы вы, если бы это был 2013 год, но сегодняшние наборы данных, как правило, легко нарушают это правило.

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

4) Что касается конвейеров данных производственного уровня, думайте о них как о системе водоснабжения. Точно так же, как системы водоснабжения должны быть надежными, масштабируемыми и ремонтопригодными для обеспечения постоянной подачи чистой воды, конвейеры передачи данных нуждаются в аналогичных качествах. Хотя Pandas может позаботиться об очистке и преобразовании, для остального следует использовать другие библиотеки.

Может быть трудно покинуть пушистые объятия Pandas, но не чувствуйте себя виноватым, изучая другие варианты, если это необходимо.

Лично я недавно заинтересовался Polars, библиотекой, написанной на Rust, которая была разработана с нуля, чтобы учесть все ограничения Pandas.

Вы также можете комбинировать такие библиотеки, как datatable. Вот фрагмент кода, который я часто использую для загрузки больших CSV-файлов за доли секунды и выполнения своих анализов в Pandas:

import datatable as dt df = dt.fread("my_large_file.csv").to_pandas()

1. Потребность в скорости

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

Например, вы знакомы с различиями между такими итерационными функциями, как apply, applymap, map, iterrows и itertuples. Вы также знаете о компромиссах между использованием более медленной альтернативы для улучшения функциональности и использованием лучшей для оптимальной скорости.

Хотя некоторые люди могут назвать вас привередливым, вы осторожно используете iloc и loc, потому что знаете, что это iloc быстрее для индексации строк, а loc быстрее для столбцов.

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

# DataFrame of stock prices stocks_df = pd.DataFrame( columns=['date', 'company', 'price', 'volume'] ) threshold = 1e5 # Rows where the average volume for a company # is greater than some threshold result = df.query( '(volume.groupby(company).transform("mean") > @threshold)' )

И вы также знаете, что функция replace лучше всего подходит для замены значений query.

df.query('category == "electronics"').replace( {"category": {"electronics": "electronics_new"}}, inplace=True )

Кроме того, вам комфортно работать с различными форматами файлов, такими как CSV, Parquets, Feathers и HDFS, и вы сознательно выбираете между ними, вместо того, чтобы слепо заливать всё в старые добрые CSV. Вы знаете, что правильный выбор формата может помочь сэкономить часы и ресурсы памяти в будущем.

Помимо форматов файлов, у вас также есть мощный трюк в рукаве — векторизация!

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

Более того, вы предпочитаете использовать базовые массивы NumPy с атрибутом .values вместо Pandas Series, потому что вы из первых рук убедились, что векторизация с массивами NumPy происходит намного быстрее.

Когда всё остальное терпит неудачу, вы не ставите точку и не сдаётесь. Нет...

Вы обращаетесь к Cython или Numba для действительно трудоёмких задач, потому что вы профессионал. В то время как большинство людей изучали основы Pandas, вы потратили несколько мучительных часов на изучение этих двух технологий. Это то, что отличает вас.

2. Так много типов данных

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

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

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

Перед чтением файлов данных вы просматриваете их верхние строки с cat file_name.extension, чтобы решить, какие типы данных вы хотите использовать для столбцов. Затем, при использовании функций read_*, вы заполняете параметр dtype для каждого столбца вместо того, чтобы позволить Pandas решать самому.

Вы также выполняете манипуляции с данными на месте, насколько это возможно. Без этого вы знаете, что Pandas создаёт копии фреймов данных и серий, засоряя вашу память. Кроме того, вы очень хорошо разбираетесь в классах и параметрах, таких как pd.Categorical и chunksize.

3. Друзья с Pandas

Если есть что-то, что делает Pandas королем библиотек для анализа данных, это, должно быть, её интеграция с остальной экосистемой данных.

Например, к настоящему времени вы, должно быть, поняли, как можно изменить серверную часть Pandas для построения графиков с Matplotlib на Plotly, HVPlot, holoviews, Bokeh или Altair.

Да, Matplotlib - лучший друг Pandas, но время от времени вам хочется чего-нибудь интерактивного, вроде Plotly или Altair.

import pandas as pd import plotly.express as px # Set the default plotting backend to Plotly pd.options.plotting.backend = 'plotly'

Говоря о серверных системах, вы также заметили, что Pandas добавила полностью поддерживаемую реализацию PyArrow для своих функций загрузки файлов данных read_* в совершенно новой версии 2.0.0.

import pandas as pd pd.read_csv(file_name, engine='pyarrow')

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

До версии 2.0.0 Pandas разрабатывала собственные решения этих проблем, но они были не так хороши, как надеялись некоторые заядлые пользователи. Серверная часть PyArrow загружает данные значительно быстрее и предоставляет набор типов данных, с которыми знакомы пользователи Apache Arrow:

import pandas as pd pd.read_csv(file_name, engine='pyarrow', dtype_engine='pyarrow')

Еще одна интересная функция Pandas, которую, я уверен, вы постоянно используете в JupyterLab, - это стилизация фреймов данных.

Поскольку project Jupyter настолько потрясающий, разработчики Pandas добавили немного магии HTML / CSS в атрибут .style, чтобы вы могли оживить обычные старые фреймы данных таким образом, чтобы получить дополнительную информацию.

df.sample(20, axis=1).describe().T.style.bar( subset=["mean"], color="#205ff2" ).background_gradient( subset=["std"], cmap="Reds" ).background_gradient( subset=["50%"], cmap="coolwarm" )

4. Скульптор данных

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

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

import pandas as pd # create example DataFrame df = pd.DataFrame( { "Date": [ "2022-01-01", "2022-01-02", "2022-01-01", "2022-01-02", ], "Country": ["USA", "USA", "Canada", "Canada"], "Value": [10, 15, 5, 8], } ) df

Вы должны уметь конвертировать формат на основе строк в более полезный формат, подобный приведенному ниже примеру, используя функцию pivot:

pivot_df = df.pivot( index="Date", columns="Country", values="Value", ) pivot_df

Возможно, вам также придётся выполнить противоположную этой операцию, называемую расплавлением.

Вот пример с функцией Pandas melt, которая преобразует столбчатые данные в формат, основанный на строках:

df = pd.DataFrame( { "Date": ["2022-01-01", "2022-01-02", "2022-01-03"], "AAPL": [100.0, 101.0, 99.0], "GOOG": [200.0, 205.0, 195.0], "MSFT": [50.0, 52.0, 48.0], } ) df
melted_df = pd.melt( df, id_vars=["Date"], var_name="Stock", value_name="Price" ) melted_df

Такие функции могут быть довольно сложными для понимания и ещё труднее для применения.

Есть и другие подобные, такие как pivot_table, которые создают сводную таблицу, которая может вычислять различные типы агрегатов для каждого значения в таблице.

Есть ещё одна функция stack/unstack, которая может сворачивать / разносить индексы фрейма данных. crosstab вычисляет перекрестную таблицу двух или более факторов и по умолчанию вычисляет таблицу частот факторов, но также может вычислять другие сводные статистические данные.

Также есть groupby. Несмотря на то, что основы этой функции просты, её более продвинутые варианты использования очень сложны в освоении. Если бы содержимое функции Pandas groupby было выделено в отдельную библиотеку, она была бы больше, чем большинство в экосистеме Python.

# Group by a date column, use a monthly frequency # and find the total revenue for `category` grouped = df.groupby(['category', pd.Grouper(key='date', freq='M')]) monthly_revenue = grouped['revenue'].sum()

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

Заключение

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

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

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

Я надеюсь, что эта статья развлекла вас и вдохновила исследовать глубины Pandas и стать мастером манипулирования данными. Спасибо, дочитали её до конца!

0
Комментарии
-3 комментариев
Раскрывать всегда