Python для DE

Данные, файлы и маленькие batch-пайплайны

Практический курс для тех, кто уже знает базовый Python, но хочет уверенно работать с CSV, JSON, датами, Decimal, дублями, rejected rows и простыми transform-задачами.

40 code-задач
10 уроков
финальный кейс
2500 ₽
batch_transform.py checks passed
from decimal import Decimal

def clean_row(row):
    amount = Decimal(row["amount"].replace(",", "."))

    if not row["order_id"] or amount <= 0:
        return None

    return {
        "order_id": row["order_id"].strip(),
        "event_date": row["event_ts"][:10],
        "amount": amount,
        "source": "csv_batch",
    }
Входной уровень

Курс не для полного нуля. И это нормально

Здесь не объясняем заново, что такое for и return. Курс нужен тем, кто уже пишет базовый Python, но теряется, когда вместо учебной строки приходит грязный batch данных.

Подходит

База Python есть, данных пока мало

  • Пишете короткие функции, циклы и условия.
  • Понимаете строки, списки, словари и import.
  • Хотите работать с CSV, JSON, датами и грязными полями.
  • Готовитесь к DE-практике без резкого прыжка в Spark и Airflow.
Пока рано

Если сам язык еще не держится

  • Функции, if, for и словари пока выглядят чужими.
  • Нужен Python с полного нуля.
  • Вы ждете pandas, API, asyncio, ООП или Airflow.
  • Хочется “весь DE” в одном курсе. Это слабый запрос, он расползается.
Траектория

Сложность растет от строки к маленькому пайплайну

Курс не идет списком методов Python. Каждый урок добавляет новый слой работы с данными и собирает его в более плотную задачу.

01

Одна запись

Строки, типы, ключи, маленькие коллекции и нормализация значений.

02

Маленький batch

Списки словарей, фильтры, поиск нужных строк и простые условия качества.

03

Состояние по ключу

Helper-функции, счетчики, суммы, группировки и snapshot-структуры.

04

Форматы

Path, CSV, JSON и локальная обработка файла стандартной библиотекой.

05

Точные типы

UTC, timezone offset, late events, денежные поля и Decimal.

06

Clean batch

Dedup, rejected rows, нормализация перед загрузкой и batch-проверки.

07

Маленький pipeline

Прочитать вход, привести поля, отфильтровать брак, агрегировать и вернуть отчет.

Практика

Задачи похожи на маленькие рабочие проверки

В курсе нет декоративных упражнений ради синтаксиса. Задача обычно звучит как рабочий кусок: прочитать вход, привести поля, отсеять брак, собрать результат и пройти автопроверку.

CSV

Бракованные строки из файла

Найти order_item_id, где SKU пустой или количество меньше единицы.

import csv
from io import StringIO

def rejected_order_item_ids(csv_text):
    result = []
    for row in csv.DictReader(StringIO(csv_text)):
        sku = row["sku"].strip()
        qty = int(row["qty"].strip())
        if not sku or qty <= 0:
            result.append(int(row["order_item_id"].strip()))
    return result
clean batch

Подготовить строки к загрузке

Нормализовать поля, убрать дубли и не пропустить невалидные записи.

def prepare_order_items_for_load(rows):
    accepted_ids = set()
    result = []

    for raw_row in rows:
        row = normalize_order_item(raw_row)
        if not row["sku"] or row["qty"] <= 0:
            continue
        if row["order_item_id"] in accepted_ids:
            continue
        accepted_ids.add(row["order_item_id"])
        result.append(row)

    return result
final case

Собрать payout-отчет

CSV, даты с offset, Decimal, rejected payments, dedup и итоговая сумма по дням.

def build_daily_payout_report(csv_text):
    loaded_rows = 0
    rejected_payment_ids = []
    accepted_ids = set()
    net_payout_totals = {}

    for raw_row in csv.DictReader(StringIO(csv_text)):
        loaded_rows += 1
        row = normalize_settlement_row(raw_row)

        if not is_valid_settlement_row(row):
            rejected_payment_ids.append(row["payment_id"])
            continue
        if row["payment_id"] in accepted_ids:
            continue

        accepted_ids.add(row["payment_id"])
        date = row["settled_date"]
        net = Decimal(row["gross_amount"]) - Decimal(row["fee_amount"])
        net_payout_totals[date] = net_payout_totals.get(date, Decimal("0.00")) + net
Финальный кейс

В конце собираете маленький pipeline обработки данных

Это еще не Airflow и не production ETL. И хорошо. Сначала нужно уверенно пройти локальный слой: прочитать вход, привести поля, отсеять брак, убрать дубли и вернуть отчет.

01 read

Прочитать CSV-вход стандартной библиотекой.

02 normalize

Привести строки, даты, суммы и статусы к рабочему контракту.

03 validate

Отделить бракованные строки и сохранить причину отклонения.

04 dedup + report

Убрать повторы, агрегировать и вернуть итог по дням.

Финальный выбор

Если базовый Python есть, пора тренировать данные

Курс закрывает слой, который часто мешает зайти в DE-практику: файлы, типы, даты, дубли, rejected rows и маленькие batch-преобразования.

Курс подойдет с нуля?

Нет. Нужны строки, списки, словари, условия, циклы и короткие функции. Если это пока не держится, сначала нужна базовая Python-практика.

Нужен ли SQL?

Желателен базовый контекст данных, но SQL не является жестким входным фильтром. Курс про Python-обработку: файлы, записи, типы и batch-логику.

Будет pandas?

Нет. В этом курсе сознательно работаем стандартной библиотекой. Если код ломается без pandas на строках, датах и CSV, pandas только замаскирует проблему.

Чем это полезно перед DE?

DE-проект быстро упирается в грязные входы, типы, дубли и проверки качества. Этот курс закрывает локальный слой, прежде чем идти в Spark, Airflow и витрины.

Что после курса?

Если SQL уже на месте, логичный следующий шаг - DE-практикум. Если SQL проседает, сначала лучше закрыть SQL-направление, иначе проект будет буксовать.