Мы создаем программное обеспечение, которое проверяет комиссии, взимаемые банками с продавцов, которые принимают кредитные и дебетовые карты. Наши клиенты хотят, чтобы мы сообщали им, если процессор карты перезаряжает их. Комиссия за транзакцию по кредитной карте рассчитывается следующим образом:
fee = fixed + variable*transaction_price
«Схема комиссий» - это пара (фиксированная, переменная)
, используемая группой кредитных карт, например«Дебетовые золотые бизнес-карты MasterCard, выпущенные Первым национальным банком Голливуда». Мы считаем, что в любой момент времени используется менее 10 различных схем оплаты, но мы не получаем от наших партнеров полного и текущего списка схем оплаты. (да, я знаю, что некоторые «схемы комиссионных» более сложны, чем приведенное выше уравнение из-за ограничений и других ошибок, но известно, что в наших транзакциях используются только схемы a + bx
).
Вот проблема, которую мы пытаемся решить: мы хотим использовать данные о комиссиях для каждой транзакции, чтобы вывести используемые схемы комиссионных. Затем мы можем сравнить этот список со схемами оплаты, которые каждый клиент должен использовать в соответствии со своим банком.
Данные, которые мы получаем о каждой транзакции, представляют собой кортеж данных: (card_id, transaction_price, fee)
.
transaction_price
и комиссия
указаны в центах. Банк пересчитывает дробные центы для каждой транзакции до тех пор, пока совокупная сумма не превысит одного цента, а затем к комиссии за эту транзакцию будет добавлен «цент округления». Мы не можем предсказать, к какой транзакции будет добавлен «округляющий процент».
card_id
идентифицирует группу карт, которые используют одну и ту же схему оплаты. В обычный день из 10 000 транзакций может быть несколько сотен уникальных card_id
. Несколько card_id
будут иметь общую схему оплаты.
Данные, которые мы получаем, выглядят так, и мы хотим выяснить последние два столбца.
card_id transaction_price fee fixed variable
=======================================================================
12345 200 22 ? ?
67890 300 21 ? ?
56789 150 8 ? ?
34567 150 8 ? ?
34567 150 "rounding cent"-> 9 ? ?
34567 150 8 ? ?
Конечный результат, который нам нужен, - это такой короткий список с 10 или меньшим количеством записей, показывающих схемы оплаты, которые лучше всего соответствуют нашим данным. Как это:
fee_scheme_id fixed variable
======================================
1 22 0
2 21 0
3 ? ?
4 ? ?
...
Средняя плата составляет около 8 центов. Это означает, что центы округления имеют огромное влияние, а приведенный выше вывод требует большого количества данных.
Средняя транзакция составляет 125 центов. Цена сделки всегда находится в пределах 5 центов.
Нам нужен короткий список схем комиссий, которые «подходят» 98% + из 3000+ транзакций, которые каждый клиент получает каждый день. Если этих данных недостаточно для достижения 98% уверенности, мы можем использовать данные за несколько дней.
Поскольку центы округления применяются к каждой транзакции произвольно, это не простая алгебраическая задача. Напротив, это своего рода упражнение по статистической кластеризации, которое я не знаю, как решить.
Есть предложения, как подойти к этой проблеме? Реализация может быть на C # или T-SQL, в зависимости от того, что имеет наибольший смысл с учетом алгоритма.