2017-02-16 2 views
-3

Я создаю двигатель рекомендации продукта (в R), используя совместную фильтрацию. Чтобы сохранить более выгодные позиции в верхней части рекомендаций, мы разработали бизнес-правило гибкое, которое выглядит как рисунок 1. Для сортировки результата рекомендации следует использовать бизнес-правило.сортировать по гибким критериям

+---------------+----------+-----------------+ 
| Sort Priority | Level 1 | Level 2   | 
+---------------+----------+-----------------+ 
| 1    | Brand | Versatile Foods | 
+---------------+----------+-----------------+ 
|    |   | Agro   | 
+---------------+----------+-----------------+ 
|    |   | Specialty Foods | 
+---------------+----------+-----------------+ 
|    |   |     | 
+---------------+----------+-----------------+ 
| 2    | Category | Dairy   | 
+---------------+----------+-----------------+ 
|    |   | Produce   | 
+---------------+----------+-----------------+ 
|    |   | Seafood   | 
+---------------+----------+-----------------+ 
|    |   |     | 
+---------------+----------+-----------------+ 
| 3    | Seasonal | Y    | 
+---------------+----------+-----------------+ 
|    |   | N    | 
+---------------+----------+-----------------+ 
      figure 1 

Бизнес-правила: При сортировке таблицы, столбец Бренд должен иметь приоритет над категории, которые должны иметь приоритет над сезонными. Это определяется значением приоритета сортировки столбцов.

При сортировке в колонке Бренд, универсальная еда имеет приоритет над Agro и Agro по специальным продуктам. Если значение в столбце бренда не отображается в правиле, значения (-ы) должны быть отсортированы в алфавитном порядке.

Такая же логика сортировки должна применяться к каждой записи в определении правила.

Как алгоритм рекомендации развивается. бизнес-правила могут быть изменены/изменены, чтобы иметь меньше или больше уровней. Напр. дополнительный вход level1 может быть добавлен в будущем, скажем, тип (кошерный, Vegan, халал) и т.д. Правили будет выглядеть, как показано ниже:

+---------------+----------+-----------------+ 
| Sort Priority | Level 1 | Level 2   | 
+---------------+----------+-----------------+ 
| 1    | Brand | Versatile Foods | 
+---------------+----------+-----------------+ 
|    |   | Agro   | 
+---------------+----------+-----------------+ 
|    |   | Specialty Foods | 
+---------------+----------+-----------------+ 
|    |   |     | 
+---------------+----------+-----------------+ 
| 2    | Category | Dairy   | 
+---------------+----------+-----------------+ 
|    |   | Produce   | 
+---------------+----------+-----------------+ 
|    |   | Seafood   | 
+---------------+----------+-----------------+ 
|    |   |     | 
+---------------+----------+-----------------+ 
| 3    | Type  | Kosher   | 
+---------------+----------+-----------------+ 
|    |   | Halal   | 
+---------------+----------+-----------------+ 
|    |   | Vegan   | 
+---------------+----------+-----------------+ 
|    |   |     | 
+---------------+----------+-----------------+ 
| 4    | Seasonal | Y    | 
+---------------+----------+-----------------+ 
|    |   | N    | 
+---------------+----------+-----------------+ 
      figure 2 

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

Ввод данных (выход с помощью механизма рекомендаций) будет чем-то вроде этого (рисунок 3).

+-----+-----------------+----------+----------+ 
| SKU | Brand   | Category | Seasonal | 
+-----+-----------------+----------+----------+ 
| 1 | Versatile Foods | Dairy | Y  | 
+-----+-----------------+----------+----------+ 
| 2 | Agro   | Produce | Y  | 
+-----+-----------------+----------+----------+ 
| 3 | Specialty Foods | Seafood | N  | 
+-----+-----------------+----------+----------+ 
| 4 | Agro   | Produce | N  | 
+-----+-----------------+----------+----------+ 
| 5 | Specialty Foods | Organic | Y  | 
+-----+-----------------+----------+----------+ 
| 6 | Agro   | Meat  | N  | 
+-----+-----------------+----------+----------+ 
| 7 | Versatile Foods | Seafood | N  | 
+-----+-----------------+----------+----------+ 
| 8 | USA Bread  | Bakery | Y  | 
+-----+-----------------+----------+----------+ 
| 9 | Specialty Foods | Seafood | N  | 
+-----+-----------------+----------+----------+ 
| 10 | Versatile Foods | Seafood | N  | 
+-----+-----------------+----------+----------+ 
        figure 3 

С определением правила, как на рисунке 1, вывод сценария должен быть таким же, как в приведенной ниже таблице.
Обратите внимание, что бренд = американский хлеб, который не встречается в бизнес-правиле, был помещен в нижней части сортированного списка.
Кроме того, для пунктов 4 и 6 запись с категорией = 'Продукция' была помещена над записью с категорией = 'Мясо', поскольку запись «Мясо» не была найдена в бизнес-правилах, но «Произведение» было.

+-----+-----------------+----------+----------+ 
| SKU | Brand   | Category | Seasonal | 
+-----+-----------------+----------+----------+ 
| 1 | Versatile Foods | Dairy | Y  | 
+-----+-----------------+----------+----------+ 
| 7 | Versatile Foods | Seafood | N  | 
+-----+-----------------+----------+----------+ 
| 10 | Versatile Foods | Seafood | N  | 
+-----+-----------------+----------+----------+ 
| 2 | Agro   | Produce | Y  | 
+-----+-----------------+----------+----------+ 
| 4 | Agro   | Produce | N  | 
+-----+-----------------+----------+----------+ 
| 6 | Agro   | Meat  | N  | 
+-----+-----------------+----------+----------+ 
| 3 | Specialty Foods | Seafood | N  | 
+-----+-----------------+----------+----------+ 
| 9 | Specialty Foods | Seafood | N  | 
+-----+-----------------+----------+----------+ 
| 5 | Specialty Foods | Organic | Y  | 
+-----+-----------------+----------+----------+ 
| 8 | USA bread  | Bakery | Y  | 
+-----+-----------------+----------+----------+ 
       figure 4 
+0

Я отредактировал мой вопрос, чтобы быть более понятным. –

+0

Я отредактировал мой вопрос. Может кто-нибудь удалить из удержания? –

ответ

0

Вы можете использовать кодировку факторов, чтобы заказывать вещи, как хотите. Например:

> lvl <- c('Versatile Foods', 'Agro', 'Specialty Foods') 
> lvl <- append(lvl, sort(setdiff(unique(df$Brand), lvl))) 
> 
> df$Brand <- factor(df$Brand, levels=lvl) 
> 
> lvl <- c("Dairy", "Produce", "Seafood") 
> lvl <- append(lvl, sort(setdiff(unique(df$Category), lvl))) 
> 
> df$Category <- factor(df$Category, levels=lvl) 
> 
> df$Seasonal <- factor(df$Seasonal, levels=c('Y', 'N')) 
> 
> 
> df[order(df$Brand, df$Category, df$Seasonal), ] 
    SKU   Brand Category Seasonal 
1 1 Versatile Foods Dairy  Y 
7 7 Versatile Foods Seafood  N 
10 10 Versatile Foods Seafood  N 
2 2   Agro Produce  Y 
4 4   Agro Produce  N 
6 6   Agro Produce  N 
3 3 Specialty Foods Seafood  N 
9 9 Specialty Foods Seafood  N 
5 5 Specialty Foods Organic  Y 
8 8  USA Bread Bakery  Y 
+0

Спасибо. Это частично решит мою проблему. Однако бизнес-правило является динамическим и может иметь больше уровней, например. Тип (кошерный, веганский, халяльный) и т. Д. –

+0

Я думал, что вы хотите, чтобы лишние вещи отсортировали альфу в конце? –

+0

Прошу прощения, если мой комментарий не ясен. Я хочу сказать, что у нас могут быть изменения в бизнес-правилах, где мы могли бы также добавить Type (Kosher, Vegan, Halal) в конце правила.Я не хочу жестко кодировать факторы в df [order (df $ Brand, df $ Category, df $ Seasonal, df $ type),], поскольку список может сильно меняться все время. –

0

Этот подход включает определение таблицы рангов сортировки, а затем выполнение сортировки с использованием новых столбцов после слияния с основной таблицей.

library(dplyr) 
rank <- data_frame(Brand = c('Versatile Foods','Agro','Specialty Foods'), 
        Brand_rank = c(1,2,3)) 
df <- left_join(df, rank, on="Brand") %>% 
    arrange(Brand_rank, Brand, Category, Seasonal) %>% 
    select(-Brand_rank) 
df 
# A tibble: 10 × 4 
# SKU   Brand Category Seasonal 
# <dbl>   <chr> <chr> <chr> 
#1  1 Versatile Foods Dairy  Y 
#2  7 Versatile Foods Seafood  N 
#3  10 Versatile Foods Seafood  N 
#4  4   Agro Produce  N 
#5  6   Agro Produce  N 
#6  2   Agro Produce  Y 
#7  5 Specialty Foods Organic  Y 
#8  3 Specialty Foods Seafood  N 
#9  9 Specialty Foods Seafood  N 
#10  8  USA Bread Bakery  Y