Nano Hash - криптовалюты, майнинг, программирование

Легко проверить, была ли цель записана в другую переменную?

У меня есть идентификатор клиента, product_id1 и product_id2. Данные содержат информацию о покупках клиентов и отсортированы по клиентам и времени, поэтому первая строка каждого клиента является самой старой записью.
product_id1 включает в себя приобретенные товары product_id2 включает элементы, которые я хочу знать, был ли каждый из них приобретен ранее (проверьте из product_id1).

Для каждого элемента в product_id2 для каждого покупателя я хочу создать фиктивную переменную, которая показывала, был ли каждый элемент в product_id2 приобретен в прошлом
Другими словами, значение в product_id2 в n-й строке было показано по крайней мере один раз в 1 ~ (n-1) -ые строки в product_id1, Purchase_before - 1, в противном случае - 0.

Итак, я хочу создать столбец «куплено_перед».

Я могу сделать это с помощью цикла for, но есть ли какой-нибудь эффективный способ?

Данные как ниже,

customer id      product_id1   product_id2     purchased_before
    1             112             113                 0
    1             115             114                 0
    1             113             113                 0
    1             114             113                 1
    1             115             114                 1
    ....
    2             112             115                 0
    2             115             112                 1
    2             113             113                 0

  • Кто-нибудь может на это ответить? 27.11.2017

Ответы:


1

Эту проблему можно решить с помощью неравномерного соединения и агрегирования при соединении:

library(data.table)
setDT(DT)[
  # add "time variable", i.e., row id to identify earlier purchases
  , rn := .I][
    # create new column with ...
    , cnt_of_earlier_purchases := 
      # ... the result of the non-equi join aggregate
      DT[DT, on = .(customer_id, product_id1 = product_id2, rn < rn), .N, by = .EACHI]$N][]

   customer_id product_id1 product_id2 rn cnt_of_earlier_purchases
1:           1         112         113  1                        0
2:           1         115         114  2                        0
3:           1         113         113  3                        0
4:           1         114         113  4                        1
5:           1         115         114  5                        1
6:           2         112         115  6                        0
7:           2         115         112  7                        1
8:           2         112         113  8                        0
9:           2         115         112  9                        2

Новый столбец содержит количество покупок до фактической покупки.

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

В качестве альтернативы вместо счетчика можно добавить логическое значение:

setDT(DT)[, rn := .I][
  , purchased_before := 
    DT[DT, on = .(customer_id, product_id1 = product_id2, rn < rn), .N, by = .EACHI]$N > 0][]
   customer_id product_id1 product_id2 rn purchased_before
1:           1         112         113  1            FALSE
2:           1         115         114  2            FALSE
3:           1         113         113  3            FALSE
4:           1         114         113  4             TRUE
5:           1         115         114  5             TRUE
6:           2         112         115  6            FALSE
7:           2         115         112  7             TRUE
8:           2         112         113  8            FALSE
9:           2         115         112  9             TRUE

Данные

library(data.table)
DT <- fread(
"customer_id      product_id1   product_id2     purchased_before
    1             112             113                 0
    1             115             114                 0
    1             113             113                 0
    1             114             113                 1
    1             115             114                 1
    2             112             115                 0
    2             115             112                 1
    2             112             113                 0
    2             115             112                 0", select = 1:3)
27.11.2017
  • Большое спасибо!! Но у меня есть вопрос. если я хочу использовать определенное (например, 115, как показано ниже) значение вместо product_id2, как это сделать? setDT (DT) [, rn: = .I] [, Purchase_before: = DT [DT, on =. (customer_id, product_id1 == 115, rn ‹rn), .N, by = .EACHI] $ N› 0] [] 14.12.2017
  • Я имею в виду, что я хочу использовать определенное значение вместо переменной product_id2 в коде, который я изменил с помощью product_id1 == 115 выше. 14.12.2017
  • Вы хотите отфильтровать результат, потому что вас интересует только определенный продукт? 14.12.2017
  • Я просто подумал, что это будет просто. Не так ли? 14.12.2017
  • Пожалуйста, попробуйте setDT(DT)[, rn := .I][ , purchased_before := DT[DT, on = .(customer_id, product_id1 = product_id2, rn < rn), .N, by = .EACHI]$N > 0][product_id2 == 115] 14.12.2017
  • Извините. позвольте мне еще раз прояснить код, как показано ниже, setDT (DT) [, rn: = .I] [, cnt_of_earlier_purchases: = DT [DT, on =. (customer_id, product_id1 = product_id2, rn ‹rn), .N, by = .EACHI] $ N] [] С кодом, например, значение третьей строки 'cnt_of_earlier_purchases' подсчитывает product_id1 == 113 в первой ~ второй строке. Верно? 14.12.2017
  • Затем, если я хочу просто подсчитать product_id1 == 113 во всех строках, чтобы создать новую переменную (скажем, имя переменной как куплено_113_before), приведенный ниже код не работает. setDT (DT) [, rn: = .I] [, cnt_of_earlier_purchases: = DT [DT, on =. (customer_id, product_id1 == 113, rn ‹rn), .N, by = .EACHI] $ N] [] Как это сделать? 14.12.2017
  • Параметр on описывает, какие столбцы должны использоваться в объединении и как. Так что фильтрация здесь не работает. Если честно, я не понимаю, что вам нужно. Возможно, станет яснее (по крайней мере, для меня), если вы разместите новый вопрос, показывающий ожидаемый результат? 14.12.2017
  • ! извини, если я продолжаю беспокоить тебя. Я срочно. Вы можете ответить на этот вопрос? stackoverflow.com/ questions / 47799054 / Надеюсь, вы сможете ответить на эти вопросы. 14.12.2017

  • 2

    Попробуйте следующее:

    dplyr:

    df %>%
        group_by(customer_id) %>%
        mutate(purchased_before = sapply(row_number(), function(x) {
                   ifelse(product_id2[x] %in% product_id1[1:(x-1)], 1, 0)
               })
        )
    

    base R:

    do.call(rbind, lapply(split(df, df$customer_id), function(x) {
        x$purchased_before <- sapply(seq_len(nrow(x)), function(y) {
            ifelse(x$product_id2[y] %in% x$product_id1[1:(y-1)], 1, 0)
        })
        x
    }))
    

    Главное здесь - это перебирать номера строк в столбце product_id2 и использовать эти номера строк для доступа к значению product_id2 по заданному индексу вместе со значениями product_id1 от 1 до данного индекса. Получив эти значения, вы можете выполнить простой оператор match внутри ifelse. Если есть совпадение, вы присваиваете 1; или 0 в противном случае.

    Надеюсь, это окажется полезным.

    27.11.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..