Конспект: Сбор и подготовка данных

Сбор и подготовка данных

Лекция 1: Введение
Instructor: Aiganym Zhandaulet
Fall 2025

1. Основные тезисы

  1. Данные — «новая нефть»: Успех ML-модели зависит от трех компонентов: Вычислительных мощностей (Computing Power), Алгоритмов и Данных. Данные являются топливом.
  2. Жизненный цикл данных (Data Lifecycle): Это не линейный, а циклический процесс: Сбор → Хранение → Анализ → Визуализация → Принятие решений.
  3. Разнообразие источников: Данные поступают из файлов, баз данных, веб-скрейпинга, API и потоковых систем (Streaming).
  4. Доминирование неструктурированных данных: Около 80% всех мировых данных — неструктурированные (видео, текст, аудио), и лишь 20% — структурированные таблицы.
  5. Эволюция форматов: Индустрия переходит от текстовых строковых форматов (CSV) к бинарным колоночным (Parquet) для обработки больших данных.
  6. Превосходство колоночного хранения: Parquet позволяет читать только нужные столбцы, что критически важно для аналитики, в то время как CSV требует чтения файла целиком.

2. Определения и термины

Data Lifecycle
Полный цикл существования данных в организации, включающий этапы: Collection (сбор), Storage (хранение), Analysis (анализ), Visualization (визуализация) и Decision-Making (принятие решений).
Structured Data
Данные с четко определенной схемой, организованные в таблицы (строки и столбцы). Пример: реляционные базы данных (SQL).
Unstructured Data
Информация, не имеющая предопределенной модели данных. Самый массивный тип данных. Пример: изображения, видео, PDF-документы.
Semi-structured Data
Данные, не имеющие жесткой табличной структуры, но содержащие теги или маркеры для разделения элементов. Пример: JSON, XML, логи.
Parquet
Современный бинарный колоночный формат хранения данных. Поддерживает сжатие и хранение схемы. Является стандартом для Big Data.
Web Scraping
Метод автоматического сбора информации с веб-страниц путем программного разбора HTML-кода.
Streaming
Технология непрерывной передачи и обработки данных в реальном времени (например, через Apache Kafka) по мере их возникновения.

3. Структурные схемы

3.1 Компоненты ML

graph TD ML["Разработка ML модели"] ML --> CP["Computing Power
(Мощности)"] ML --> AL["Algorithms
(Алгоритмы)"] ML --> DT["Data
(Данные)"] style DT fill:#f96,stroke:#333,stroke-width:2px

3.2 Пайплайн данных в продакшене

graph LR A[Collection
Kafka] --> B[Storage
HDFS/Parquet] B --> C[Analysis
Spark Jobs] C --> D[Visualization
Dashboards] D --> E[Decision
Marketing]

3.3 Визуализация: CSV (Строки) vs Parquet (Колонки)

Задача: Найти только яблоки (красные круги).

CSV (Row-based)

Приходится читать каждую "коробку" (строку) целиком, даже ненужные фрукты.

Стр.1:
Стр.2:
Parquet (Column-based)

Открываем только "колонку" с яблоками. Остальное игнорируем.

Кол. "Яблоки":

4. Сферы применения

  • Data Engineering: Создание ETL-процессов, оптимизация Data Lakes, конвертация сырых логов (JSON) в Parquet для удешевления хранения.
  • Data Science & ML: Сбор датасетов (scraping), очистка данных, подготовка признаков (feature engineering) для обучения моделей.
  • Business Intelligence (BI): Построение отчетности на основе структурированных данных (SQL), визуализация KPI компании.
  • Real-time Analytics: Мониторинг систем, обнаружение мошенничества (фрода) в банковских транзакциях, персонализация рекламы «на лету» (Streaming).

5. Практический пример

Демонстрация различий форматов и работы с JSON на Python (pandas).

import pandas as pd
import json
import os

# --- 1. Работа с CSV (Традиционный) ---
# Создаем данные
data = {
    'ID': range(1, 10001),
    'Name': ['User'] * 10000,
    'Age': [25] * 10000
}
df = pd.DataFrame(data)

# Сохраняем в CSV
df.to_csv('data.csv', index=False)
csv_size = os.path.getsize('data.csv')
print(f"CSV Size: {csv_size/1024:.2f} KB")

# --- 2. Работа с Parquet (Современный) ---
# Конвертируем в Parquet (требует pyarrow/fastparquet)
df.to_parquet('data.parquet')
pq_size = os.path.getsize('data.parquet')
print(f"Parquet Size: {pq_size/1024:.2f} KB")
# Результат: Parquet будет весить меньше благодаря сжатию

# --- 3. Parsing JSON (Semi-structured) ---
json_str = '{"users": [{"id": 1, "role": "admin"}, {"id": 2, "role": "guest"}]}'
parsed = json.loads(json_str)

# Доступ по ключам
admin_role = parsed['users'][0]['role']
print(f"First user role: {admin_role}")

6. Вопросы для самопроверки

Топик 1: Введение и Жизненный цикл

1. Какие три компонента составляют основу ML?
Вычислительные мощности (Computing Power), Алгоритмы (Algorithms) и Данные (Data).
2. Какую метафору часто используют для описания данных?
«Данные — это новая нефть».
3. Перечислите этапы Data Lifecycle в порядке выполнения.
Collection → Storage → Analysis → Visualization → Decision-Making.
4. На каком этапе инсайты превращаются в действия?
На этапе Decision-Making (Принятие решений).
5. Что происходит на этапе Visualization?
Создание графиков, дашбордов и отчетов для презентации результатов анализа.
6. Является ли процесс работы с данными линейным?
Нет, это циклический процесс (Lifecycle).
7. Какой этап следует сразу за сбором данных?
Storage (Хранение).
8. Какой инструмент упоминался для этапа Analysis в лекции?
Spark jobs, Python, SQL или ML алгоритмы.
9. Для чего нужен этап Collection?
Для получения данных из внешних и внутренних источников (файлы, API, БД).
10. Какова конечная цель всего цикла обработки данных?
Принятие обоснованных бизнес-решений (таргетинг, стратегии).

Топик 2: Типы и Источники данных

1. Какое соотношение структурированных и неструктурированных данных в мире?
Примерно 20% структурированных и 80% неструктурированных.
2. Приведите пример структурированных данных.
Таблицы в реляционных базах данных (SQL), Excel файлы с четкими колонками.
3. Что такое полуструктурированные данные?
Данные без жесткой схемы, но с семантическими тегами. Примеры: JSON, XML, электронные письма.
4. К какому типу данных относятся видео и изображения?
К неструктурированным данным.
5. Что такое Web Scraping?
Технология извлечения данных с веб-страниц (парсинг HTML).
6. Какой формат является стандартом для обмена данными в API?
JSON.
7. Приведите пример использования потоковых данных (Streaming).
Обработка событий Apache Kafka, данные с сенсоров, WebSocket сообщения.
8. Являются ли логи сервера структурированными данными?
Обычно они считаются полуструктурированными или неструктурированными (зависит от формата), часто требуют парсинга.
9. Какие базы данных лучше подходят для структурированных данных?
SQL (Relational) базы данных.
10. Почему неструктурированные данные сложнее обрабатывать?
Они не имеют предопределенной модели, требуют сложных алгоритмов (NLP, Computer Vision) и больше места для хранения.

Топик 3: Форматы данных (CSV vs Parquet)

1. Что означает CSV?
Comma-Separated Values (Значения, разделенные запятыми).
2. Какой тип хранения использует CSV?
Строковый (Row-based). Данные хранятся строка за строкой.
3. Какой тип хранения использует Parquet?
Колоночный (Column-based). Данные хранятся по столбцам.
4. Назовите главное преимущество Parquet для аналитики.
Возможность считывать только нужные колонки, не загружая весь файл.
5. Какой формат поддерживает сжатие данных «из коробки»?
Parquet (и другие современные форматы: ORC, Avro).
6. Хранит ли CSV информацию о типах данных?
Нет, CSV — это просто текст. Схему нужно задавать при чтении.
7. Хранит ли Parquet схему данных?
Да, метаданные о типах хранятся внутри файла.
8. Какой формат читаем человеком (Human-readable)?
CSV (и JSON). Parquet — бинарный формат, человеком не читается.
9. В каком случае CSV может быть предпочтительнее Parquet?
Для обмена небольшими объемами данных, когда важна простота просмотра в текстовом редакторе или Excel.
10. Почему CSV занимает больше места, чем Parquet?
CSV хранит данные как текст с разделителями без сжатия, Parquet использует бинарное кодирование и эффективные алгоритмы сжатия.
© 2025 Конспект лекции создан с помощью AI.
Для курса "Data Collection & Preparation".
Лекция #2: Numerical Computing with NumPy

Numerical Computing with NumPy

Лекция #2 | Aiganym Zhandaulet

1. Тезисы лекции

  1. Проблема Python: Несмотря на популярность в AI/ML (читаемость, экосистема), чистый Python медленный для тяжелых вычислений из-за динамической типизации и накладных расходов памяти.
  2. Решение — NumPy: Библиотека написана на C, что обеспечивает высокую производительность. Она является стандартом для численных вычислений в Python.
  3. Основа NumPy (ndarray): Массивы NumPy хранятся в непрерывных блоках памяти (contiguous memory) и имеют фиксированный тип данных, что делает их компактными и эффективными.
  4. Векторизация: NumPy позволяет выполнять математические операции над целыми массивами без явных циклов (например, умножение массива на число), что значительно быстрее списков Python.
  5. Устройство памяти: В отличие от списков Python (массив указателей на разбросанные объекты), массив NumPy — это единый блок данных + метаданные (размерность, stride).
  6. Slicing (Срезы) как View: При создании среза массива NumPy (slicing) данные не копируются. Создается новый объект-обертка ("view"), который ссылается на тот же буфер памяти.

2. Ключевые определения

NumPy (Numerical Python) Библиотека Python с открытым исходным кодом для работы с многомерными массивами и матрицами, включающая большую коллекцию высокоуровневых математических функций.
Vectorized Operations (Векторизованные операции) Метод выполнения операций над массивами, при котором команда применяется ко всем элементам одновременно (на уровне C), исключая медленные циклы Python.
Contiguous Memory (Непрерывная память) Способ хранения данных, при котором элементы массива располагаются в оперативной памяти последовательно, друг за другом. Это улучшает кэширование процессора.
Strides (Шаги) Количество байтов, которые нужно пропустить в памяти, чтобы перейти к следующему элементу в текущем измерении.
View (Представление) Объект массива, который просматривает данные другого массива (shared data buffer), не создавая их копию. Изменение данных во View меняет исходный массив.

3. Структура и Визуализация

3.1. Почему NumPy быстрее списков? (Memory Layout)

Сравнение хранения данных в памяти:

Python List

Список хранит ссылки на объекты, разбросанные в памяти.

List Head
Int(1)
Int(2)
Int(3)

*Overhead: Type info + Ref count for each item

NumPy Array

Данные упакованы плотно, тип единый для всех.

1
2
3
4

*Raw data buffer (C-style)

3.2. Архитектура массива (Internals)

graph TD subgraph "Python Object (Header)" A["PyObject_HEAD"] B["Shape / Dimensions"] C["Strides"] D["Data Type (dtype)"] end subgraph "Memory Buffer" E["Raw Data: 1, 2, 3, 4..."] end A --> E style A fill:#f9f,stroke:#333 style E fill:#bbf,stroke:#333

3.3. View vs Copy (Slicing)

Пример слайсинга c = a[0:2, :]. Разные заголовки, один буфер данных.

graph LR ObjA[Array 'a' Object] --> Buffer[Shared Data Buffer
0x600...180] ObjC[Array 'c' Object] --> Buffer style Buffer fill:#ff9,stroke:#f66,stroke-width:2px,stroke-dasharray: 5 5

4. Примеры и Код

Векторизация vs Списки

Задача: Умножить каждый элемент на 2.

import numpy as np

# Python List (поведение по умолчанию - дублирование списка)
lst = [1, 2, 3]
print(lst * 2) 
# Результат: [1, 2, 3, 1, 2, 3] (Concatenation)

# NumPy Array (векторизованная математика)
arr = np.array([1, 2, 3])
print(arr * 2)
# Результат: [2 4 6] (Multiplication)

Проверка общей памяти (View)

a = np.array([1, 2, 3, 4])
b = a[0:2]  # Срез - это view

b[0] = 99   # Меняем элемент в срезе
print(a)    
# Результат: [99, 2, 3, 4] -> Исходный массив изменился!

5. Сферы применения

  • Data Science: Очистка данных, манипуляции с таблицами (основа для Pandas).
  • Machine Learning: Операции с матрицами, весами нейросетей (основа для TensorFlow/PyTorch).
  • Обработка изображений: Изображение представляется как 3D массив пикселей (высота, ширина, RGB).
  • Инженерия и физика: Решение систем уравнений, моделирование сигналов.

6. Вопросы для самопроверки

Нажмите на вопрос, чтобы увидеть ответ.

1. Почему "чистый" Python считается медленным для вычислений?
Из-за динамической типизации, интерпретируемой природы и накладных расходов на каждый объект (box overhead).
2. На каком языке написан NumPy для ускорения работы?
Основная вычислительная часть написана на C (и частично Fortran).
3. В чем главное отличие хранения данных в `list` и `np.array`?
List хранит указатели на разбросанные объекты. Array хранит данные компактно в непрерывном блоке памяти (contiguous memory block).
4. Что такое векторизованная операция?
Применение операции ко всему массиву сразу (SIMD) без написания явного цикла `for` на Python.
5. Какой результат даст операция `[1, 2] * 2` для списка Python?
`[1, 2, 1, 2]` (конкатенация), а не математическое умножение.
6. Создает ли операция slicing (срез) в NumPy копию данных?
Нет, по умолчанию создается View (представление), ссылающееся на те же данные в памяти.
7. Что такое `strides` в структуре массива?
Количество байтов, которое нужно пропустить в памяти, чтобы перейти к следующему элементу вдоль измерения.
8. Что означает, что массивы NumPy "типизированы" (typed)?
Все элементы массива должны иметь один и тот же тип данных (например, только `int64`), что экономит память.
9. Какие два порядка хранения многомерных массивов поддерживает NumPy?
Row-major (стиль C, по умолчанию) и Column-major (стиль Fortran).
10. Какая структура языка C лежит в основе массива NumPy?
Структура `PyArrayObject`, определенная в заголовке `ndarraytypes.h`.
© 2025 Generated Lecture Notes. Based on slides by Aiganym Zhandaulet.
Lecture #3: Pandas

Pandas Library

Lecture #3 | Duman Makhanbetov

1. Ключевые тезисы

  1. Фундамент для анализа: Pandas — библиотека Python, ставшая де-факто стандартом для анализа и манипуляции данными. Создана Уэсом МакКинни (Wes McKinney) в 2008 году.
  2. Основа — NumPy: Pandas построен поверх NumPy. Он сохраняет скорость и эффективность вычислений NumPy, добавляя удобство работы с метками, разнородными данными и пропусками.
  3. Две главные структуры:
    • Series: Одномерный именованный массив (аналог столбца в Excel).
    • DataFrame: Двумерная табличная структура (аналог листа Excel или таблицы SQL).
  4. Реальные данные: В отличие от NumPy, Pandas отлично справляется с «грязными» данными реального мира: разными типами в одной таблице (числа, строки, даты), пропущенными значениями и выравниванием по индексам.
  5. Аналогия: Pandas можно представить как «программируемый Excel на стероидах», который сочетает табличный формат Excel с мощью SQL-запросов.

2. Глоссарий терминов

Pandas Высокоуровневая библиотека Python, предоставляющая гибкие структуры данных для очистки, обработки и анализа информации. Название происходит от термина "Panel Data" (панельные данные).
Series (Серия) Одномерная структура данных, содержащая массив значений (как в NumPy) и связанный с ним массив меток, называемый индексом. Поддерживает любой тип данных.
DataFrame (Датафрейм) Двумерная, изменяемая по размеру табличная структура данных с потенциально разнородными типами столбцов. Имеет как строковые индексы (Row Labels), так и названия столбцов (Column Labels).
Index (Индекс) Иммутабельная (неизменяемая) последовательность, используемая для маркировки строк и столбцов. Позволяет выполнять быстрый поиск и выравнивание данных.
Data Cleaning Процесс обнаружения и исправления (или удаления) поврежденных, неточных или отсутствующих данных. Ключевая сила Pandas.

3. Структура и Сравнение

3.1. Иерархия Pandas

Как Pandas расширяет возможности NumPy:

graph TD NumPy["NumPy Arrays
(Скорость + Память)"] Pandas["Pandas Structures
(Метки + Удобство)"] NumPy --> Pandas Pandas --> Series["Series
(1D + Index)"] Pandas --> DataFrame["DataFrame
(2D + Rows/Cols)"] DataFrame --> Index["Index Object"] style NumPy fill:#d4edda,stroke:#28a745,color:#333 style Pandas fill:#cce5ff,stroke:#4d77cf,color:#333

3.2. NumPy vs Pandas

Характеристика NumPy Pandas
Тип данных Гомогенные (только числа) Гетерогенные (смешанные)
Доступ По числовому индексу (0, 1...) По меткам (Label) и индексам
Применение Тяжелые численные расчеты Анализ реальных данных, ETL
Файлы (I/O) Ограничено (binary, txt) Мощное (CSV, Excel, SQL, JSON)

4. Примеры и Код

4.1. Создание Series из NumPy

Pandas построен на NumPy, поэтому легко конвертирует массивы.

import numpy as np
import pandas as pd

# 1. Создаем NumPy массив
np_array = np.array([1, 2, 3, 4, 5])

# 2. Создаем Series
p_series = pd.Series(np_array)

print(p_series.values)
# Вывод: [1 2 3 4 5]

# Примечание: изменение исходного массива может повлиять на Series
# (в зависимости от copy=True/False)
np_array[0] = 9
print(p_series.values) # Часто: [9 2 3 4 5]

4.2. Создание DataFrame

Использование конструктора pd.DataFrame(data, index, ...).

# Данные: словарь списков (наиболее частый способ)
data = {
    'Walmart': [485873, 13643.0, 'USA'],
    'State Grid': [315199, 9571.3, 'China']
}

# Создание DataFrame с кастомным индексом
df = pd.DataFrame(data, index=['Revenues', 'Profits', 'Country'])

# Транспонирование (строки -> столбцы)
df = df.T 
print(df)
#             Revenues  Profits Country
# Walmart       485873  13643.0     USA
# State Grid    315199   9571.3   China

5. Вопросы для самопроверки

Нажмите на вопрос, чтобы увидеть ответ.

1. Какая библиотека является основой для Pandas?
Библиотека NumPy. Pandas использует её для быстрых вычислений и эффективного хранения данных в памяти.
2. В чем разница между Series и DataFrame?
Series — это одномерный массив с метками (1D). DataFrame — это двумерная таблица (2D), состоящая из нескольких Series (столбцов).
3. Кто и когда создал Pandas?
Уэс МакКинни (Wes McKinney) в 2008 году.
4. Можно ли хранить разные типы данных в одном массиве NumPy и в DataFrame?
В стандартном массиве NumPy — нет (он гомогенный). В DataFrame — да, каждый столбец может иметь свой тип данных (числа, строки, даты).
5. Какой параметр конструктора DataFrame отвечает за метки строк?
Параметр index. Если он не передан, используется `np.arange(n)` (0, 1, 2...).
6. Назовите три ключевых преимущества Pandas перед «голым» Python?
1) Обработка пропущенных данных (NaN), 2) Мощные инструменты ввода/вывода (I/O tools), 3) Выравнивание данных по меткам (Label alignment).
7. Какой метод используется для получения описательной статистики?
Метод df.describe(), который показывает среднее, станд. отклонение, минимумы/максимумы и квартили.
8. С какими форматами файлов умеет работать Pandas «из коробки»?
CSV, Excel, SQL, JSON, Parquet и многие другие.
9. Какую аналогию из реальной жизни привели в лекции для Pandas?
Гибрид Excel (табличный вид) и SQL (запросы), способный смешивать числа, текст и даты.
10. Что происходит по умолчанию с параметром copy в конструкторе DataFrame?
По умолчанию он установлен в False. Pandas старается не копировать данные без нужды (быть View), но часто создает копию для безопасности типов.

6. Сферы применения

  • Финансы (FinTech): Анализ временных рядов, котировок акций, риск-менеджмент.
  • Академические исследования: Обработка экспериментальных данных, статистика.
  • Бизнес-аналитика (BI): Подготовка отчетов, расчет KPI, анализ продаж (как автоматизация Excel).
  • Machine Learning: Очистка данных (Data Cleaning) и подготовка признаков (Feature Engineering) перед подачей в модели (Scikit-learn, TensorFlow).
© 2025 Generated Lecture Notes. Based on slides by Duman Makhanbetov.
Lecture #3: Pandas Aggregation & Reshaping

Pandas Aggregation & Reshaping

Lecture #3 | Duman Makhanbetov

1. Ключевые тезисы

  1. Split-Apply-Combine: Основная парадигма группировки данных (GroupBy): разделение данных на группы (Split), применение функции к каждой группе (Apply) и объединение результатов (Combine).
  2. Гибкость агрегации: Pandas предлагает три основных метода для работы с группами: .agg() (сводка/редукция), .transform() (сохранение размерности) и .apply() (гибкая кастомная логика).
  3. Объединение таблиц: Для слияния данных используются merge() (SQL-style joins по ключам), join() (слияние по индексам) и concat() (склеивание по осям).
  4. Изменение формы (Reshaping): Преобразование данных из "длинного" формата в "широкий" (через pivot) и наоборот (через melt) критически важно для анализа и визуализации.
  5. Работа со сложными данными: Использование MultiIndex для иерархических данных и метода explode() для разбиения списков внутри ячеек на отдельные строки.

2. Глоссарий терминов

Aggregation (Агрегация) Процесс вычисления одной сводной статистики (сумма, среднее, макс.) для группы значений. Результат всегда имеет меньшую размерность, чем исходные данные.
Transformation (Трансформация) Операция над группой, которая возвращает объект той же размерности, что и исходная группа. Используется для стандартизации или заполнения пропусков внутри групп.
Pivot (Сводная таблица) Метод преобразования данных из "длинного" формата (long) в "широкий" (wide), где уникальные значения одной колонки становятся заголовками новых столбцов.
Melt (Расплавление) Обратная операция к pivot: преобразование "широкой" таблицы в "длинную", собирая множество столбцов в пары "ключ-значение".
Explode Метод, который превращает каждый элемент списка, находящегося в ячейке DataFrame, в отдельную строку, дублируя остальные значения индекса.

3. Структура и Сравнение

3.1. Парадигма GroupBy

graph LR Data[Input Data] --> Split[Split: Divide into groups] Split --> Apply[Apply: Mean/Sum/Count] Apply --> Combine[Combine: Aggregated Result] style Data fill:#ecf0f1,stroke:#333 style Split fill:#cce5ff,stroke:#4d77cf style Apply fill:#fff3cd,stroke:#f3c44c style Combine fill:#d4edda,stroke:#28a745

3.2. Сравнение методов агрегации

Метод Размер результата Типичное использование
.agg() Сокращенный (1 строка на группу) Получение статистики (сумма, среднее)
.transform() Такой же, как входной (Same size) Feature engineering (нормализация внутри группы)
.apply() Гибкий Сложная кастомная логика, возвращающая разные формы

3.3. Объединение DataFrame

graph TD M[Combining Data] M --> Merge[merge
SQL-style Joins
on Keys] M --> Join[join
Index-based
Joins] M --> Concat[concat
Stacking rows/cols] style Merge fill:#e2e3e5,stroke:#333 style Join fill:#e2e3e5,stroke:#333 style Concat fill:#e2e3e5,stroke:#333

4. Примеры и Код

4.1. Transform (Центрирование данных)

Вычитание среднего значения по группе из каждого элемента этой группы.

# Центрирование данных по регионам
# Результат сохраняет размерность исходного DataFrame
df.groupby("region")["sales"].transform(lambda x: x - x.mean())

4.2. Melt (Wide -> Long)

Преобразование широкой таблицы в длинную для анализа.

# id_vars: колонки-идентификаторы (остаются как есть)
# value_vars: колонки, которые станут строками
pd.melt(df, 
        id_vars=["id"], 
        value_vars=["math", "english"])

4.3. Explode (Работа со списками)

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

df = pd.DataFrame({
    "id": [1, 2],
    "tags": ["book,stationery", "electronics,home"]
})

# 1. Превращаем строку в список
df["tags"] = df["tags"].str.split(",") 

# 2. "Взрываем" список в строки
df_exploded = df.explode("tags")

5. Вопросы для самопроверки

Нажмите на вопрос, чтобы увидеть ответ.

1. В чем главное отличие `.agg()` от `.transform()`?
.agg() возвращает одну строку на группу (редуцирует данные), а .transform() возвращает объект той же длины, что и исходный DataFrame, сохраняя выравнивание строк.
2. Какой метод используется для SQL-подобного объединения таблиц?
Метод merge(). Он поддерживает inner, left, right и outer joins.
3. В чем разница между `pivot()` и `pivot_table()`?
pivot() не поддерживает дубликаты индексов/колонок и просто меняет форму. pivot_table() умеет агрегировать данные (например, суммировать), если для одной пары индекс-колонка есть несколько значений.
4. За что отвечает функция `crosstab()`?
Это специализированная версия pivot_table для быстрого подсчета частот (frequency tables) категориальных переменных.
5. Что делает метод `.explode()`?
Он преобразует колонку, содержащую списки, в формат, где каждый элемент списка становится отдельной строкой.
6. Как получить доступ к строкам в DataFrame с MultiIndex?
Используя кортежи в .loc[]. Например: df.loc[("RegionA", "ProductB")].
7. Какой метод объединения лучше использовать для простого "склеивания" таблиц друг под другом?
pd.concat() с параметром axis=0.

6. Сферы применения

  • Feature Engineering: Создание новых признаков через нормализацию данных внутри групп (используя transform).
  • Подготовка к визуализации: Использование melt для приведения данных в формат "Tidy Data", необходимый для библиотек типа Seaborn или Altair.
  • Маркетинговый анализ: Когортный анализ и сводные отчеты продаж с помощью pivot_table.
  • Обработка текстов (NLP): Очистка тегов и категорий с помощью строковых методов (.str) и explode.
© 2025 Generated Lecture Notes. Based on slides by Duman Makhanbetov.
Data Visualization Basics

Data Visualization Basics

Lecture Notes | Aiganym Zhandaulet

1. Ключевые тезисы

  1. Цели визуализации: Визуализация необходима для трех ключевых процессов: EDA (разведочный анализ), Data Storytelling (передача инсайтов стейкхолдерам) и принятия решений (Decision-Making).
  2. Таблицы vs Графики: Таблицы хороши для точных значений и детального просмотра, тогда как графики (charts) обеспечивают быстрое понимание трендов, паттернов и общей картины.
  3. Экосистема Python:
    • Matplotlib: Фундаментальная, низкоуровневая библиотека, обеспечивающая полный контроль над каждым элементом графика.
    • Seaborn: Высокоуровневая библиотека, построенная поверх Matplotlib. Она интегрирована с Pandas и отлично подходит для статистического анализа.
  4. Принципы хорошего дизайна: Качественная визуализация должна быть честной, ясной и содержательной. Необходимо избегать избыточных цветов, вводящих в заблуждение осей и нагромождения элементов.
  5. Обязательные элементы: Любой график должен иметь заголовок (title), подписи осей (labels) и легенду (legend), если это необходимо для понимания данных.

2. Глоссарий терминов

Exploratory Data Analysis (EDA) Открытый подход к анализу данных, использующий сводную статистику и визуализацию для понимания основных характеристик набора данных, выявления паттернов и аномалий (выбросов).
Data Storytelling Практика создания убедительных повествований (нарративов) для эффективной передачи инсайтов, основанных на данных, заинтересованным сторонам.
Matplotlib Базовая библиотека визуализации в Python (с 2003 года). Является основой для Pandas .plot() и Seaborn. Отличается гибкостью, но требует больше кода (verbose).
Seaborn Библиотека для статистической визуализации данных. Отличается красивыми стилями по умолчанию, простотой синтаксиса и прямой поддержкой Pandas DataFrames.
Scatter Plot (Диаграмма рассеяния) Тип графика, использующий декартовы координаты для отображения значений двух переменных. Идеален для поиска корреляций.

3. Структура и Сравнение

3.1. Зачем нужна визуализация?

graph TD Vis[Data Visualization] Vis --> EDA[EDA
Understand patterns & outliers] Vis --> Story[Storytelling
Convey insights] Vis --> Decision[Decision Making
Assess alternatives] style Vis fill:#4d77cf,stroke:#333,color:#fff style EDA fill:#ecf0f1,stroke:#333 style Story fill:#ecf0f1,stroke:#333 style Decision fill:#ecf0f1,stroke:#333

3.2. Matplotlib vs Seaborn

Характеристика Matplotlib Seaborn
Уровень Low-level, гибкий High-level, простой
Входные данные Списки, NumPy массивы Pandas DataFrames
Стиль по умолчанию Базовый (Basic) Современный, привлекательный
Сильные стороны Полный контроль, кастомизация Статистические графики (box, violin, heatmap)
Сценарий Точная настройка деталей Быстрый EDA и сторителлинг

4. Примеры и Код

4.1. Matplotlib (Scatter Plot)

Требует явного указания всех меток и осей.

import matplotlib.pyplot as plt

# Базовый подход
plt.scatter(tips['total_bill'], tips['tip']) 
plt.xlabel("Total Bill") 
plt.ylabel("Tip") 
plt.title("Scatter Plot with Matplotlib") 
plt.show()

4.2. Seaborn (Scatter Plot)

Интеграция с DataFrame и автоматическая легенда (hue).

import seaborn as sns

# Высокоуровневый подход
# hue="day" автоматически раскрашивает точки по дням и добавляет легенду
sns.scatterplot(
    x="total_bill", 
    y="tip", 
    data=tips, 
    hue="day"
)

4.3. Плохой vs Хороший график

graph LR Bad[Плохой график] --vs--> Good[Хороший график] Bad --> B1[Слишком много цветов] Bad --> B2[Нет подписей осей] Bad --> B3[Вводящий в заблуждение масштаб] Good --> G1[Простой и чистый дизайн] Good --> G2[Есть заголовок и легенда] Good --> G3[Подходящий тип графика] style Bad fill:#ffcccc,stroke:#e74c3c style Good fill:#d4edda,stroke:#28a745

5. Вопросы для самопроверки

Нажмите на вопрос, чтобы увидеть ответ.

1. В чем главное различие между таблицами и графиками?
Таблицы подходят для детального просмотра точных значений, а графики — для быстрого понимания общей картины, трендов и сравнений.
2. Что такое EDA?
Exploratory Data Analysis (Разведочный анализ данных) — процесс предварительного анализа данных для поиска паттернов, аномалий и формулирования гипотез.
3. На какой библиотеке основан Seaborn?
Seaborn построен поверх Matplotlib.
4. Какой тип данных лучше всего принимает Seaborn?
Seaborn оптимизирован для работы напрямую с Pandas DataFrame.
5. Назовите три признака "плохой" визуализации.
1) Отсутствие подписей/заголовков, 2) Вводящие в заблуждение оси (Misleading axes), 3) Неправильный выбор типа графика.
6. Для чего используется параметр `hue` в Seaborn?
Параметр `hue` позволяет добавить третье измерение (категорию) на график, окрашивая элементы в разные цвета в зависимости от значения колонки.
7. Когда стоит выбрать Matplotlib вместо Seaborn?
Когда требуется полный низкоуровневый контроль над каждым элементом графика или сложная кастомизация, которую трудно сделать стандартными средствами Seaborn.
8. Какой тип графика лучше всего подходит для анализа распределения одной переменной?
Гистограмма (Histogram) или Boxplot.
9. Что означает термин "verbose" применительно к Matplotlib?
Это означает, что для создания полноценного графика требуется написать много строк кода (настройка осей, меток, легенды вручную).
10. Какое золотое правило визуализации упомянуто в лекции?
Хорошая визуализация = ясная, честная и содержательная (clear, honest, insightful).

6. Сферы применения

  • Business Intelligence (BI): Создание дашбордов для отслеживания KPI и метрик компании.
  • Data Science Pipeline: Этап EDA для понимания данных перед обучением ML-моделей (поиск выбросов, анализ распределений).
  • Научные публикации: Создание точных и наглядных графиков для иллюстрации результатов исследований (обычно с помощью Matplotlib).
  • Презентации: Data Storytelling для обоснования бизнес-решений перед руководством.
© 2025 Generated Lecture Notes. Based on slides by Aiganym Zhandaulet.
Working with APIs

Working with APIs

Lecture Notes | Duman Makhanbetov

1. Ключевые тезисы

  1. Роль API в сборе данных: API (Application Programming Interface) является мостом между различными программными компонентами, позволяя бесшовно собирать данные, получать доступ к информации в реальном времени и интегрировать ML/AI решения.
  2. Доминирование REST: REST является наиболее распространенным архитектурным стилем для веб-API, использующим стандартные HTTP-методы (GET, POST, PUT, DELETE) и JSON для передачи данных.
  3. Разнообразие архитектур: Помимо REST, существуют SOAP (строгий XML-протокол для энтерпрайза) и GraphQL (гибкий язык запросов от Facebook, предотвращающий избыточную выборку данных).
  4. Жизненный цикл запроса: Работа с API строится на модели «Клиент-Сервер»: Клиент отправляет Request (запрос) → Сервер обрабатывает его → Сервер возвращает Response (ответ).
  5. Важность ограничений и безопасности: При работе с API критически важно учитывать аутентификацию (API Keys, OAuth) и лимиты запросов (Rate Limits) для стабильной работы приложений.

2. Глоссарий терминов

API (Application Programming Interface) Набор правил и протоколов, который позволяет одному программному обеспечению взаимодействовать с другим. Определяет методы запроса и отправки данных.
REST (Representational State Transfer) Архитектурный стиль API, использующий протокол HTTP. Он является stateless (без сохранения состояния), ресурсы имеют уникальные URL (endpoint), а данные чаще всего передаются в формате JSON.
Endpoint (Конечная точка) Уникальный URL-адрес, который представляет собой конкретный ресурс в API (например, `https://api.example.com/users/123`).
SOAP (Simple Object Access Protocol) Протокол обмена структурированными сообщениями на основе XML. Отличается строгими правилами, высокой надежностью и поддержкой сложных транзакций (популярен в банках).
GraphQL Язык запросов для API, разработанный Facebook. Позволяет клиенту точно указывать, какие поля данных ему нужны, избегая проблемы overfetching (получения лишних данных).
Rate Limit Ограничение количества запросов, которые клиент может отправить к API за определенный промежуток времени (защита от перегрузки). Код ошибки: 429.

3. Структура и Сравнение

3.1. Аналогия "Ресторан"

Простая ментальная модель работы API:

graph LR Menu["Меню = API"] --> Client["Клиент делает Заказ (Request)"] Client --> Kitchen["Кухня = Сервер"] Kitchen --> Meal["Блюдо = Ответ (Response)"] style Menu fill:#f3c44c,stroke:#333 style Client fill:#ecf0f1,stroke:#333 style Kitchen fill:#4d77cf,stroke:#333,color:#fff style Meal fill:#d4edda,stroke:#28a745

3.2. Сравнение архитектурных стилей

Характеристика REST SOAP GraphQL
Формат данных JSON / XML Только XML Кастомный язык запросов
Эндпоинты Много (под каждый ресурс) Один на операцию Единый эндпоинт
Гибкость Высокая Низкая (жесткая структура) Очень высокая
Сложность Просто (Easy) Сложно (Complex) Мощно, но требует обучения
Применение Веб и мобильные приложения Enterprise, банкинг, legacy Сложные UI, минимизация трафика

3.3. HTTP Методы (CRUD)

graph TD CRUD[Данные] CRUD --> GET[GET: Read / Retrieve] CRUD --> POST[POST: Create / Add new] CRUD --> PUT[PUT: Update / Replace full record] CRUD --> PATCH[PATCH: Modify / Partial update] CRUD --> DELETE[DELETE: Remove data]

4. Примеры и Код

4.1. Работа с REST API (Python)

Использование библиотеки requests для получения данных (например, ВВП Казахстана от World Bank API).

import requests

# 1. Определение URL (Endpoint)
# Пример API Всемирного банка
url = "http://api.worldbank.org/v2/country/kz/indicator/NY.GDP.MKTP.CD"

# 2. Параметры запроса (Query Parameters)
params = {
    "format": "json",
    "date": "2020:2022"
}

# 3. Выполнение GET запроса
response = requests.get(url, params=params)

# 4. Проверка статуса (200 = OK)
if response.status_code == 200:
    data = response.json() # Парсинг JSON
    # Вывод данных (структура зависит от API)
    for entry in data[1]:
        print(f"Year: {entry['date']}, GDP: ${entry['value']}")
else:
    print(f"Error: {response.status_code}")

4.2. Пример GraphQL запроса

Клиент запрашивает только название, столицу и население для страны с кодом "KZ".

{
  country(code: "KZ") {
    name
    capital
    population
  }
}

5. Вопросы для самопроверки

Нажмите на вопрос, чтобы увидеть ответ.

1. Что означает аббревиатура API?
Application Programming Interface (Программный интерфейс приложения).
2. Какой HTTP метод используется для создания новых данных?
POST.
3. В чем ключевое отличие PUT от PATCH?
PUT заменяет запись целиком (полное обновление), а PATCH изменяет только указанные поля (частичное обновление).
4. Какой код состояния HTTP говорит об успешном выполнении запроса?
Коды группы 2xx (обычно 200 OK, 201 Created).
5. Что такое Rate Limit и какой код ошибки он вызывает?
Ограничение частоты запросов. При превышении сервер возвращает ошибку 429 Too Many Requests.
6. Какой формат данных использует SOAP?
Только XML.
7. Какую проблему решает GraphQL по сравнению с REST?
Проблему Overfetching (получение лишних данных) и Underfetching, позволяя запрашивать ровно то, что нужно, в одном запросе.
8. Назовите примеры методов аутентификации в API.
Basic Auth, API Keys, Token Auth, OAuth.
9. Какие компоненты составляют URL запроса в REST?
Base URL, Resource (путь), Path Parameters (например, ID) и Query Parameters (фильтры после ?).
10. Для каких систем чаще всего используется SOAP?
Для банковских, правительственных и корпоративных систем, где важна высокая надежность, строгая типизация и безопасность транзакций.

6. Сферы применения

  • Сбор данных (Data Collection): Автоматизированный сбор статистики с порталов открытых данных (gov.kz, Open Data Inception) для аналитики.
  • Интеграция сервисов: Подключение платежных систем, карт, погодных сервисов в мобильные и веб-приложения.
  • Machine Learning: Получение датасетов для обучения моделей и деплой моделей как API-сервисов для предсказаний.
  • Мобильная разработка: Обмен данными между сервером и приложением (часто через GraphQL для экономии трафика).
© 2025 Generated Lecture Notes. Based on slides by Duman Makhanbetov.
Web Scraping I (Static Pages)

Web Scraping I (Static Pages)

Lecture Notes | Duman Makhanbetov

1. Ключевые тезисы

  1. Актуальность скрейпинга: Современные данные редко доступны в удобных CSV-файлах. Веб-скрейпинг позволяет собирать, анализировать и автоматизировать получение ценной информации с веб-сайтов для исследований, бизнеса и журналистики.
  2. Структура веба (HTML): Понимание HTML критично. Страницы состоят из тегов, атрибутов и вложенных элементов. Браузерные "Developer Tools" (F12) — главный инструмент для исследования этой структуры.
  3. Инструментарий Python: Стандартный стек для статических страниц включает библиотеку requests для загрузки HTML и BeautifulSoup для парсинга (разбора) и навигации по дереву тегов.
  4. Этика и законность: Скрейпинг должен быть этичным. Необходимо соблюдать правила robots.txt, не перегружать серверы запросами, идентифицировать своего бота (User-Agent) и не нарушать авторские права.

2. Глоссарий терминов

HTML (HyperText Markup Language) Язык разметки документов, определяющий структуру и контент веб-страницы. Состоит из тегов (tags), атрибутов (attributes) и вложенных элементов.
Web Scraping Автоматизированный процесс извлечения данных с веб-сайтов с помощью программного кода.
BeautifulSoup Библиотека Python для парсинга HTML и XML документов. Она создает дерево разбора из исходного кода страницы, позволяя легко искать и извлекать данные.
requests Популярная библиотека Python для отправки HTTP-запросов (GET, POST и др.) и получения HTML-кода страниц.
robots.txt Текстовый файл в корне домена (например, example.com/robots.txt), содержащий инструкции для ботов: какие страницы можно сканировать, а какие — запрещено (Disallow).

3. Структура и Логика

3.1. Структура HTML элемента

Пример: <p class="text">Hello World</p>

graph TD Tag[HTML Element] Tag --> Open["Opening Tag: <p>"] Tag --> Attr["Attribute: class='text'"] Tag --> Content["Content: Hello World"] Tag --> Close["Closing Tag: </p>"] style Tag fill:#f3c44c,stroke:#333 style Content fill:#4d77cf,stroke:#333,color:#fff

3.2. Основные HTML теги для скрейпинга

Тег Описание Что извлекаем?
<div>, <span>, <p> Блоки контента и текст Текст (.get_text())
<a href="..."> Гиперссылки Атрибут href (ссылка)
<img src="..."> Изображения Атрибут src (адрес картинки)
<ul>, <ol>, <li> Списки Элементы списка
<table>, <tr>, <td> Таблицы Табличные данные

4. Примеры и Код

4.1. Шаг 1: Получение страницы (Requests)

import requests

url = "https://quotes.toscrape.com/"
# Важно: используйте User-Agent, чтобы выглядеть как браузер
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)..."
}

response = requests.get(url, headers=headers)

if response.status_code == 200:
    html_content = response.text
    print("Page downloaded successfully!")
else:
    print(f"Failed to retrieve page: {response.status_code}")

4.2. Шаг 2: Парсинг (BeautifulSoup)

from bs4 import BeautifulSoup

# Создаем объект супа
soup = BeautifulSoup(html_content, "html.parser")

# Пример 1: Поиск одного элемента
title = soup.find("h1").get_text(strip=True)

# Пример 2: Поиск всех элементов определенного класса
quotes = soup.find_all("span", class_="text")

for quote in quotes:
    print(quote.get_text())

4.3. Реальный пример: Извлечение данных о товаре

Допустим, HTML выглядит так: <div class="product"><h2>Phone X</h2><span class="price">$999</span></div>

# Логика извлечения
product_block = soup.find("div", class_="product")

data = {
    "name": product_block.find("h2").get_text(),
    "price": product_block.find("span", class_="price").get_text()
}
print(data) 
# Output: {'name': 'Phone X', 'price': '$999'}

5. Ответственный скрейпинг

  • Проверяйте robots.txt: Всегда заходите на domain.com/robots.txt перед началом работы, чтобы узнать правила.
  • Не спешите: Используйте задержки (time.sleep(1)) между запросами, чтобы не "уронить" чужой сервер (DoS-атака).
  • Представьтесь: Указывайте контактные данные или честный User-Agent в заголовках.
  • Не воруйте: Не скрейпите персональные данные или контент, защищенный авторским правом, для перепродажи.
  • ???? Ищите API: Если у сайта есть официальный API, всегда используйте его вместо скрейпинга.

6. Вопросы для самопроверки

Нажмите на вопрос, чтобы увидеть ответ.

1. В чем разница между методами `.find()` и `.find_all()`?
.find() возвращает первый найденный элемент (или None), а .find_all() возвращает список всех подходящих элементов.
2. Какой статус код HTTP говорит об успешной загрузке страницы?
Код 200.
3. Зачем нужно передавать `headers` с `User-Agent` в запросе?
Многие сайты блокируют запросы от скриптов (например, python-requests). User-Agent позволяет "притвориться" обычным браузером.
4. Как открыть инструменты разработчика в браузере?
Нажать F12 или Ctrl+Shift+I (Cmd+Opt+I на Mac).
5. Где находится файл с правилами для ботов на сайте?
В корне домена, по адресу /robots.txt.
6. Как извлечь ссылку из тега `<a href="url">`?
Обращаясь к элементу как к словарю: element["href"].
7. Какой метод BeautifulSoup позволяет искать по CSS-селекторам?
Метод .select().
8. Почему стоит избегать слишком частых запросов к сайту?
Это создает нагрузку на сервер (этическое нарушение) и может привести к блокировке вашего IP-адреса.
© 2025 Generated Lecture Notes. Based on slides by Duman Makhanbetov.
Lecture #8: Web Scraping II (Dynamic Pages)

Web Scraping II (Dynamic Pages)

Lecture Notes | Duman Makhanbetov

1. Ключевые тезисы

  1. Ограничения статического скрейпинга: Библиотеки типа requests скачивают только исходный HTML. На современных сайтах (React, Vue) данные загружаются через JavaScript/AJAX уже после загрузки страницы, поэтому статический подход возвращает пустые блоки.
  2. Браузерная автоматизация: Для динамических страниц необходимы инструменты (Selenium, Playwright), которые запускают реальный браузер, выполняют JavaScript и позволяют извлечь "Final DOM" (итоговую структуру страницы).
  3. Selenium: Классический инструмент, изначально созданный для тестирования. Работает через WebDriver, поддерживает множество языков и браузеров, но требует настройки драйверов и ручного управления ожиданиями.
  4. Playwright: Современный фреймворк от Microsoft (2020). Быстрее и надежнее Selenium, имеет встроенные драйверы, поддерживает "headless" режим по умолчанию и автоматические ожидания (Auto-waiting), что снижает количество ошибок.
  5. Оптимизация: Для ускорения скрейпинга следует использовать Headless-режим (без графического интерфейса), блокировать загрузку картинок/ресурсов, использовать явные ожидания (Explicit Waits) вместо time.sleep().

2. Глоссарий терминов

Dynamic Page (Динамическая страница) Веб-страница, контент которой генерируется в браузере клиента с помощью JavaScript после получения исходного HTML от сервера.
Headless Mode Режим запуска браузера без графического интерфейса пользователя (GUI). Позволяет экономить ресурсы и ускоряет выполнение скриптов на серверах.
WebDriver Основной компонент Selenium, который переводит команды кода (Python) в действия реального браузера (клики, ввод текста, навигация).
DOM (Document Object Model) Структура HTML-документа. В динамическом скрейпинге важно извлекать данные из "Final DOM" — состояния дерева после выполнения всех скриптов.
Explicit Wait (Явное ожидание) Метод ожидания, при котором скрипт приостанавливается до наступления определенного условия (например, появление кнопки), вместо жесткой паузы по времени.

3. Структура и Сравнение

3.1. Workflow динамического скрейпинга

graph LR Load[1. Load Page] --> Wait[2. Wait for JS
to execute] Wait --> Extract[3. Extract
Final DOM] Extract --> Parse[4. Parse &
Store Data] style Load fill:#ecf0f1,stroke:#333 style Wait fill:#f3c44c,stroke:#333 style Extract fill:#4d77cf,stroke:#333,color:#fff style Parse fill:#d4edda,stroke:#28a745

3.2. Selenium vs Playwright

Характеристика Selenium Playwright
Драйверы Требуются отдельные (ChromeDriver) Встроенные (Built-in)
Скорость Средняя Высокая (асинхронность)
Ожидания (Waits) Ручные (Explicit Waits) Автоматические (Auto-wait)
Надежность Хорошая, но возможны "flaky" тесты Отличная (меньше ошибок)
Установка Простая, но нужно следить за версиями Требует `playwright install`

4. Примеры и Код

4.1. Selenium: Основы и Ожидания

Инициализация драйвера и использование WebDriverWait для надежности.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Инициализация Chrome
driver = webdriver.Chrome()

# Загрузка страницы
driver.get("https://quotes.toscrape.com/js/")

# Явное ожидание загрузки элемента (вместо time.sleep)
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, "quote"))
)

# Извлечение данных
quotes = driver.find_elements(By.CLASS_NAME, "quote")
for q in quotes:
    print(q.text)

driver.quit()

4.2. Playwright: Современный подход

Использование синхронного API. Браузер запускается в headless-режиме по умолчанию.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    # Запуск браузера (Chromium)
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    
    # Переход на страницу (авто-ожидание загрузки)
    page.goto("https://quotes.toscrape.com/js/")
    
    # Локатор элементов
    quotes = page.locator(".quote")
    
    # Получение текста первого элемента
    print(quotes.nth(0).inner_text())
    
    browser.close()

4.3. Оптимизация: Headless Mode (Selenium)

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
# Запуск без графического интерфейса
chrome_options.add_argument('--headless') 

driver = webdriver.Chrome(options=chrome_options)

5. Вопросы для самопроверки

Нажмите на вопрос, чтобы увидеть ответ.

1. В чем главное отличие динамической страницы от статической?
На статической странице HTML загружается сразу с сервера. На динамической HTML генерируется или изменяется в браузере с помощью JavaScript после загрузки.
2. Почему `requests.get()` не работает для сайтов на React/Vue?
Потому что requests скачивает только начальный HTML, но не исполняет JavaScript, который подгружает реальные данные.
3. Что такое JSON Wire Protocol в Selenium?
Это протокол, через который клиентская библиотека Selenium отправляет команды драйверу браузера (Browser Driver).
4. Зачем использовать Headless Mode?
Для ускорения работы (не тратится время на отрисовку UI) и для запуска скриптов на серверах, где нет дисплея.
5. Почему `time.sleep()` считается плохой практикой?
Это ненадежно (интернет может тормозить, и скрипт упадет) и неэффективно (скрипт ждет дольше, чем нужно). Лучше использовать явные ожидания.
6. Какое ключевое преимущество Playwright перед Selenium в плане ожиданий?
Playwright имеет **Auto-wait**: он автоматически ждет, пока элемент станет доступным и активным, перед тем как выполнить действие (клик, ввод текста).
7. Что такое Browser Context в Playwright?
Изолированная сессия браузера (аналог режима инкогнито). Позволяет запускать тесты параллельно с разными куками/логинами без перезапуска браузера.
8. Как получить доступ к элементам после того, как JS отрендерил страницу?
Нужно искать элементы в **Final DOM** (Document Object Model) с помощью методов драйвера (например, `driver.find_elements`).
9. Какие браузеры поддерживает Playwright?
Chromium (Chrome, Edge), Firefox и WebKit (Safari).
10. Когда НЕ стоит использовать Browser Automation?
Если у сайта есть доступный API, если данные статичны, или если требуется очень высокая скорость и масштабируемость (тысячи страниц).

6. Советы по оптимизации

  • Используйте Headless: Всегда включайте для продакшна.
  • Блокируйте ресурсы: Отключайте загрузку изображений, CSS и шрифтов в настройках браузера, чтобы экономить трафик и память.
  • Закрывайте сессии: Всегда вызывайте driver.quit() или browser.close(), чтобы не забить оперативную память "зомби-процессами".
  • Кэширование: Если возможно, сохраняйте загруженные страницы, чтобы не загружать их повторно при отладке.
© 2025 Generated Lecture Notes. Based on slides by Duman Makhanbetov.
Data Cleaning & Validation

Data Cleaning & Validation

Instructor: Duman Makhanbetov

1. Ключевые тезисы

  1. Важность очистки данных: Принцип "Garbage In, Garbage Out". Очистка обеспечивает точность анализа, предотвращает смещение (bias) и экономит время на этапе моделирования.
  2. Инструментарий: Полный цикл работы с качеством данных включает: pandas (очистка), re (Regex для строк), pandera (валидация схем) и ydata-profiling (автоматические отчеты).
  3. Работа с пропусками: Пропуски (NaN) возникают из-за ошибок ввода или сбоев сенсоров. Их можно удалять (если данных много) или заполнять (средним, медианой, forward/backward fill) в зависимости от контекста.
  4. Типы данных и дубликаты: Корректные типы данных (особенно datetime и category) критичны для производительности и корректной сортировки. Дубликаты следует удалять с осторожностью, проверяя, не являются ли они частью временных рядов или транзакций.
  5. Валидация и Профилирование: Использование Pandera позволяет задать жесткие правила (схемы) для данных и ломать пайплайны при их нарушении. Data Profiling — это финальный этап автоматического исследования данных перед моделированием.

2. Глоссарий терминов

Regular Expressions (Regex) Язык шаблонов для поиска и манипуляций с текстом. Позволяет находить сложные паттерны (email, телефоны) и очищать строки от лишних символов.
Coercion (Принуждение типа) Процесс принудительного преобразования данных в другой тип (например, строки в числа). Параметр errors='coerce' превращает ошибочные значения в NaN.
Pandera Библиотека Python для валидации DataFrame. Позволяет описывать схемы данных, типы колонок и логические проверки (checks) в декларативном стиле.
Categorical Data Type Тип данных в Pandas, эффективный для столбцов с повторяющимися строковыми значениями (например, города, статусы). Экономит память и ускоряет группировку.
Data Profiling Автоматизированный процесс исследования набора данных, который генерирует отчет со статистикой, распределениями, корреляциями и предупреждениями о проблемах.

3. Структура и Сравнение

3.1. Workflow качества данных

graph LR Raw["Raw Data"] --> Clean["Cleaning (Pandas/Regex)"] Clean --> Validate["Validation (Pandera)"] Validate --> Profile["Profiling (ydata)"] Profile --> Model["Modeling / Analysis"] style Raw fill:#ecf0f1,stroke:#333 style Clean fill:#4d77cf,stroke:#333,color:#fff style Validate fill:#f3c44c,stroke:#333 style Profile fill:#28a745,stroke:#333,color:#fff style Model fill:#d4edda,stroke:#333

3.2. Методы заполнения пропусков

Метод Описание Применение
.fillna(value) Замена константой (0, "Unknown") Категории, счетчики
.fillna(mean/median) Замена статистикой Числовые данные (возраст, цена)
.ffill() / .bfill() Протягивание значений вперед/назад Временные ряды (погода, акции)

4. Примеры и Код

4.1. Очистка строк с Regex

Удаление всего, кроме цифр, и валидация email.

# Оставить только цифры в телефоне (\D+ удаляет не-цифры)
df["phone"] = df["phone"].str.replace(r"\D+", "", regex=True)

# Извлечение домена из email
df["domain"] = df["email"].str.extract(r"@([A-Za-z0-9.-]+)")

4.2. Безопасное преобразование типов

Использование errors='coerce' для превращения ошибок в NaN.

# Если "123a" не число -> превратится в NaN
df["price"] = pd.to_numeric(df["price"], errors="coerce")

# Конвертация в даты
df["date"] = pd.to_datetime(df["date"], errors="coerce")

4.3. Валидация с Pandera

import pandera as pa
from pandera import Column, Check, DataFrameSchema

schema = DataFrameSchema({
    # Проверка: возраст от 0 до 120
    "age": Column(pa.Int, Check.in_range(0, 120)),
    
    # Проверка: зарплата больше 0
    "salary": Column(pa.Float, Check.greater_than(0)),
    
    # Проверка email по regex
    "email": Column(pa.String, Check.str_matches(r".+@.+\..+"))
})

# Валидация (вызовет ошибку, если данные плохие)
validated_df = schema.validate(df)

5. Вопросы для самопроверки

Нажмите на вопрос, чтобы увидеть ответ.

1. В чем разница между `df.isna()` и `df.notna()`?
df.isna() возвращает True для пропущенных значений, а df.notna() — для существующих (непустых).
2. Что делает параметр `inplace=True`?
Он применяет изменения к DataFrame напрямую, без создания копии и необходимости присваивания результата переменной.
3. Когда НЕ стоит удалять дубликаты?
Если повторения являются частью логики данных, например, повторные покупки одного клиента или транзакции в одном городе в одно время.
4. Какое преимущество дает тип данных `category`?
Экономит память и ускоряет операции (сортировка, группировка) для столбцов с небольшим набором повторяющихся строковых значений.
5. Что делает regex шаблон `\d+`?
Он находит одну или более цифр подряд.
6. Зачем использовать Pandera в ETL пайплайнах?
Чтобы автоматически останавливать выполнение пайплайна и выдавать ошибку, если входные данные не соответствуют ожидаемой схеме (например, появились отрицательные цены).
7. Какой метод используется для профилирования данных одной строкой?
ProfileReport(df) из библиотеки ydata-profiling.
8. Как удалить строки, где пропущены значения в конкретном столбце "email"?
df.dropna(subset=["email"]).
9. Что произойдет при `df["age"].astype(int)`, если в столбце есть NaN?
Возникнет ошибка, так как стандартный тип int в старых версиях Pandas не поддерживает NaN. Нужно использовать float или специальный Int64.
10. Что делает метод `.strip()` для строк?
Удаляет пробельные символы (пробелы, табы, переносы строк) в начале и в конце строки.

6. Сферы применения

  • ETL Pipelines: Валидация промежуточных таблиц перед загрузкой в хранилище данных (Data Warehouse).
  • Machine Learning: Подготовка данных для обучения моделей (заполнение пропусков, кодирование категорий, удаление выбросов).
  • Финансовый аудит: Поиск логических ошибок (например, дата начала контракта позже даты окончания) с помощью кросс-колоночных проверок Pandera.
  • Маркетинг: Очистка базы email-адресов и телефонов клиентов с помощью Regex для рассылок.
© 2025 Generated Lecture Notes. Based on slides by Duman Makhanbetov.
Lecture #10: Collecting Data from Databases

Collecting Data from Databases

Lecture #10 | Duman Makhanbetov

1. Key Theses

  1. Data Reality: Real business data is stored in databases, not just CSVs. Direct database access is crucial for efficiency and real-time analysis.
  2. Efficiency of SQL: Unlike downloading entire files, SQL allows extracting only the required data (filtering, aggregating) before it reaches your Python environment.
  3. Relational Power: The ability to combine data from multiple sources (JOINs) is the foundation of relational data modeling.
  4. Advanced Analytics: Modern SQL capabilities like Window Functions (running totals, rankings) and CTEs (Common Table Expressions) allow for complex logic directly in the database.
  5. Python Integration: Libraries like SQLAlchemy and Pandas provide a seamless bridge to automate data extraction (ETL pipelines).
  6. Pipeline Strategy: A robust data pipeline involves scraping/fetching data -> storing in a temporary DB (like SQLite) -> processing with SQL -> exporting to the final destination.

2. Glossary

Primary Key (PK) A unique identifier for a specific record in a table. It ensures no duplicate rows exist for that entity (e.g., `order_id`).
Foreign Key (FK) A field that refers to the Primary Key in another table. It establishes the relationship (link) between two tables.
JOIN An SQL operation used to combine rows from two or more tables based on a related column (the Key).
Window Function An SQL function that performs calculations across a set of table rows ("window") that are somehow related to the current row. Unlike `GROUP BY`, it does not collapse rows.
CTE (Common Table Expression) A temporary named result set (defined using `WITH`) that exists only for the duration of a single SQL statement. Improves query readability.
SQLAlchemy A popular Python SQL toolkit and Object-Relational Mapper (ORM) that creates the "engine" to connect Python scripts to databases.

3. Visual Structures

3.1. Data Pipeline Schema

The flow of data from the web to a data warehouse.

graph LR Web[Web Scraper / API] --> Pandas[Pandas DataFrame] Pandas --> SQLite[Save to SQLite DB] SQLite --> SQL[Execute SQL Queries] SQL --> Export[Export to CSV / Data Warehouse] style Web fill:#ecf0f1,stroke:#333 style Pandas fill:#f3c44c,stroke:#333 style SQLite fill:#4d77cf,stroke:#333,color:#fff style SQL fill:#4d77cf,stroke:#333,color:#fff style Export fill:#d4edda,stroke:#28a745

3.2. Visualizing JOIN Types

JOIN Type Description Result Logic
INNER JOIN Returns records that have matching values in both tables. Intersection (A ∩ B)
LEFT JOIN Returns all records from the left table, and the matched records from the right table. Left Side (A)
RIGHT JOIN Returns all records from the right table, and the matched records from the left table. Right Side (B)
FULL OUTER JOIN Returns all records when there is a match in either left or right table. Union (A ∪ B)

4. Practical Examples

4.1. Advanced SQL: Window Functions & CTE

Calculating a running total using a CTE for cleaner code.

-- Common Table Expression (CTE)
WITH high_value_orders AS (
    SELECT order_id, customer_id, total_amount
    FROM orders
    WHERE total_amount > 500
)

-- Window Function: Running Total
SELECT 
    order_id, 
    customer_id,
    total_amount,
    SUM(total_amount) OVER (
        PARTITION BY customer_id 
        ORDER BY order_date
    ) AS running_total
FROM high_value_orders;

4.2. Python Integration (SQLAlchemy + Pandas)

Connecting to a database and reading/writing data.

import pandas as pd
from sqlalchemy import create_engine

# 1. Create Connection Engine (SQLite example)
engine = create_engine('sqlite:///data.db')

# 2. Writing Data: Pandas -> Database
# Saves dataframe to 'jobs' table
df.to_sql('jobs', engine, index=False, if_exists='replace')

# 3. Reading Data: Database -> Pandas
# Executes SQL query and returns DataFrame
query = "SELECT * FROM jobs WHERE salary > 100000"
df_result = pd.read_sql(query, engine)

print(df_result.head())

5. Self-Check Questions

Tap to reveal answers.

1. Why is it better to use SQL for filtering data rather than Pandas?
Efficiency. SQL filters data before transferring it over the network/loading into memory. Loading a huge table into Pandas just to filter it consumes unnecessary RAM.
2. What is the difference between INNER JOIN and LEFT JOIN?
INNER JOIN keeps only rows present in both tables. LEFT JOIN keeps all rows from the left table, filling missing matches from the right table with NULLs.
3. What does a Window Function allow you to do that GROUP BY cannot?
Window functions perform calculations (like running totals or rankings) without collapsing the rows. GROUP BY reduces the number of rows to one per group.
4. What is the role of SQLAlchemy in Python data engineering?
It acts as a bridge (ORM/Toolkit) allowing Python to communicate with various SQL databases using a unified syntax, handling connections and query execution.
5. Why use a CTE (WITH clause)?
To break down complex queries into readable, modular parts. It creates a temporary result set that can be referenced like a table in the main query.
6. What is the main difference between PostgreSQL and MongoDB?
PostgreSQL is a relational (structured) database using tables and SQL. MongoDB is a NoSQL (schema-free) database using JSON-like documents.
7. What does `if_exists='replace'` do in `df.to_sql`?
It drops the existing table in the database and creates a new one with the data from the DataFrame.

6. Real-World Applications

  • ETL Pipelines: Extracting raw data from APIs, storing in a staging DB (SQLite/Postgres), transforming with SQL, and loading into a Data Warehouse.
  • Financial Analytics: Using Window Functions to calculate running balances, moving averages of stock prices, or year-to-date revenue.
  • Customer Segmentation: Using complex JOINs to combine user profiles, purchase history, and website activity logs for marketing analysis.
  • Data Caching: Using a local database to store scraped web data to avoid re-scraping and risking IP bans.
© 2025 Generated Lecture Notes. Based on slides by Duman Makhanbetov.
Lecture #10: Collecting Data from Databases

Collecting Data from Databases

Lecture #10 | Duman Makhanbetov

1. Key Theses

  1. Data Reality: Real business data is stored in databases, not just CSVs. Direct database access is crucial for efficiency and real-time analysis.
  2. Efficiency of SQL: Unlike downloading entire files, SQL allows extracting only the required data (filtering, aggregating) before it reaches your Python environment.
  3. Relational Power: The ability to combine data from multiple sources (JOINs) is the foundation of relational data modeling.
  4. Advanced Analytics: Modern SQL capabilities like Window Functions (running totals, rankings) and CTEs (Common Table Expressions) allow for complex logic directly in the database.
  5. Python Integration: Libraries like SQLAlchemy and Pandas provide a seamless bridge to automate data extraction (ETL pipelines).
  6. Pipeline Strategy: A robust data pipeline involves scraping/fetching data -> storing in a temporary DB (like SQLite) -> processing with SQL -> exporting to the final destination.

2. Glossary

Primary Key (PK) A unique identifier for a specific record in a table. It ensures no duplicate rows exist for that entity (e.g., `order_id`).
Foreign Key (FK) A field that refers to the Primary Key in another table. It establishes the relationship (link) between two tables.
JOIN An SQL operation used to combine rows from two or more tables based on a related column (the Key).
Window Function An SQL function that performs calculations across a set of table rows ("window") that are somehow related to the current row. Unlike `GROUP BY`, it does not collapse rows.
CTE (Common Table Expression) A temporary named result set (defined using `WITH`) that exists only for the duration of a single SQL statement. Improves query readability.
SQLAlchemy A popular Python SQL toolkit and Object-Relational Mapper (ORM) that creates the "engine" to connect Python scripts to databases.

3. Visual Structures

3.1. Data Pipeline Schema

The flow of data from the web to a data warehouse.

graph LR Web[Web Scraper / API] --> Pandas[Pandas DataFrame] Pandas --> SQLite[Save to SQLite DB] SQLite --> SQL[Execute SQL Queries] SQL --> Export[Export to CSV / Data Warehouse] style Web fill:#ecf0f1,stroke:#333 style Pandas fill:#f3c44c,stroke:#333 style SQLite fill:#4d77cf,stroke:#333,color:#fff style SQL fill:#4d77cf,stroke:#333,color:#fff style Export fill:#d4edda,stroke:#28a745

3.2. Visualizing JOIN Types

JOIN Type Description Result Logic
INNER JOIN Returns records that have matching values in both tables. Intersection (A ∩ B)
LEFT JOIN Returns all records from the left table, and the matched records from the right table. Left Side (A)
RIGHT JOIN Returns all records from the right table, and the matched records from the left table. Right Side (B)
FULL OUTER JOIN Returns all records when there is a match in either left or right table. Union (A ∪ B)

4. Practical Examples

4.1. Advanced SQL: Window Functions & CTE

Calculating a running total using a CTE for cleaner code.

-- Common Table Expression (CTE)
WITH high_value_orders AS (
    SELECT order_id, customer_id, total_amount
    FROM orders
    WHERE total_amount > 500
)

-- Window Function: Running Total
SELECT 
    order_id, 
    customer_id,
    total_amount,
    SUM(total_amount) OVER (
        PARTITION BY customer_id 
        ORDER BY order_date
    ) AS running_total
FROM high_value_orders;

4.2. Python Integration (SQLAlchemy + Pandas)

Connecting to a database and reading/writing data.

import pandas as pd
from sqlalchemy import create_engine

# 1. Create Connection Engine (SQLite example)
engine = create_engine('sqlite:///data.db')

# 2. Writing Data: Pandas -> Database
# Saves dataframe to 'jobs' table
df.to_sql('jobs', engine, index=False, if_exists='replace')

# 3. Reading Data: Database -> Pandas
# Executes SQL query and returns DataFrame
query = "SELECT * FROM jobs WHERE salary > 100000"
df_result = pd.read_sql(query, engine)

print(df_result.head())

5. Self-Check Questions

Tap to reveal answers.

1. Why is it better to use SQL for filtering data rather than Pandas?
Efficiency. SQL filters data before transferring it over the network/loading into memory. Loading a huge table into Pandas just to filter it consumes unnecessary RAM.
2. What is the difference between INNER JOIN and LEFT JOIN?
INNER JOIN keeps only rows present in both tables. LEFT JOIN keeps all rows from the left table, filling missing matches from the right table with NULLs.
3. What does a Window Function allow you to do that GROUP BY cannot?
Window functions perform calculations (like running totals or rankings) without collapsing the rows. GROUP BY reduces the number of rows to one per group.
4. What is the role of SQLAlchemy in Python data engineering?
It acts as a bridge (ORM/Toolkit) allowing Python to communicate with various SQL databases using a unified syntax, handling connections and query execution.
5. Why use a CTE (WITH clause)?
To break down complex queries into readable, modular parts. It creates a temporary result set that can be referenced like a table in the main query.
6. What is the main difference between PostgreSQL and MongoDB?
PostgreSQL is a relational (structured) database using tables and SQL. MongoDB is a NoSQL (schema-free) database using JSON-like documents.
7. What does `if_exists='replace'` do in `df.to_sql`?
It drops the existing table in the database and creates a new one with the data from the DataFrame.

6. Real-World Applications

  • ETL Pipelines: Extracting raw data from APIs, storing in a staging DB (SQLite/Postgres), transforming with SQL, and loading into a Data Warehouse.
  • Financial Analytics: Using Window Functions to calculate running balances, moving averages of stock prices, or year-to-date revenue.
  • Customer Segmentation: Using complex JOINs to combine user profiles, purchase history, and website activity logs for marketing analysis.
  • Data Caching: Using a local database to store scraped web data to avoid re-scraping and risking IP bans.
© 2025 Generated Lecture Notes. Based on slides by Duman Makhanbetov.
Data Pipelines (Intro)

Data Pipelines (Intro)

Instructor: Aiganym Zhandaulet

1. Key Theses

  1. Data Pipeline Definition: An automated process that moves, transforms, and stores data between systems (Source -> Ingestion -> Transformation -> Storage -> Serving).
  2. Why Automation Matters: Pipelines replace manual data collection, ensuring scalability, reliability, reproducibility, and enabling real-time dashboards.
  3. ETL vs. ELT: Modern systems prefer ELT (Extract-Load-Transform) over ETL, pushing raw data into the warehouse first and transforming it there using the database engine's power.
  4. Scheduling is Critical: Automation tools (schedulers) are needed to run jobs daily/hourly, manage dependencies, and handle retries/failures automatically.
  5. Cron vs. Airflow: Cron is simple and built-in but lacks monitoring. Apache Airflow is a full orchestrator with a UI, dependency management, and scalability for complex workflows.
  6. DAGs in Airflow: Workflows in Airflow are defined as Directed Acyclic Graphs (DAGs) in Python code, consisting of tasks (operators) and their dependencies.

2. Glossary

ETL (Extract, Transform, Load) Traditional pipeline pattern where data is transformed before loading into the target system.
ELT (Extract, Load, Transform) Modern pattern where raw data is loaded directly into the data warehouse, and transformation happens inside the warehouse (e.g., using SQL).
Cron A time-based job scheduler in Unix-like operating systems. It runs scripts at specific times defined by a syntax like `0 6 * * *` (run at 6:00 AM daily).
Apache Airflow A platform to programmatically author, schedule, and monitor workflows. It allows defining pipelines as code (Python).
DAG (Directed Acyclic Graph) A collection of tasks organized with dependencies and direction, ensuring no loops (cycles) exist. It represents a single workflow in Airflow.
Operator A template for a predefined task in Airflow (e.g., `PythonOperator` executes a Python function, `BashOperator` runs a shell command).

3. Visual Structures

3.1. Data Pipeline Stages

graph LR Source[Source
APIs, DBs, Files] --> Ingestion[Ingestion
Moving Data] Ingestion --> Transform[Transformation
Cleaning, Joining] Transform --> Storage[Storage
Data Warehouse] Storage --> Serving[Serving
BI, ML, Analytics] style Source fill:#ecf0f1,stroke:#333 style Ingestion fill:#f3c44c,stroke:#333 style Transform fill:#f3c44c,stroke:#333 style Storage fill:#4d77cf,stroke:#333,color:#fff style Serving fill:#d4edda,stroke:#28a745

3.2. Cron vs. Airflow

Feature Cron Apache Airflow
Complexity Simple, lightweight Robust orchestrator
Monitoring None (check logs manually) Rich UI for status & logs
Retries No Built-in retry logic
Dependencies Hard to manage First-class citizen (DAGs)
Scalability Single machine Distributed executors

3.3. Airflow Architecture

graph TD UI[Webserver UI] Scheduler[Scheduler] MetaDB[(Metadata DB)] Workers[Workers / Executors] UI --> MetaDB Scheduler --> MetaDB Scheduler --> Workers Workers --> MetaDB style UI fill:#e2e3e5,stroke:#333 style Scheduler fill:#4d77cf,stroke:#333,color:#fff style MetaDB fill:#f3c44c,stroke:#333 style Workers fill:#d4edda,stroke:#28a745

4. Practical Examples

4.1. Cron Job Syntax

Running a python script every day at 6:00 AM.

# Minute Hour Day Month Weekday Command
0 6 * * * /usr/bin/python3 /home/user/pipeline.py >> /home/user/pipeline.log 2>&1

4.2. Simple Airflow DAG

A basic pipeline defined in Python.

from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime

def my_task():
    print("Pipeline running!")

with DAG(
    dag_id="simple_pipeline",
    start_date=datetime(2024, 1, 1),
    schedule_interval="@daily",
    catchup=False
) as dag:
    
    run_etl = PythonOperator(
        task_id="run_etl",
        python_callable=my_task
    )

5. Self-Check Questions

Tap to reveal answers.

1. What is the main difference between ETL and ELT?
In ETL, transformation happens before loading to the warehouse. In ELT, raw data is loaded first, and transformation happens inside the warehouse engine.
2. Why can't we just use Cron for everything?
Cron lacks monitoring, dependency management between tasks, automatic retries, and a user interface, making it hard to manage complex pipelines.
3. What does "Idempotent" mean in the context of Airflow tasks?
An idempotent task produces the same result regardless of how many times it is run (e.g., `INSERT IGNORE` or `DELETE` before `INSERT`). This allows safe retries.
4. What is a DAG in Airflow?
Directed Acyclic Graph. It defines the structure of the pipeline, ensuring tasks flow in a specific direction without loops.
5. Which Airflow component decides when a task should run?
The Scheduler.
6. What is the purpose of the Metadata Database in Airflow?
It stores the state of all DAGs, task instances (running, success, failed), logs location, and configuration.
7. Name three common data sources for pipelines.
APIs, Databases (SQL), Files (CSV/JSON/Parquet).

6. Real-World Applications

  • Daily Reporting: Automating the generation of daily revenue reports by pulling data from payment APIs and DBs.
  • Machine Learning: Creating training datasets by joining user logs with profile data and retraining models weekly.
  • Data Warehousing: Orchestrating the loading of raw data from S3 into Snowflake or BigQuery using ELT patterns.
  • Alerting: Monitoring data quality and sending Slack/Email alerts if a pipeline fails or data is missing.
© 2025 Generated Lecture Notes. Based on slides by Aiganym Zhandaulet.
Streaming Data & Apache Kafka

Streaming Data (Intro to Apache Kafka)

Instructor: Duman Makhanbetov

1. Key Theses

  1. Batch vs. Streaming: Data processing is shifting from periodic batch jobs (high latency, historical analysis) to continuous stream processing (low latency, real-time reactions) for use cases like fraud detection and live dashboards.
  2. Apache Kafka: A distributed event streaming platform acting as a "central nervous system". It is durable, horizontally scalable, and decouples data producers from consumers.
  3. The Log Concept: At its core, Kafka is an append-only, immutable commit log. Data is stored sequentially on disk, enabling replayability and fault tolerance.
  4. Kafka Architecture: The ecosystem consists of Producers (push data), Brokers (store data), and Consumers (pull data).
  5. Data Organization: Data is organized into Topics (logical streams), which are split into Partitions (for scalability) and stored as Segments (rolling files).
  6. WebSockets: For real-time communication between a server and a web client (browser), WebSockets are preferred over REST because they provide a persistent, bidirectional connection with low overhead.

2. Glossary

Streaming Data A continuous flow of events generated in real-time from sources like sensors, clicks, or financial transactions. Requires immediate processing.
Broker A Kafka server that receives, stores, and serves messages. A Kafka cluster is composed of multiple brokers.
Topic A category or feed name to which records are stored. Topics are logical representations of data streams.
Partition A unit of parallelism in Kafka. A topic is split into multiple partitions, allowing data to be spread across multiple brokers.
Offset A unique identifier (integer) for a message within a partition. It tracks the position of a consumer in the log.
Consumer Group A group of consumers acting as a single logical subscriber. Partitions are load-balanced among members of the group.
WebSocket A communication protocol providing full-duplex communication channels over a single TCP connection, ideal for live data updates.

3. Visual Structures

3.1. Batch vs. Streaming

Feature Batch Processing Streaming Processing
Latency High (Minutes/Hours) Low (Milliseconds/Seconds)
Data Bounded chunks Continuous flow (unbounded)
Execution Scheduled (Periodic) Always Running
Use Cases Reports, Billing, ETL Fraud detection, Monitoring

3.2. Kafka Architecture Flow

graph LR Prod["Producer
(Writes Data)"] -->|Push| Broker["Kafka Broker
(Stores Topic/Partition)"] Broker -->|Pull| Cons["Consumer
(Reads Data)"] style Prod fill:#ecf0f1,stroke:#333 style Broker fill:#f3c44c,stroke:#333 style Cons fill:#d4edda,stroke:#28a745

3.3. REST vs WebSocket

Feature REST WebSocket
Connection Request-Response (Short) Persistent (Always open)
Direction Client pulls from Server Bidirectional (Server pushes)
Ideal for Static/Infrequent data Real-time/Live updates

4. Practical Examples

4.1. WebSocket Client (Python)

Connecting to a live crypto stream (Binance) using Python.

import websocket
import json

def on_message(ws, message):
    # Parse the incoming JSON message
    data = json.loads(message)
    # Print the live price
    print("Trade Price:", data["p"], "USD")

# Connect to Binance WebSocket for Bitcoin/USDT trades
ws = websocket.WebSocketApp(
    "wss://stream.binance.com:9443/ws/btcusdt@trade",
    on_message=on_message
)

# Keep the connection open forever
ws.run_forever()

5. Self-Check Questions

Tap to reveal answers.

1. What is the fundamental difference between how Producers and Consumers interact with Kafka?
Producers push (write) messages to the broker, whereas Consumers pull (read) messages from the broker at their own pace.
2. Why is Kafka described as an "immutable commit log"?
Because once data is written to Kafka, it cannot be changed or deleted (until retention expires). New data is always appended to the end.
3. What happens if a topic has more partitions than consumers in a group?
Some consumers will read from multiple partitions to ensure all data is processed.
4. What determines the order of messages in Kafka?
Ordering is guaranteed only within a partition, not across the entire topic.
5. Why use WebSockets instead of REST for a trading dashboard?
REST requires constant polling (high overhead) to check for updates. WebSockets allow the server to push price updates instantly (low latency).
6. What is the role of a Consumer Offset?
It acts as a bookmark, tracking the index of the last message successfully processed by a consumer so it can resume from there in case of failure.
7. Can Kafka persist data?
Yes, unlike traditional message queues, Kafka stores data on disk for a configurable retention period (e.g., 7 days), allowing data replay.

6. Real-World Applications

  • Financial Trading: Real-time stock and crypto price feeds using WebSockets.
  • Fraud Detection: Analyzing credit card transactions instantly to block suspicious activity.
  • Log Aggregation: Collecting logs from hundreds of servers into a central system for monitoring.
  • Activity Tracking: Tracking user clicks and navigation on a website (like LinkedIn or Netflix) to personalize recommendations.
  • IoT: Processing telemetry data from millions of connected sensors/vehicles.
© 2025 Generated Lecture Notes. Based on slides by Duman Makhanbetov.
Made on
Tilda