Pandas

Материал из Энциклопедия интернет-маркетинга MarketWiki

Pandas - библиотека для Python, предоставляющая мощные и гибкие инструменты для работы со структурированными данными. Pandas вводит 2 ключевые структуры данных: Series (одномерный массив с метками) и DataFrame (двумерная таблица с метками строк и столбцов). Библиотека стала стандартом де-факто для манипуляции, очистки, агрегации и анализа данных в экосистеме Data Science.

В интернет-маркетинге Pandas используется для обработки данных из CRM, рекламных кабинетов, Яндекс.Метрики, Google Analytics 4 и других источников, позволяя маркетинговым аналитикам объединять, очищать и подготавливать данные для построения отчётов, когортного анализа и моделей машинного обучения.

Коротко: Pandas - это Excel на максималках для Python. Если данные нужно объединить, очистить, сгруппировать или агрегировать - это инструмент номер 1.

Основные структуры данных

[править]

Одномерный массив с индексами (метками). Аналог столбца в Excel.

import pandas as pd

# Создание Series
s = pd.Series([100, 200, 300], index=['янв', 'фев', 'мар'])
print(s)
# янв    100
# фев    200
# мар    300
# dtype: int64

# Доступ по индексу
print(s['фев'])      # 200
print(s.iloc[1])     # 200 (позиционная индексация)

DataFrame

[править]

Двумерная таблица с метками строк (index) и столбцов (columns). Основной объект работы в Pandas.

# Создание DataFrame из словаря
data = {
    'канал': ['Яндекс.Директ', 'VK Реклама', 'SEO', 'Email'],
    'бюджет': [50000, 30000, 20000, 15000],
    'лиды': [45, 38, 12, 28],
    'выручка': [180000, 114000, 60000, 84000]
}
df = pd.DataFrame(data)
print(df)

Основные операции с данными

[править]

Загрузка и просмотр данных

[править]
# Загрузка из CSV
df = pd.read_csv('marketing_data.csv', encoding='utf-8')

# Просмотр первых/последних строк
df.head(10)      # первые 10 строк
df.tail(5)       # последние 5 строк

# Информация о DataFrame
df.info()        # типы данных, количество непустых значений
df.describe()    # статистика по числовым столбцам
df.shape         # размерность (строки, столбцы)

Выборка и фильтрация

[править]
# Выбор столбцов
df['канал']                      # 1 столбец → Series
df[['канал', 'выручка']]         # несколько столбцов → DataFrame

# Фильтрация по условию
high_roi = df[df['выручка'] > 100000]
channel_filter = df[df['канал'].isin(['Яндекс.Директ', 'SEO'])]

# Фильтрация по нескольким условиям
filtered = df[(df['лиды'] > 20) & (df['бюджет'] < 40000)]

Агрегация и группировка

[править]
# Базовая агрегация
total_budget = df['бюджет'].sum()
avg_leads = df['лиды'].mean()
max_revenue = df['выручка'].max()

# Группировка
grouped = df.groupby('канал')['выручка'].sum()

# Множественная агрегация
summary = df.groupby('канал').agg({
    'бюджет': 'sum',
    'лиды': 'mean',
    'выручка': ['sum', 'mean']
})

Работа с пропусками

[править]
# Проверка пропусков
df.isnull().sum()                # количество пропусков в каждом столбце
df.isnull().sum().sum()          # общее количество пропусков

# Заполнение пропусков
df.fillna(0, inplace=True)               # заполнить нулями
df.fillna(df.mean(), inplace=True)       # заполнить средним
df.ffill(inplace=True)                   # заполнить предыдущим значением

# Удаление пропусков
df.dropna(inplace=True)                  # удалить строки с любыми пропусками
df.dropna(subset=['важный_столбец'], inplace=True)  # удалить строки с пропусками в конкретном столбце

Объединение данных

[править]
# Объединение по индексу или столбцу (аналог VLOOKUP)
merged = pd.merge(df_ads, df_crm, on='client_id', how='inner')  # how: inner, left, right, outer

# Конкатенация (склеивание)
concatenated = pd.concat([df1, df2], axis=0)   # по строкам

Применение Pandas в маркетинговой аналитике

[править]

Сквозная аналитика

[править]

Объединение данных из разных источников.

# Загрузка данных
df_ads = pd.read_csv('ads_data.csv')           # данные из рекламных кабинетов
df_crm = pd.read_csv('crm_data.csv')           # данные о сделках из CRM
df_analytics = pd.read_csv('site_data.csv')    # данные из GA4 / Яндекс.Метрики

# Объединение данных
df_merged = df_ads.merge(df_analytics, on='visit_id', how='left')
df_full = df_merged.merge(df_crm, on='client_id', how='left')

# Расчёт метрик
df_full['roas'] = df_full['revenue'] / df_full['ad_spend'] * 100
df_full['cac'] = df_full['ad_spend'] / df_full['new_clients']

Когортный анализ

[править]
# Преобразование даты в месяц когорты
df['cohort_month'] = df['first_purchase_date'].dt.to_period('M')

# Когортный анализ
cohort_data = df.groupby(['cohort_month', 'lifetime_month']).agg({
    'client_id': 'nunique',
    'revenue': 'sum'
}).reset_index()

# Формирование таблицы когорт (pivot)
cohort_pivot = cohort_data.pivot(
    index='cohort_month',
    columns='lifetime_month',
    values='client_id'
)

# Расчёт retention
retention = cohort_pivot.div(cohort_pivot[0], axis=0) * 100

Анализ эффективности каналов

[править]
# Группировка по каналам
channel_performance = df.groupby('channel').agg({
    'spend': 'sum',
    'leads': 'sum',
    'revenue': 'sum'
}).reset_index()

# Расчёт метрик
channel_performance['cpl'] = channel_performance['spend'] / channel_performance['leads']
channel_performance['roas'] = channel_performance['revenue'] / channel_performance['spend'] * 100
channel_performance['cac'] = channel_performance['spend'] / channel_performance['new_clients']

# Сортировка по ROAS
channel_performance.sort_values('roas', ascending=False, inplace=True)

Анализ воронки продаж

[править]
# Данные по этапам воронки
funnel_data = {
    'stage': ['Просмотры', 'Клики', 'Лиды', 'MQL', 'SQL', 'Сделки'],
    'count': [10000, 1200, 300, 150, 80, 45]
}
df_funnel = pd.DataFrame(funnel_data)

# Расчёт конверсии
df_funnel['conversion'] = df_funnel['count'] / df_funnel['count'].iloc[0] * 100
df_funnel['dropoff'] = df_funnel['count'].pct_change() * -100

Анализ клиентских сегментов

[править]
# RFM-анализ (Recency, Frequency, Monetary)
rfm = df.groupby('client_id').agg({
    'purchase_date': 'max',    # Recency
    'order_id': 'count',       # Frequency
    'revenue': 'sum'           # Monetary
}).reset_index()

# Присвоение квантилей
rfm['r_score'] = pd.qcut(rfm['purchase_date'].rank(), 4, labels=[4, 3, 2, 1])
rfm['f_score'] = pd.qcut(rfm['order_id'], 4, labels=[1, 2, 3, 4])
rfm['m_score'] = pd.qcut(rfm['revenue'], 4, labels=[1, 2, 3, 4])

# RFM-сегмент
rfm['rfm_score'] = rfm['r_score'].astype(str) + rfm['f_score'].astype(str) + rfm['m_score'].astype(str)

Интеграция с другими библиотеками

[править]

Pandas тесно интегрирован с экосистемой Python.

Интеграция Pandas с другими библиотеками
Библиотека Интеграция
NumPy Pandas построен на NumPy, DataFrame содержат NumPy массивы
Matplotlib df.plot() использует Matplotlib для быстрой визуализации
Scikit-learn DataFrame можно передавать в модели ML
Jupyter Notebook DataFrame отображаются в красивых таблицах

Оптимизация производительности

[править]

Для работы с большими объёмами данных (миллионы строк) рекомендуется:

# Использование типов данных с меньшим потреблением памяти
df['category'] = df['category'].astype('category')
df['value'] = df['value'].astype('float32')

# Фильтрация перед агрегацией
df_filtered = df[df['date'] > '2025-01-01']

# Использование query() для сложных фильтров
df.query('channel == "Яндекс.Директ" and spend > 10000')

# Параллельная обработка (Dask, Modin) для очень больших данных

Значение для маркетолога

[править]

Понимание возможностей Pandas позволяет маркетологу:

  • Эффективно взаимодействовать с аналитиками, понимая их инструментарий.
  • Формулировать требования к аналитическим отчётам с учётом возможностей обработки данных.
  • Интерпретировать результаты анализа, представленные в виде таблиц и сводок.
  • Участвовать в постановке задач на разработку сквозной аналитики и дашбордов.

Связанные термины

[править]