Формула популярности по дням? - PullRequest
3 голосов
/ 01 февраля 2011

У меня есть приложение, которое в основном представляет собой календарь, пользователи могут вводить события на каждый день. Теперь мне нужно найти лучший способ показать календарь на целый месяц, выделяя при этом самые загруженные дни.

Очевидно, что здесь выбор цвета, но мне интересно, как вы, ребята, это сделаете. Я мозговой штурм следующее:

  • Получите max событий за день и оттуда разделите его на количество доступных цветов. Таким образом, если в один день было 30 событий, а у нас было 3 цвета, первый был бы от 0 до 9, следующий от 10 до 19 и последний от 20 до.
  • Найдите average и разделите его на colors/2, поэтому, если среднее значение равно 10 событиям и у нас есть 3 цвета, математика будет 10 / 1,5 = 6,66, что означает, что первый диапазон цветов будет от 0 до 6.66, второй с 6.67 до 13.32 и последний с 13.33 по.

Однако я не уверен, что это был бы лучший способ решить эту проблему. Оба являются линейными, и первый может немного испортить ситуацию, если наше среднее значение составляет около 20, а максимальное имеет 100 событий, будут отображаться только два цвета.

Я не статик, но я думаю, что эту проблему можно решить с помощью процентилей и квартилей, но я не совсем уверен, как это реализовать.

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 февраля 2011

Я бы предложил алгоритм логартмического распределения, который часто используется для построения облаков тегов. Теги - это ваши дни, количество тегов - это количество событий за день.

Хорошей реализацией для PHP и Python (еще не проверенной должным образом) является эта . Вот пример:

$tags = array(
    array('tag'   => 1,
          'count' => 10),
    array('tag'   => 2,
          'count' => 30),
    array('tag'   => 3,
          'count' => 5),
    array('tag'   => 4,
          'count' => 5));
$colours = array('green', 'yellow', 'red');
foreach(tagcloud($tags, 0, count($colours) - 1, 0) as $d) {
  echo  '<div style="background-color:' . $colours[floor($d['size'])] . '">Day: '.$d['tag'].' Events: '.$d['count'].'</div>';
}
0 голосов
/ 02 февраля 2011

Несколько идей:

  1. Обеспечение равномерного распределения цветов: закажите N событий / день и назначьте равное количество дней для каждого цвета
  2. Отображение N событий / дней на значение в непрерывном цветовом диапазоне вместо использования отдельных сегментов. Например, от 0 до max (события) до значения RGB.
  3. Найти нелинейное распределение - например, нормальное, экспоненциальное и т. Д. Формула, которую вы ищете - это CDF (см. http://en.wikipedia.org/wiki/Cumulative_distribution_function), которую можно использовать для преобразования количества событий / дней в процентиль.
...