Каждый инженер или аналитик хотя бы раз проходил через эту эволюцию. Сначала всё прекрасно: ты открываешь Excel, набрасываешь пару колонок, строишь сводную таблицу и отправляешь отчёт руководству. Но бизнес растёт, выгрузка переваливает за 300 тысяч строк, формулы VLOOKUP заставляют кулеры ноутбука взлетать, а жесткий потолок в 1 048 576 строк грозит обрезать свежие данные.
В этот момент возникает страх: кажется, что переход к коду требует фундаментального переучивания мышления. На самом деле это иллюзия. Логика работы с данными абсолютно инвариантна: фильтрация строк, группировка с подсчётом суммы и склейка двух списков по общему ключу концептуально одинаковы везде. Меняется лишь синтаксический фасад.
Ранее мы уже разбирали, как устроен логический конвейер выполнения SQL SELECT. Сегодня давай сопоставим привычные манипуляции в Excel с их реализацией в декларативном SQL и библиотеке pandas на Python.
Карта соответствий: от кликов мыши к строкам кода
Давай разложим базовые операции по трём средам:
- Фильтрация строк:
- В Excel: автофильтр в шапке таблицы или формула
=FILTER(A2:D100, B2:B100 > 5000). - В SQL: предикат фильтрации в блоке
WHERE revenue > 5000. - В pandas: булева индексация
df[df['revenue'] > 5000]или методdf.query('revenue > 5000').
- В Excel: автофильтр в шапке таблицы или формула
- Сортировка:
- В Excel: кнопка «Сортировка от Я к А».
- В SQL:
ORDER BY revenue DESC. - В pandas:
df.sort_values(by='revenue', ascending=False).
- Объединение таблиц (VLOOKUP / XLOOKUP):
- В Excel: формула
=XLOOKUP(id, lookup_range, return_range). - В SQL: соединение таблиц через
LEFT JOIN customers ON orders.customer_id = customers.id. - В pandas: метод
df.merge(orders, on='id', how='left').
- В Excel: формула
- Обработка пропусков (пустые ячейки):
- В Excel: замена пустых ячеек нулями через формулу
=IF(ISBLANK(A2), 0, A2). - В SQL: функция
COALESCE(revenue, 0). - В pandas: векторный метод
df['revenue'].fillna(0).
- В Excel: замена пустых ячеек нулями через формулу
Практическое сопоставление в коде
Представь задачу: у нас есть таблица клиентов и таблица их заказов. Нам нужно отобрать активных пользователей из Лондона с выручкой свыше 5000, добавить вычисляемую колонку с десятипроцентной надбавкой, объединить с заказами и подсчитать суммарную выручку по регионам.
Вот как эта логика выражается в декларативном SQL:
-- SQL: фильтрация, вычисляемое поле, объединение таблиц и группировка
SELECT
c.region,
COUNT(o.order_id) AS total_orders,
COALESCE(SUM(o.amount), 0) AS total_amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE c.region = 'London' AND c.revenue > 5000
GROUP BY c.region
ORDER BY total_amount DESC;
А вот абсолютно тот же смысловой пайплайн, реализованный на Python с помощью pandas:
import pandas as pd
# Загружаем датасеты из файлов
customers = pd.read_csv('customers.csv')
orders = pd.read_csv('orders.csv')
# 1. Фильтрация и добавление вычисляемой колонки
filtered = customers[
(customers['region'] == 'London') & (customers['revenue'] > 5000)
].copy()
filtered['revenue_uplift'] = filtered['revenue'] * 1.1
# 2. Объединение таблиц (аналог LEFT JOIN / VLOOKUP)
merged = filtered.merge(orders, left_on='id', right_on='customer_id', how='left')
# 3. Обработка пропущенных значений (аналог COALESCE)
merged['amount'] = merged['amount'].fillna(0)
# 4. Группировка и расчет сводных показателей (Pivot Table / GROUP BY)
summary = (
merged.groupby('region', as_index=False)
.agg(
total_orders=('order_id', 'count'),
total_amount=('amount', 'sum')
)
.sort_values(by='total_amount', ascending=False)
)
print(summary)
Библиотека pandas загружает все данные целиком в оперативную память как массивы NumPy. Из-за накладных расходов Python-объектов CSV-файл на 5 ГБ может потребовать до 25 ГБ RAM и упасть с MemoryError. Если твой датасет перестал помещаться в память, обрати внимание на DuckDB — встраиваемую аналитическую базу данных. Она позволяет писать чистый SQL поверх файлов CSV и Parquet с потоковой обработкой данных прямо с диска без переполнения памяти.
Главное преимущество перехода от Excel к коду — полная воспроизводимость. Скрипт не забудет формулу в крайней ячейке, не сдвинет строки при случайной сортировке и сможет запускаться по расписанию каждую ночь, освобождая твоё время для более интересных инженерных задач.
