5 признаков того, что вы стали продвинутым пользователем 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 – это огромная библиотека с множеством различных методов для выполнения одной и той же задачи. Однако, если вы опытный пользователь, вы знаете, какой метод лучше всего работает в конкретных ситуациях.

Например, вы знакомы с различиями между такими итерационными функциями, как applyapplymapmapiterrows и 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 предлагает огромную гибкость при работе с типами данных. Вместо того, чтобы просто использовать обычные floatint и object, вы сделали следующие два изображения своими обоями:

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

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

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

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

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

3. Большой выбор интеграций

Если есть что-то, что делает 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"
)
5 признаков того, что вы стали продвинутым пользователем Pandas

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
5 признаков того, что вы стали продвинутым пользователем Pandas

Вы должны уметь конвертировать формат на основе строк в более полезный формат, подобный приведенному ниже примеру, используя функцию 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
5 признаков того, что вы стали продвинутым пользователем Pandas
melted_df = pd.melt(
    df, id_vars=["Date"], var_name="Stock", value_name="Price"
)

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

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

Есть и другие подобные, такие как 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 и стать мастером манипулирования данными. Спасибо, дочитали её до конца!

+1
0
+1
4
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *