# This R environment comes with all of CRAN preinstalled, as well as many other helpful packages
# The environment is defined by the kaggle/rstats docker image: https://github.com/kaggle/docker-rstats
# For example, here's several helpful packages to load in 

library(ggplot2) # Data visualization
library(readr) # CSV file I/O, e.g. the read_csv function

# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory

system("ls ../input")

# Any results you write to the current directory are saved as output.

library(data.table)

print("Reading train data")

mydata = read.csv("../input/train.csv", colClasses=c("NULL",	"NULL",	NA,	"NULL",	NA, NA,	"NULL",	"NULL",	"NULL",	"NULL",	NA))

attach(mydata)

mydata$Cliente_ID = as.factor(mydata$Cliente_ID)
mydata$Producto_ID = as.factor(mydata$Producto_ID)
mydata$Canal_ID = as.factor(mydata$Canal_ID)

sapply(mydata, class)
setDT(mydata)

print("Calculating mean")

mydata[Demanda_uni_equil>125]$Demanda_uni_equil <- 125

mydata$Demand_log = log1p(mydata$Demanda_uni_equil) 

mean_PC <- mydata[, .(MPC = mean(Demand_log)), by = .(Producto_ID, Cliente_ID)] 
mean_PCa <- mydata[, .(MPCa = mean(Demand_log)), by = .(Producto_ID, Canal_ID)] 
log_median_total <- median(mydata$Demand_log) #overall log median

rm(mydata)

print("Reading test data")

validateData = read.csv("../input/test.csv", colClasses=c(NA, "NULL",	"NULL",	NA,	"NULL", NA,	NA))

attach(validateData)

validateData$Cliente_ID = as.factor(validateData$Cliente_ID)
validateData$Producto_ID = as.factor(validateData$Producto_ID)
validateData$Canal_ID = as.factor(validateData$Canal_ID)

sapply(validateData, class)
setDT(validateData)

print("merging mean")

submit <- merge(validateData, mean_PC, all.x = TRUE, by = c("Producto_ID", "Cliente_ID"))
submit <- merge(validateData, mean_PCa, all.x = TRUE, by = c("Producto_ID", "Canal_ID"))

rm(validateData)
rm(mean_PC)
rm(mean_PCa)

submit$Prediction <- expm1(submit$MPC)
submit[is.na(Prediction)]$Prediction <- expm1(submit[is.na(Prediction)]$MPCa)
submit[is.na(Prediction)]$Prediction <- expm1(log_median_total)

setnames(submit,"Prediction","Demanda_uni_equil")

newdata = submit[order(id),] 

print("write file")

write.csv(newdata[,.(id,Demanda_uni_equil)],"result_log.csv", row.names = FALSE)


