Pandas & NumPy Academy · Урок

Расчёт выручки и построение признаков

Вычисляйте выручку по позициям заказа, создавайте столбцы месяца и квартала и добавляйте признак скидки для заказов выше заданного порога.

Урок 2 из 413 шагов

«Расчёт выручки и построение признаков» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Вычисление выручки по позициям заказа

Самый фундаментальный расчёт в наборе данных о продажах — это выручка по позиции заказа: произведение количества и цены за единицу для каждой строки. Создайте столбец с помощью векторизованного умножения, чтобы NumPy обработал все строки одновременно без цикла Python. Этот столбец станет основой для всех агрегирований в анализе.

import pandas as pd

df = pd.read_parquet('sales_clean.parquet')

df['revenue'] = df['quantity'] * df['unit_price']
print(df[['quantity', 'unit_price', 'revenue']].head())

Извлечение столбцов месяца и квартала

Группировка по календарным периодам необходима для анализа тенденций. Используйте аксессор .dt для столбца с датами и временем, чтобы извлечь год, месяц и квартал. Хранение этих значений в отдельных целочисленных столбцах ускоряет операции groupby и позволяет легко фильтровать данные по периоду без повторного разбора строк.

df['year'] = df['order_date'].dt.year
df['month'] = df['order_date'].dt.month
df['quarter'] = df['order_date'].dt.quarter
df['year_month'] = df['order_date'].dt.to_period('M')

print(df[['order_date', 'year', 'month', 'quarter', 'year_month']].head())

Создание признака скидки

Бизнес-правила часто определяют признак скидки: заказы, общая сумма которых превышает порог, получают скидку. Используйте np.where или логическое сравнение, чтобы эффективно создать этот двоичный столбец. Признак скидки позволяет аналитикам сравнивать распределения выручки для заказов со скидкой и по полной цене в одном вызове groupby.

import numpy as np

DISCOUNT_THRESHOLD = 500

df['is_discounted'] = np.where(df['revenue'] >= DISCOUNT_THRESHOLD, 1, 0)

print(df['is_discounted'].value_counts())
print(df.groupby('is_discounted')['revenue'].mean())

Вычисление столбца маржи прибыли

Если набор данных содержит столбец cost_price, маржу прибыли можно вычислить как (unit_price - cost_price) / unit_price. Используйте clip(lower=0), чтобы ограничить снизу отрицательные значения маржи, вызванные ошибками в данных, прежде чем продолжать анализ. Столбцы с маржой позволяют выполнять групповые агрегирования, ориентированные на прибыль, одновременно с анализом выручки.

df['margin'] = ((df['unit_price'] - df['cost_price']) / df['unit_price']).clip(lower=0)

print(df[['unit_price', 'cost_price', 'margin']].describe())

Признак количества дней с момента первого заказа

Количество дней между первым заказом клиента и текущим заказом — полезный признак давности отношений с клиентом. Вычислите его, сгруппировав данные по customer_id, взяв минимальную дату в качестве даты начала отсчёта и вычтя её из даты каждой строки. Арифметика с разностями дат возвращает столбец значений timedelta64, которые можно преобразовать в целое число дней с помощью .dt.days.

first_order = df.groupby('customer_id')['order_date'].transform('min')
df['days_since_first_order'] = (df['order_date'] - first_order).dt.days

print(df[['customer_id', 'order_date', 'days_since_first_order']].head())

Категории размера заказа с помощью pd.cut

Разбейте столбец revenue на именованные категории размера с помощью pd.cut(), чтобы создать порядковый признак для сегментации. Явно задайте bins и labels в соответствии с принятыми в вашей компании определениями маленьких, средних и крупных заказов. В результате получится категориальный столбец Pandas, который эффективно используется при группировке.

bins = [0, 100, 500, 2000, float('inf')]
labels = ['Small', 'Medium', 'Large', 'Enterprise']

df['order_size'] = pd.cut(df['revenue'], bins=bins, labels=labels)
print(df['order_size'].value_counts())

Накопленная выручка во времени

Отсортируйте DataFrame по order_date и примените cumsum() к столбцу выручки, чтобы отслеживать накопление общей выручки за год. Этот накопительный ряд помогает определить, растёт ли выручка линейно, ускоряется ли её рост или он выходит на плато, а также служит основой для каскадной или линейной диаграммы накопленной выручки.

df_sorted = df.sort_values('order_date')
df_sorted['cumulative_revenue'] = df_sorted['revenue'].cumsum()

print(df_sorted[['order_date', 'revenue', 'cumulative_revenue']].tail())

Признак выходного или буднего дня

Свойство dt.day_of_week возвращает значения от 0 (понедельник) до 6 (воскресенье). Пометьте заказы субботы (5) и воскресенья (6) как заказы выходных дней, чтобы проверить, отличается ли покупательское поведение в выходные от поведения в будни. Это распространённый признак в исследовательском анализе данных о розничных продажах и анализе A/B-тестов.

df['is_weekend'] = df['order_date'].dt.day_of_week >= 5

print(df.groupby('is_weekend')['revenue'].agg(['mean', 'count']))

Ранжирование клиентов по выручке

Определите лучших клиентов, вычислив общую выручку для каждого customer_id с помощью groupby().sum(), а затем выполнив ранжирование с помощью .rank(ascending=False, method='dense'). Добавление ранга обратно в основной DataFrame с помощью map() позволяет отфильтровать N лучших клиентов одним логическим условием.

customer_revenue = df.groupby('customer_id')['revenue'].sum()
customer_rank = customer_revenue.rank(ascending=False, method='dense').astype(int)

df['customer_revenue_rank'] = df['customer_id'].map(customer_rank)
print(df[df['customer_revenue_rank'] <= 10][['customer_id', 'customer_revenue_rank']].drop_duplicates())

Нормализация выручки с помощью Z-оценки

Нормализуйте столбец выручки до Z-оценки, чтобы сравнивать размеры заказов в разных категориях товаров с сильно различающимися диапазонами цен. Используйте (df['revenue'] - df['revenue'].mean()) / df['revenue'].std(). Z-оценки выше 3 или ниже -3 являются статистическими выбросами, которые стоит исследовать до построения моделей.

mean_rev = df['revenue'].mean()
std_rev = df['revenue'].std()

df['revenue_zscore'] = (df['revenue'] - mean_rev) / std_rev

outliers = df[df['revenue_zscore'].abs() > 3]
print(f'Outlier orders: {len(outliers)}')

Сохранение обогащённого признаками DataFrame

После добавления вычисляемых столбцов сохраните обогащённый DataFrame, чтобы каждый последующий ноутбук начинал работу с одинакового согласованного состояния данных. Используйте to_parquet(), чтобы сохранить типы данных, особенно категориальный столбец order_size и столбец дат и времени order_date. Кратко опишите новые столбцы в блоке комментариев в начале скрипта.

# New columns added:
# revenue, year, month, quarter, year_month
# is_discounted, order_size, is_weekend
# days_since_first_order, customer_revenue_rank, revenue_zscore

df.to_parquet('sales_features.parquet', index=False)
print('Feature DataFrame saved:', df.shape)

Быстрая проверка

Проверьте своё понимание концепций анализа данных из этого урока.

Итоги урока

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

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Расчёт выручки и построение признаков» бесплатный?

Да — полный текст урока «Расчёт выручки и построение признаков» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Расчёт выручки и построение признаков»?

Вычисляйте выручку по позициям заказа, создавайте столбцы месяца и квартала и добавляйте признак скидки для заказов выше заданного порога. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Расчёт выручки и построение признаков»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Загрузка и проверка набора данных о продажах
  2. Расчёт выручки и построение признаков
  3. Анализ GroupBy по регионам и категориям
  4. Визуализация месячной динамики
← Назад к Pandas & NumPy Academy