library(data.table)
library(dplyr)

train <- fread('../input/train.csv', 
               select = c('Cliente_ID', 'Producto_ID', 'Agencia_ID', 'Ruta_SAK', 'Demanda_uni_equil'))
test <- fread('../input/test.csv', 
              select = c('id', 'Cliente_ID', 'Producto_ID', 'Agencia_ID', 'Ruta_SAK'))

train$log_demand = log1p(train$Demanda_uni_equil) 

setkey(train, Producto_ID, Cliente_ID, Ruta_SAK)
setkey(test, Producto_ID, Cliente_ID, Ruta_SAK)

print("Computing means")
mean_total <- mean(train$log_demand) #overall mean
mean_Prod <-  train[, .(mean_prod = mean(log_demand)), by = .(Producto_ID)]

print("Merging means with test set")
submit <- merge(test, mean_Prod, all.x = TRUE, by = "Producto_ID")


preds = submit$mean_prod
preds[is.na(preds)] = mean_total

preds = expm1(preds)

submission = data.frame(id = submit$id, Demanda_uni_equil = preds)
write.csv(submission, "submission_pcDragon_V1.csv", row.names = FALSE)