Сложное статистическое агрегирование временных рядов с участием полиморфных ассоциаций

Хорошо. Потерпите меня, поскольку мне нужно предоставить много контекстных деталей, прежде чем я смогу запросить разумный ответ на свой вопрос.

У меня есть сайт, который позволяет вам делать ежедневный выбор акций. Это работает так: вам предлагается сделать выбор между компаниями, которые сегодня противостоят друг другу. Например, GE против IBM. Вы можете выбрать два типа выбора: производительность (какая акция будет работать лучше?) И общий объем (будут ли комбинированные акции торговаться с объемами выше или ниже X?). Вам дается 100 виртуальных долларов каждый день, чтобы делать выбор.

В конечном итоге, наша цель состоит в том, чтобы отследить, какой пользователь зарабатывает больше всего денег на выбор в различных категориях (поясняется ниже) в следующие периоды времени: 5 дней, 15 дней, 30 дней, 90 дней, 180 дней, 1 год, за все время. Подсчитать, сколько денег приносит каждый выбор, очень просто. Это общая сумма заработанных (или проигранных) денег / количества выбранных.

Теперь каждая компания, которую выбирает пользователь, попадает в иерархию категорий. Обычно иерархия категорий выглядит так:

Подразделение -> Основная группа -> Отраслевая группа -> Классификация -> Компания

Вот несколько примеров:

  • Горнодобывающая промышленность -> Горнодобывающая промышленность - > Железные руды -> Добыча бурой руды -> Компания A
  • Горное дело -> Добыча металлов -> Железные руды -> Добыча бурой руды -> Компания B
  • Горнодобывающая промышленность -> Добыча металлов - > Железные руды -> Добыча лимонита -> Компания C
  • Горнодобывающая промышленность -> Добыча металлов -> Железные руды -> Добыча лимонита -> Компания D
  • Производство -> Табачные изделия -> Сигары -> Табачные изделия -> Компания E
  • Производство -> Табачные изделия -> Сигары -> Табачные изделия -> Компания F
  • Производство -> Табачные изделия -> Сигары -> Сигариллы - > Компания G
  • Производство -> Табачные изделия -> Сигары -> Сигариллы -> Компания H
  • … и так далее…

Для каждой категории есть модель (и соответствующая таблица, конечно) , и они связаны (подумайте, foreign_key) так же, как вы видите выше.

Существует модель Matchup, с каждой записью, представляющей, какие компании противостоят в течение дня. Каждая запись отслеживает начальную и конечную цены акций каждой компании, а также общий объем торгов.

Каждый Matchup имеет одну или несколько: pick_prices, которые могут меняться в течение дня. Обычно у каждого матча есть Цена выбора производительности и Цена выбора общего объема. Цена определяет, сколько вам будет стоить кирка и сколько вы заработаете за правильный выбор. (Теперь это всего лишь справочная информация. Вам не нужно беспокоиться об этих конкретных расчетах цен.)

В конце торгового дня выбор пользователя принимается. Выборки представлены в модели выбора со следующими атрибутами:

  • user_id
  • amount_spent (например, 10 долларов)
  • результат (например, WON, LOST)
  • pick (например, компания A)
  • matchup_id
  • pick_price_id
  • amount_won
  • решено (true или false)
  • created_at
  • updated_at

В настоящее время, когда каждый выбор разрешен, обновляется другая таблица с именем pick_records, которая имеет следующие атрибуты:

  • user_id
  • recordable_id
  • recordable_type ( Подразделение или основная группа, или отраслевая группа, или классификация, или компания)
  • пика (общее количество пиков, независимо от типа пика) выиграно
  • (общее количество пиков выиграно, независимо от типа пика)
  • проиграно (общее количество пиков потеряно, независимо от типа выбора)
  • деньги (общая сумма выигранных денег)
  • money_per_pick (деньги / выбор)
  • performance_picks
  • performance_won
  • performance_lost
  • performance_money
  • performance_money_per_pick
  • volume_picks volume
  • volume_lost
  • volume_money
  • volume_money_per_pick
  • created_at
  • updated_at

Как видите, это является полиморфной моделью. В таблице собрана статистика всех записей выбора.

Итак, вот проблема:

Учитывая существующий дизайн, что мне нужно сделать, чтобы я мог фиксировать записи выбора пользователя в следующие периоды времени: 5 дней, 15 дней, 30 дней, 90 дней, 180 дней, 1 год, за все время? Он должен быть простым, эффективным и быстрым!

В настоящее время я использую Rails 2.3.11 в базе данных MySQL.

11
задан Johan - reinstate Monica 4 June 2011 в 19:15
поделиться