Дайджесты новостей
Разложенные на столе инструменты аналитика: ноутбук с кодом Python pandas, распечатанная таблица Excel и схема запроса SQL в едином рабочем потоке.

Из таблиц Excel в код: как задачи анализа данных решаются на Python и SQL

Каждый инженер или аналитик хотя бы раз проходил через эту эволюцию. Сначала всё прекрасно: ты открываешь Excel, набрасываешь пару колонок, строишь сводную таблицу и отправляешь отчёт руководству. Но бизнес растёт, выгрузка переваливает за 300 тысяч строк, формулы VLOOKUP заставляют кулеры ноутбука взлетать, а жесткий потолок в 1 048 576 строк грозит обрезать свежие данные.

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

Ранее мы уже разбирали, как устроен логический конвейер выполнения SQL SELECT. Сегодня давай сопоставим привычные манипуляции в Excel с их реализацией в декларативном SQL и библиотеке pandas на Python.

Карта соответствий: от кликов мыши к строкам кода

Давай разложим базовые операции по трём средам:

  1. Фильтрация строк:
    • В Excel: автофильтр в шапке таблицы или формула =FILTER(A2:D100, B2:B100 > 5000).
    • В SQL: предикат фильтрации в блоке WHERE revenue > 5000.
    • В pandas: булева индексация df[df['revenue'] > 5000] или метод df.query('revenue > 5000').
  2. Сортировка:
    • В Excel: кнопка «Сортировка от Я к А».
    • В SQL: ORDER BY revenue DESC.
    • В pandas: df.sort_values(by='revenue', ascending=False).
  3. Объединение таблиц (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').
  4. Обработка пропусков (пустые ячейки):
    • В Excel: замена пустых ячеек нулями через формулу =IF(ISBLANK(A2), 0, A2).
    • В SQL: функция COALESCE(revenue, 0).
    • В pandas: векторный метод df['revenue'].fillna(0).

Практическое сопоставление в коде

Представь задачу: у нас есть таблица клиентов и таблица их заказов. Нам нужно отобрать активных пользователей из Лондона с выручкой свыше 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)
Когда пора подключать DuckDB вместо pandas

Библиотека pandas загружает все данные целиком в оперативную память как массивы NumPy. Из-за накладных расходов Python-объектов CSV-файл на 5 ГБ может потребовать до 25 ГБ RAM и упасть с MemoryError. Если твой датасет перестал помещаться в память, обрати внимание на DuckDB — встраиваемую аналитическую базу данных. Она позволяет писать чистый SQL поверх файлов CSV и Parquet с потоковой обработкой данных прямо с диска без переполнения памяти.

Главное преимущество перехода от Excel к коду — полная воспроизводимость. Скрипт не забудет формулу в крайней ячейке, не сдвинет строки при случайной сортировке и сможет запускаться по расписанию каждую ночь, освобождая твоё время для более интересных инженерных задач.