База Python есть, данных пока мало
- Пишете короткие функции, циклы и условия.
- Понимаете строки, списки, словари и
import. - Хотите работать с CSV, JSON, датами и грязными полями.
- Готовитесь к DE-практике без резкого прыжка в Spark и Airflow.
Практический курс для тех, кто уже знает базовый Python, но хочет уверенно работать с CSV, JSON, датами, Decimal, дублями, rejected rows и простыми transform-задачами.
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 данных.
import.if, for и словари пока выглядят чужими.Курс не идет списком методов Python. Каждый урок добавляет новый слой работы с данными и собирает его в более плотную задачу.
Строки, типы, ключи, маленькие коллекции и нормализация значений.
Списки словарей, фильтры, поиск нужных строк и простые условия качества.
Helper-функции, счетчики, суммы, группировки и snapshot-структуры.
Path, CSV, JSON и локальная обработка файла стандартной библиотекой.
UTC, timezone offset, late events, денежные поля и Decimal.
Dedup, rejected rows, нормализация перед загрузкой и batch-проверки.
Прочитать вход, привести поля, отфильтровать брак, агрегировать и вернуть отчет.
В курсе нет декоративных упражнений ради синтаксиса. Задача обычно звучит как рабочий кусок: прочитать вход, привести поля, отсеять брак, собрать результат и пройти автопроверку.
Найти 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 Нормализовать поля, убрать дубли и не пропустить невалидные записи.
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 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 Это еще не Airflow и не production ETL. И хорошо. Сначала нужно уверенно пройти локальный слой: прочитать вход, привести поля, отсеять брак, убрать дубли и вернуть отчет.
Прочитать CSV-вход стандартной библиотекой.
Привести строки, даты, суммы и статусы к рабочему контракту.
Отделить бракованные строки и сохранить причину отклонения.
Убрать повторы, агрегировать и вернуть итог по дням.
Курс закрывает слой, который часто мешает зайти в DE-практику: файлы, типы, даты, дубли, rejected rows и маленькие batch-преобразования.
Нет. Нужны строки, списки, словари, условия, циклы и короткие функции. Если это пока не держится, сначала нужна базовая Python-практика.
Желателен базовый контекст данных, но SQL не является жестким входным фильтром. Курс про Python-обработку: файлы, записи, типы и batch-логику.
Нет. В этом курсе сознательно работаем стандартной библиотекой. Если код ломается без pandas на строках, датах и CSV, pandas только замаскирует проблему.
DE-проект быстро упирается в грязные входы, типы, дубли и проверки качества. Этот курс закрывает локальный слой, прежде чем идти в Spark, Airflow и витрины.
Если SQL уже на месте, логичный следующий шаг - DE-практикум. Если SQL проседает, сначала лучше закрыть SQL-направление, иначе проект будет буксовать.