Генерация легальных транзакций

Репозиторий проекта: Ссылка
Диаграммы: Подробная диаграмма структуры генератора

Ноутбук:

Указатель

  1. Суть генерации
  2. Конфиги и данные для генерации
  3. Генерация времени
  4. Генерация части данных транзакции
  5. Генерация одной транзакции
  6. Генерация нескольких транзакций
  7. Оркестрация генерации

Суть генерации

Генерация нескольких транзакций для случайной выборки клиентов. При генерации контроль времени транзакций, чтобы они не были похожи на фрод. Данные клиентов оригинальные, например: устройства с которых совершены транзакции, IP-адреса. Суммы генерируются исходя из отдельных данных о категориях созданных под легальные транзакции. Сгенерированные транзакции пишутся в отдельный файл.

Конфиги и данные для генерации

Для генерации каждого типа транзакций - легальных, фрод - нужны конфиги и данные. Например, конфиги: сколько транзакций генерировать, разные лимиты; данные: клиенты, данные мерчантов, данные об устройствах клиентов. Данные хранятся в отдельных файлах, созданных заранее. Конфиги хранятся в yaml файлах. Чтобы все это передавать в функции и классы генерации, через отдельный класс - конфиг билдер - создается объект конфиг класса в котором будут хранится данные и нужные конфиги. Под каждый раздел генерации свой конфиг билдер и свой конфиг класс, значит у легальных транзакций они свои.

Генерация времени

Время для каждой транзакции случайно берется из диапазона таймстемпов. Границы диапазона задаются в time.yaml. Время берется случайно, но в соответствии с заданным распределением по часам внутри суток. Для легальных транзакций их три: круглосуточные категории покупок, дневные категории покупок, онлайн покупки. Распределения фактически созданы вручную и передаются в виде вероятностных весов каждого часа в сутках при семплировании времени из диапазона. Распределения создавались для реалистичности времени транзакций, например у круглосуточных категорий очень низкая ночная активность, небольшая с утра, небольшой пик в обед, затем вечерний пик от 17:00 и до 20:00 и спад к 22:00. И тому подобное. Генерация распределений и их графики в этом ноутбуке Базовая генерация времени.

Пример. Распределение времени для круглосуточного легального оффлайна

Распределение оффлайн 24ч

Если это первая транзакция для клиента, то просто берем семплированный таймстемп. Если нет, то проверяем семплированный таймстемп на чрезмерную близость ко времени уже созданных транзакций клиента. Это нужно чтобы не было случайного попадания под фрод если время меньше допустимого. Если есть конфликты по времени, то создается таймстемп основываясь на времени последней транзакции клиента: время + случайная разница в рамках допустимого.

Функции

Генерация части данных транзакции

Функция get_txn_location_and_merchant
В отдельную функцию вынесена генерация данных для полей транзакции: ID мерчанта, координаты транзакции, IP-адрес, город совершения транзакции.

Для онлайн транзакций:

Для оффлайн транзакций:

Генерация одной транзакции

Функция generate_one_legit_txn. Применяет в себе функцию генерации времени и части данных транзакции.
Также выполняет:

В итоге возвращает готовую транзакцию

Генерация нескольких транзакций

Функция gen_multiple_legit_txns.

Логика

  1. проходит циклом через переданных ей клиентов и для каждого клиента генерирует случайное кол-во транзакций при помощи функции генерации одной транзакции
  2. пишет создаваемые транзакции частями в файлы при помощи специального класса созданного для записи легальных транзакций - LegitTxnsRecorder. Кол-во транзакций на каждый файл выставляется в конфиг файле legit.yaml. Запись частями сделана на случай если генерируется очень много транзакций, чтобы не держать целый датафрейм в памяти.
  3. при завершении генерации LegitTxnsRecorder собирает из файлов единый датафрейм и пишет его в файл в двух директориях: индивидуальной директории под текущий запуск генератора и директорию последнего запуска

Оркестрация генерации

Для легальных транзакций есть отдельный класс оркестратор - LegitRunner, который получает на вход данные конфиг файлов и путь к директории текущего запуска. Исходя из этих данных он создает объект конфиг билдера, через билдер создает объект конфиг класса и объект класса записывающего транзакции.
При вызове run() метода оркестратора происходит полный процесс генерации легальных транзакций.