Дайджесты новостей
Трехъярусная архитектурная схема обработки данных в SQL, Pandas и Power BI DAX

Трансформация данных на пальцах: 10 операций в SQL, Pandas и Power BI DAX

Каждый, кто работает с данными, рано или поздно сталкивается с ощущением лёгкого когнитивного диссонанса. Утром ты пишешь декларативный SQL-запрос к хранилищу PostgreSQL, днём чистишь выгрузку в Python с помощью библиотеки Pandas, а к вечеру собираешь интерактивный дашборд в Power BI и натягиваешь формулы на языке DAX.

Хотя математическая суть операций остаётся абсолютно неизменной, синтаксис трёх сред различается настолько, что в голове легко возникает каша. Я собрал наглядный путеводитель по десяти фундаментальным операциям трансформации данных (Data Wrangling), чтобы ты мог мгновенно переключать ментальный контекст между базой данных, кодом и слоем бизнес-аналитики.

Фундаментальная десятка: от выборки до сводных таблиц

Давай разберём, как одна и та же вычислительная задача выражается на трёх разных диалектах:

  1. Выборка колонок (Selection):
    • SQL: SELECT name, salary FROM employees
    • Pandas: df[["name", "salary"]]
    • DAX: SELECTCOLUMNS(Employees, "name", Employees[name], "salary", Employees[salary])
  2. Фильтрация строк (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)
  3. Сортировка (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)
  4. Агрегация и группировка (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]))
  5. Объединение таблиц (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)
  6. Уникальные значения (Distinct):
    • SQL: SELECT DISTINCT category FROM products
    • Pandas: df["category"].unique() или df.drop_duplicates(subset=["category"])
    • DAX: DISTINCT(Products[category]) или VALUES(Products[category])
  7. Заполнение пропусков (Coalesce / Imputation):
    • SQL: SELECT COALESCE(phone, "нет данных") FROM users
    • Pandas: df["phone"].fillna("нет данных")
    • DAX: COALESCE(Users[phone], "нет данных")
  8. Ранжирование (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)
  9. Накопительный итог (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])))
  10. Сводные таблицы (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

Архитектурное разделение: где и что считать

Чтобы пайплайн не падал с ошибками переполнения памяти, держи в голове правильное разделение ответственности между тремя слоями:

-- 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, а эта сводная шпаргалка поможет тебе быстро транслировать любую аналитическую мысль в синтаксис нужного инструмента.