## TEST DATA: 
if (FALSE) {  
    DT.test <- data.table(date=rev(seq(from=monthFloor(today()-5), length.out=10, by="-1 month")), revenue.acc = 1.0*1:10, revenue.anal = 1.0*21:30, Rasrp_0 = (1:10) + rep(c(5, 10), each=5))
    DT.test <- rbind(DT.test, DT.test)[, storeid := rep(c(1, 186), each=10)]
    DT.test[date >=  rev(sort(unique(date)))[2], c("revenue.acc", "Rasrp_0") := NA]
    DT.test[, c(colsToTransform, "Rasrp_0") := lapply(.SD, function(x) as.numeric(x + 100*(.GRP-1))), by=storeid, .SDcols=c(colsToTransform, "Rasrp_0")]
    setkeyIfNot(DT.test, rev(kCols), organize=TRUE) ## for viewing
}

## Calculate the percentage      ##
## ----------------------------- ##

## Transform y
DT.test[, Rasrp_1 := shiftUp(Rasrp_0) , by=kCols_nodate] []


kCols <- c("date", "storeid")
kCols_nodate <- setdiff(kCols, "date")


DT.transform <- copy(DT.test)

## Ensure sorted by date first
setkeyIfNot(DT.test, kCols, organize=TRUE)
## Which cols that will be transformed and reshaped
colsToTransform <- c("revenue.acc", "revenue.anal")

DT.transform[, Rasrp_0 := Rasrp_0 / revenue.acc]  []
DT.transform[, Rasrp_1 := Rasrp_1 / revenue.acc]  []


## First convert columns to numeric.  Then to percentages
DT.transform[, c(colsToTransform) := lapply(.SD, as.numeric), .SDcols=colsToTransform]
DT.transform[, c(colsToTransform) := lapply(.SD, percentIncrease), keyby=kCols_nodate, .SD=colsToTransform]

shiftLeft(1:10, 0)
shiftRight(1:10)
## Stretch out each column
max_months_back <- 7
yCols <- sprintf("Rasrp_%01i", 1:0)
setnames(DT.transform, "revenue.acc", "Racct")
setnames(DT.transform, "revenue.anal", "Ranal")
colsToTransform <- c("Racct", "Ranal")

DT.transform[, setnames(rbindlist(lapply(seq(.N-1), function(i) as.data.table(t(head(get(col), -i)))), fill=TRUE), sprintf("%s_%02i", col, seq(.N-1))) , by=storeid]

DT.transform[, t_monthly(col), by=storeid]

DT.transform[, {
  # .SD; browser()
  table_per_col <- lapply(colsToTransform, function(col) {
                      setnames(rbindlist(
                          lapply(rev(seq(.N)), function(i) 
                             as.data.table(t(  
                                    head(tail(rev(get(col)), .N+1-i), n=max_months_back)
                                    # head(shiftRight(get(col), i-1), n=max_months_back)
                             ))
                          )
                        , fill=TRUE), sprintf("%s_%02i", col, seq(max_months_back)-1))
                    } )
  other_cols <- .SD[, c("date", yCols), with=FALSE]
  cbind(other_cols, do.call(cbind, table_per_col))
}, by=storeid]


Y2, Y1,  Ranal_2, Ranal_1,  Ranal_0, Ranal_-1, Ranal_-2, ... Racct_0, Racct_-1, Racct_-2, ... Uanal_2, Uanal_1,  Uanal_0, Uanal_-1, Uanal_-2, ... Uacct_0, Uacct_-1, Uacct_-2, ...

