Каждый, кто работает с данными, рано или поздно сталкивается с ощущением лёгкого когнитивного диссонанса. Утром ты пишешь декларативный SQL-запрос к хранилищу PostgreSQL, днём чистишь выгрузку в Python с помощью библиотеки Pandas, а к вечеру собираешь интерактивный дашборд в Power BI и натягиваешь формулы на языке DAX.
Хотя математическая суть операций остаётся абсолютно неизменной, синтаксис трёх сред различается настолько, что в голове легко возникает каша. Я собрал наглядный путеводитель по десяти фундаментальным операциям трансформации данных (Data Wrangling), чтобы ты мог мгновенно переключать ментальный контекст между базой данных, кодом и слоем бизнес-аналитики.
Фундаментальная десятка: от выборки до сводных таблиц
Давай разберём, как одна и та же вычислительная задача выражается на трёх разных диалектах:
- Выборка колонок (Selection):
- SQL:
SELECT name, salary FROM employees - Pandas:
df[["name", "salary"]] - DAX:
SELECTCOLUMNS(Employees, "name", Employees[name], "salary", Employees[salary])
- SQL:
- Фильтрация строк (Filtering):
- SQL:
SELECT * FROM sales WHERE amount > 1000 - Pandas:
df[df["amount"] > 1000]илиdf.query("amount > 1000") - DAX:
FILTER(Sales, Sales[amount] > 1000)или в расчёте меры:CALCULATE([Total], Sales[amount] > 1000)
- SQL:
- Сортировка (Sorting):
- SQL:
SELECT * FROM orders ORDER BY created_at DESC - Pandas:
df.sort_values(by="created_at", ascending=False) - DAX:
TOPN(10, Orders, Orders[created_at], DESC)(либо настройка порядка в Power BI Desktop)
- SQL:
- Агрегация и группировка (Aggregation):
- SQL:
SELECT dept, SUM(salary) AS total FROM staff GROUP BY dept - Pandas:
df.groupby("dept")["salary"].sum().reset_index() - DAX:
SUMMARIZE(Staff, Staff[dept], "total", SUM(Staff[salary]))
- SQL:
- Объединение таблиц (Join):
- SQL:
SELECT * FROM orders o INNER JOIN clients c ON o.client_id = c.id - Pandas:
pd.merge(orders, clients, on="client_id", how="inner") - DAX:
RELATED(Clients[name])(через связь в модели) либоNATURALINNERJOIN(Orders, Clients)
- SQL:
- Уникальные значения (Distinct):
- SQL:
SELECT DISTINCT category FROM products - Pandas:
df["category"].unique()илиdf.drop_duplicates(subset=["category"]) - DAX:
DISTINCT(Products[category])илиVALUES(Products[category])
- SQL:
- Заполнение пропусков (Coalesce / Imputation):
- SQL:
SELECT COALESCE(phone, "нет данных") FROM users - Pandas:
df["phone"].fillna("нет данных") - DAX:
COALESCE(Users[phone], "нет данных")
- SQL:
- Ранжирование (Rank):
- SQL:
RANK() OVER (PARTITION BY dept ORDER BY salary DESC) - Pandas:
df.groupby("dept")["salary"].rank(ascending=False, method="min") - DAX:
RANKX(ALL(Staff), [Total Salary], , DESC)
- SQL:
- Накопительный итог (Cumulative Sum / Running Total):
- SQL:
SUM(amount) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - Pandas:
df.sort_values("date")["amount"].cumsum() - DAX:
CALCULATE(SUM(Sales[amount]), FILTER(ALL(Sales), Sales[date] <= MAX(Sales[date])))
- SQL:
- Сводные таблицы (Pivot / Cross-tabulation):
- SQL: условная агрегация
SUM(CASE WHEN year = 2026 THEN amount ELSE 0 END) GROUP BY dept - Pandas:
df.pivot_table(index="dept", columns="year", values="amount", aggfunc="sum") - DAX: визуальный элемент матрицы либо табличная функция
SUMMARIZECOLUMNS
- SQL: условная агрегация
Архитектурное разделение: где и что считать
Чтобы пайплайн не падал с ошибками переполнения памяти, держи в голове правильное разделение ответственности между тремя слоями:
-- 1. Слой СУБД: фильтруем и агрегируем данные у источника
SELECT department, DATE_TRUNC('month', order_date) AS month, SUM(revenue) AS total_revenue
FROM enterprise_orders
WHERE status = 'completed' AND order_date >= '2026-01-01'
GROUP BY 1, 2;
# 2. Слой Python/Pandas: сложная очистка и векторизованная трансформация
import pandas as pd
def clean_and_accumulate(df: pd.DataFrame) -> pd.DataFrame:
df["total_revenue"] = df["total_revenue"].fillna(0)
df = df.sort_values(["department", "month"])
df["running_total"] = df.groupby("department")["total_revenue"].cumsum()
return df
Правило простое: первичную грубую фильтрацию и объединение таблиц всегда выгоднее делать на стороне СУБД в SQL — это экономит сеть и память. Векторизованную очистку, валидацию и обогащение отдавай Pandas. А динамические срезы, контекст фильтрации и визуальные коэффициенты оставляй движку VertiPaq и формулам DAX в Power BI.
Ранее мы уже разбирали сопоставление логики Excel с кодом на Python и SQL, а эта сводная шпаргалка поможет тебе быстро транслировать любую аналитическую мысль в синтаксис нужного инструмента.
