
library(data.table)

print("Reading data")

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


submit <-train[Semana==9]

train <- train[Semana<9]

train$Semana<-NULL
train$lodD=log1p(train$Demanda_uni_equil)
submit$Pred <- NA
submit[, Pred := as.numeric(Pred)]
print('Calculating 1')
mean_CliPro <-  train[, .(mean_CliPro = mean(lodD)), by = .(Cliente_ID,Producto_ID)]
submit <- merge(submit, mean_CliPro, all.x = TRUE, by = c("Cliente_ID","Producto_ID"))
submit[is.na(Pred)]$Pred <- expm1(submit$mean_CliPro)
mean_CliPro <- NULL
submit$mean_CliPro <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Producto_ID"))
submit$Pred <- NA
gc()
print('Calculating 2')
mean_CliProAge <-  train[, .(mean_CliProAge = mean(Demanda_uni_equil)), by = .(Cliente_ID,Producto_ID,Agencia_ID)]
submit <- merge(submit, mean_CliProAge, all.x = TRUE, by = c("Cliente_ID","Producto_ID","Agencia_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_CliProAge
mean_CliProAge <- NULL
submit$mean_CliProAge <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Producto_ID,Agencia_ID"))
submit$Pred <- NA
gc()
print('Calculating 3')
mean_CliProCan <-  train[, .(mean_CliProCan = mean(Demanda_uni_equil)), by = .(Cliente_ID,Producto_ID,Canal_ID)]
submit <- merge(submit, mean_CliProCan, all.x = TRUE, by = c("Cliente_ID","Producto_ID","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_CliProCan
mean_CliProCan <- NULL
submit$mean_CliProCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Producto_ID,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 4')
mean_CliProAgeCan <-  train[, .(mean_CliProAgeCan = mean(Demanda_uni_equil)), by = .(Cliente_ID,Producto_ID,Agencia_ID,Canal_ID)]
submit <- merge(submit, mean_CliProAgeCan, all.x = TRUE, by = c("Cliente_ID","Producto_ID","Agencia_ID","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_CliProAgeCan
mean_CliProAgeCan <- NULL
submit$mean_CliProAgeCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Producto_ID,Agencia_ID,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 5')
mean_CliProRut <-  train[, .(mean_CliProRut = mean(Demanda_uni_equil)), by = .(Cliente_ID,Producto_ID,Ruta_SAK)]
submit <- merge(submit, mean_CliProRut, all.x = TRUE, by = c("Cliente_ID","Producto_ID","Ruta_SAK"))
submit[is.na(Pred)]$Pred <- submit$mean_CliProRut
mean_CliProRut <- NULL
submit$mean_CliProRut <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Producto_ID,Ruta_SAK"))
submit$Pred <- NA
gc()
print('Calculating 6')
mean_CliProRutCan <-  train[, .(mean_CliProRutCan = mean(Demanda_uni_equil)), by = .(Cliente_ID,Producto_ID,Ruta_SAK,Canal_ID)]
submit <- merge(submit, mean_CliProRutCan, all.x = TRUE, by = c("Cliente_ID","Producto_ID","Ruta_SAK","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_CliProRutCan
mean_CliProRutCan <- NULL
submit$mean_CliProRutCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Producto_ID,Ruta_SAK,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 7')
mean_CliProAgeRut <-  train[, .(mean_CliProAgeRut = mean(Demanda_uni_equil)), by = .(Cliente_ID,Producto_ID,Agencia_ID,Ruta_SAK)]
submit <- merge(submit, mean_CliProAgeRut, all.x = TRUE, by = c("Cliente_ID","Producto_ID","Agencia_ID","Ruta_SAK"))
submit[is.na(Pred)]$Pred <- submit$mean_CliProAgeRut
mean_CliProAgeRut <- NULL
submit$mean_CliProAgeRut <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Producto_ID,Agencia_ID,Ruta_SAK"))
submit$Pred <- NA
gc()
print('Calculating 8')
mean_CliProAgeRutCan <-  train[, .(mean_CliProAgeRutCan = mean(Demanda_uni_equil)), by = .(Cliente_ID,Producto_ID,Agencia_ID,Ruta_SAK,Canal_ID)]
submit <- merge(submit, mean_CliProAgeRutCan, all.x = TRUE, by = c("Cliente_ID","Producto_ID","Agencia_ID","Ruta_SAK","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_CliProAgeRutCan
mean_CliProAgeRutCan <- NULL
submit$mean_CliProAgeRutCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Producto_ID,Agencia_ID,Ruta_SAK,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 9')
mean_ProAgeRut <-  train[, .(mean_ProAgeRut = mean(Demanda_uni_equil)), by = .(Producto_ID,Agencia_ID,Ruta_SAK)]
submit <- merge(submit, mean_ProAgeRut, all.x = TRUE, by = c("Producto_ID","Agencia_ID","Ruta_SAK"))
submit[is.na(Pred)]$Pred <- submit$mean_ProAgeRut
mean_ProAgeRut <- NULL
submit$mean_ProAgeRut <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Producto_ID,Agencia_ID,Ruta_SAK"))
submit$Pred <- NA
gc()
print('Calculating 10')
mean_ProAgeRutCan <-  train[, .(mean_ProAgeRutCan = mean(Demanda_uni_equil)), by = .(Producto_ID,Agencia_ID,Ruta_SAK,Canal_ID)]
submit <- merge(submit, mean_ProAgeRutCan, all.x = TRUE, by = c("Producto_ID","Agencia_ID","Ruta_SAK","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_ProAgeRutCan
mean_ProAgeRutCan <- NULL
submit$mean_ProAgeRutCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Producto_ID,Agencia_ID,Ruta_SAK,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 11')
mean_ProRutCan <-  train[, .(mean_ProRutCan = mean(Demanda_uni_equil)), by = .(Producto_ID,Ruta_SAK,Canal_ID)]
submit <- merge(submit, mean_ProRutCan, all.x = TRUE, by = c("Producto_ID","Ruta_SAK","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_ProRutCan
mean_ProRutCan <- NULL
submit$mean_ProRutCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Producto_ID,Ruta_SAK,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 12')
mean_ProRut <-  train[, .(mean_ProRut = mean(Demanda_uni_equil)), by = .(Producto_ID,Ruta_SAK)]
submit <- merge(submit, mean_ProRut, all.x = TRUE, by = c("Producto_ID","Ruta_SAK"))
submit[is.na(Pred)]$Pred <- submit$mean_ProRut
mean_ProRut <- NULL
submit$mean_ProRut <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Producto_ID,Ruta_SAK"))
submit$Pred <- NA
gc()
print('Calculating 13')
mean_ProAgeCan <-  train[, .(mean_ProAgeCan = mean(Demanda_uni_equil)), by = .(Producto_ID,Agencia_ID,Canal_ID)]
submit <- merge(submit, mean_ProAgeCan, all.x = TRUE, by = c("Producto_ID","Agencia_ID","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_ProAgeCan
mean_ProAgeCan <- NULL
submit$mean_ProAgeCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Producto_ID,Agencia_ID,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 14')
mean_ProAge <-  train[, .(mean_ProAge = mean(Demanda_uni_equil)), by = .(Producto_ID,Agencia_ID)]
submit <- merge(submit, mean_ProAge, all.x = TRUE, by = c("Producto_ID","Agencia_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_ProAge
mean_ProAge <- NULL
submit$mean_ProAge <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Producto_ID,Agencia_ID"))
submit$Pred <- NA
gc()
print('Calculating 15')
mean_ProCan <-  train[, .(mean_ProCan = mean(Demanda_uni_equil)), by = .(Producto_ID,Canal_ID)]
submit <- merge(submit, mean_ProCan, all.x = TRUE, by = c("Producto_ID","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_ProCan
mean_ProCan <- NULL
submit$mean_ProCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Producto_ID,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 16')
mean_Pro <-  train[, .(mean_Pro = mean(Demanda_uni_equil)), by = .(Producto_ID)]
submit <- merge(submit, mean_Pro, all.x = TRUE, by = c("Producto_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_Pro
mean_Pro <- NULL
submit$mean_Pro <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Producto_ID"))
submit$Pred <- NA
gc()
print('Calculating 17')
mean_CliRut <-  train[, .(mean_CliRut = mean(Demanda_uni_equil)), by = .(Cliente_ID,Ruta_SAK)]
submit <- merge(submit, mean_CliRut, all.x = TRUE, by = c("Cliente_ID","Ruta_SAK"))
submit[is.na(Pred)]$Pred <- submit$mean_CliRut
mean_CliRut <- NULL
submit$mean_CliRut <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Ruta_SAK"))
submit$Pred <- NA
gc()
print('Calculating 18')
mean_CliRutCan <-  train[, .(mean_CliRutCan = mean(Demanda_uni_equil)), by = .(Cliente_ID,Ruta_SAK,Canal_ID)]
submit <- merge(submit, mean_CliRutCan, all.x = TRUE, by = c("Cliente_ID","Ruta_SAK","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_CliRutCan
mean_CliRutCan <- NULL
submit$mean_CliRutCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Ruta_SAK,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 19')
mean_CliAgeRut <-  train[, .(mean_CliAgeRut = mean(Demanda_uni_equil)), by = .(Cliente_ID,Agencia_ID,Ruta_SAK)]
submit <- merge(submit, mean_CliAgeRut, all.x = TRUE, by = c("Cliente_ID","Agencia_ID","Ruta_SAK"))
submit[is.na(Pred)]$Pred <- submit$mean_CliAgeRut
mean_CliAgeRut <- NULL
submit$mean_CliAgeRut <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Agencia_ID,Ruta_SAK"))
submit$Pred <- NA
gc()
print('Calculating 20')
mean_CliAgeRutCan <-  train[, .(mean_CliAgeRutCan = mean(Demanda_uni_equil)), by = .(Cliente_ID,Agencia_ID,Ruta_SAK,Canal_ID)]
submit <- merge(submit, mean_CliAgeRutCan, all.x = TRUE, by = c("Cliente_ID","Agencia_ID","Ruta_SAK","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_CliAgeRutCan
mean_CliAgeRutCan <- NULL
submit$mean_CliAgeRutCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Agencia_ID,Ruta_SAK,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 21')
mean_CliAge <-  train[, .(mean_CliAge = mean(Demanda_uni_equil)), by = .(Cliente_ID,Agencia_ID)]
submit <- merge(submit, mean_CliAge, all.x = TRUE, by = c("Cliente_ID","Agencia_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_CliAge
mean_CliAge <- NULL
submit$mean_CliAge <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Agencia_ID"))
submit$Pred <- NA
gc()
print('Calculating 22')
mean_CliAgeCan <-  train[, .(mean_CliAgeCan = mean(Demanda_uni_equil)), by = .(Cliente_ID,Agencia_ID,Canal_ID)]
submit <- merge(submit, mean_CliAgeCan, all.x = TRUE, by = c("Cliente_ID","Agencia_ID","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_CliAgeCan
mean_CliAgeCan <- NULL
submit$mean_CliAgeCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Agencia_ID,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 23')
mean_Cli <-  train[, .(mean_Cli = mean(Demanda_uni_equil)), by = .(Cliente_ID)]
submit <- merge(submit, mean_Cli, all.x = TRUE, by = c("Cliente_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_Cli
mean_Cli <- NULL
submit$mean_Cli <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID"))
submit$Pred <- NA
gc()
print('Calculating 24')
mean_CliCan <-  train[, .(mean_CliCan = mean(Demanda_uni_equil)), by = .(Cliente_ID,Canal_ID)]
submit <- merge(submit, mean_CliCan, all.x = TRUE, by = c("Cliente_ID","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_CliCan
mean_CliCan <- NULL
submit$mean_CliCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Cliente_ID,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 25')
mean_AgeRut <-  train[, .(mean_AgeRut = mean(Demanda_uni_equil)), by = .(Agencia_ID,Ruta_SAK)]
submit <- merge(submit, mean_AgeRut, all.x = TRUE, by = c("Agencia_ID","Ruta_SAK"))
submit[is.na(Pred)]$Pred <- submit$mean_AgeRut
mean_AgeRut <- NULL
submit$mean_AgeRut <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Agencia_ID,Ruta_SAK"))
submit$Pred <- NA
gc()
print('Calculating 26')
mean_AgeRutCan <-  train[, .(mean_AgeRutCan = mean(Demanda_uni_equil)), by = .(Agencia_ID,Ruta_SAK,Canal_ID)]
submit <- merge(submit, mean_AgeRutCan, all.x = TRUE, by = c("Agencia_ID","Ruta_SAK","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_AgeRutCan
mean_AgeRutCan <- NULL
submit$mean_AgeRutCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Agencia_ID,Ruta_SAK,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 27')
mean_Can <-  train[, .(mean_Can = mean(Demanda_uni_equil)), by = .(Canal_ID)]
submit <- merge(submit, mean_Can, all.x = TRUE, by = c("Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_Can
mean_Can <- NULL
submit$mean_Can <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 28')
mean_RutCan <-  train[, .(mean_RutCan = mean(Demanda_uni_equil)), by = .(Ruta_SAK,Canal_ID)]
submit <- merge(submit, mean_RutCan, all.x = TRUE, by = c("Ruta_SAK","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_RutCan
mean_RutCan <- NULL
submit$mean_RutCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Ruta_SAK,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 29')
mean_Rut <-  train[, .(mean_Rut = mean(Demanda_uni_equil)), by = .(Ruta_SAK)]
submit <- merge(submit, mean_Rut, all.x = TRUE, by = c("Ruta_SAK"))
submit[is.na(Pred)]$Pred <- submit$mean_Rut
mean_Rut <- NULL
submit$mean_Rut <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Ruta_SAK"))
submit$Pred <- NA
gc()
print('Calculating 30')
mean_AgeCan <-  train[, .(mean_AgeCan = mean(Demanda_uni_equil)), by = .(Agencia_ID,Canal_ID)]
submit <- merge(submit, mean_AgeCan, all.x = TRUE, by = c("Agencia_ID","Canal_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_AgeCan
mean_AgeCan <- NULL
submit$mean_AgeCan <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Agencia_ID,Canal_ID"))
submit$Pred <- NA
gc()
print('Calculating 31')
mean_Age <-  train[, .(mean_Age = mean(Demanda_uni_equil)), by = .(Agencia_ID)]
submit <- merge(submit, mean_Age, all.x = TRUE, by = c("Agencia_ID"))
submit[is.na(Pred)]$Pred <- submit$mean_Age
mean_Age <- NULL
submit$mean_Age <- NULL
print(paste(sqrt( sum( (log1p(submit$Demanda_uni_equil) - log1p(submit$Pred))^2 , na.rm = TRUE ) / (nrow(submit)-nrow(submit[is.na(Pred)]))),"Agencia_ID"))
submit$Pred <- NA
gc()
