У меня есть некоторые записи транзакций, например:
library(data.table)
customers <- 1:75
purchase_dates <- seq( as.Date('2016-01-01'),
as.Date('2018-12-31'),
by=1 )
n <- 500L
set.seed(1)
# Assume the data are already ordered and 1 row per cust_id/purch_dt
df <- data.table( cust_id = sample(customers, n, replace=TRUE),
purch_dt = sample(purchase_dates, n, replace=TRUE),
purch_amt = sample(500:50000, n, replace=TRUE)/100
)[, .(purch_amt = sum(purch_amt)),
keyby=.(cust_id, purch_dt) ]
df
# cust_id purch_dt purch_amt
# 1 2016-03-20 69.65
# 1 2016-05-17 413.60
# 1 2016-12-25 357.18
# 1 2017-03-20 256.21
# 2 2016-05-26 49.14
# 2 2018-05-31 261.87
# 2 2018-12-27 293.28
# 3 2016-12-10 204.12
# 3 2018-09-21 8.70
Я хотел бы знать количество предыдущих транзакций и общую сумму в течение 365 дней до предыдущего окна (т. Е. От d-365
до d-1
для транзакции на дату d
).
Я думал об использовании скользящего соединения, но это соответствовало бы максимум одной предыдущей покупке, и может быть несколько покупок.
Мне удалось получить желаемый результат, используя декартово самостоятельное объединение с фильтром даты (см. Ответ ниже), но это не очень эффективный подход к памяти.
Желаемый выход:
cust_id purch_dt prior_purch_cnt prior_purch_amt purch_amt
1 2016-03-20 0 0.00 69.65
1 2016-05-17 1 69.65 413.60
1 2016-12-25 2 483.25 357.18
1 2017-03-20 3 840.43 256.21
2 2016-05-26 0 0.00 49.14
2 2018-05-31 0 0.00 261.87
2 2018-12-27 1 261.87 293.28
3 2016-12-10 0 0.00 204.12
3 2018-09-21 0 0.00 8.70