library(tibble)
library(data.table)
library(lubridate)
library(dplyr)
library(R.utils)
library(ggplot2)
library(gplots)
library(forecast)
library(pracma)
library(doMC)
library(foreach)
library(Kendall)
train <- fread('../input/train.csv',nrows = 3)
true_names<-colnames(train)
l2keep <- 12e6
nL <- 125497041
train <- fread('../input/train.csv',header=FALSE,nrows = l2keep,skip=nL-l2keep)
colnames(train)<-true_names
rm(l2keep)
rm(nL)
rm(true_names)
test <- fread('../input/test.csv')

dates <- data.table(date = seq.Date(as.Date(unique(train$date)[2]), 
                    as.Date(unique(train$date)[length(unique(train$date))]), 
                    by = "day"))
dates[, `:=`(date_char = as.character(date), dow = weekdays(date))]
setnames(train, "date", "date_char")
setnames(test, "date", "date_char")
train[dates, `:=`(date = i.date, dow = i.dow), on="date_char"]
test[dates, `:=`(date = i.date, dow = i.dow), on="date_char"]
train[, date_char := NULL]
test[, date_char := NULL]

# replace negatives with 0
train[unit_sales < 0, unit_sales := 0]
train$store_item_nbr <- paste(train$store_nbr, 
                              train$item_nbr, sep="_")
test$store_item_nbr <- paste(test$store_nbr, 
                             test$item_nbr, sep="_")
train2 <- CJ(
  date = sort(unique(train$date)),
  store_item_nbr = sort(unique(train$store_item_nbr)))
train2[train, `:=`(dow = i.dow, unit_sales = i.unit_sales,
                   onpromotion=i.onpromotion,store_nbr=i.store_nbr,
                   item_nbr=i.item_nbr), 
       on=c("date", "store_item_nbr")]
train2[is.na(unit_sales), unit_sales := 0]
train2[is.na(onpromotion), onpromotion := FALSE]
train2$dow<-weekdays(train2$date)
#---------------------THE ACTUAL STUFF
train3<-dcast(train2, store_item_nbr ~ date, value.var = "unit_sales", fill = 0)
true_names<-train3[,1]
train3<-train3[,c(-1)]
ts_length<-length(train3[1,])
registerDoMC(detectCores()-1)
start_time <- Sys.time()
#don`t forget to change here length(rownames(train3))
fcst_matrix <- foreach(i=1:nrow(train3),.combine=rbind, .packages=c("pracma")) %dopar% { 
  fcst_matrix <- movavg(as.numeric(train3[i,]),n=7,type="s")[7:ts_length]
}
print("the run time")
print( Sys.time()-start_time)
extra_autocor<-function(row_in_fcst,index){
  return(acf(row_in_fcst,index,plot=FALSE)$acf)
}
graph_matrix<-cbind(apply(fcst_matrix,1,mean),apply(fcst_matrix,1,sd))
start_time <- Sys.time()
autocor_matr <- foreach(i=1:nrow(fcst_matrix),.combine=rbind, .packages=c("pracma")) %dopar% { 
  autocor_matr<-acf(fcst_matrix[i,],10,plot=FALSE)$acf
}
print("the run time")
print( Sys.time()-start_time)

graph_matrix<-cbind(graph_matrix,autocor_matr)
graph_matrix<-as.data.frame(graph_matrix)
colnames(graph_matrix)<-c("means","deviations","cor0",
                          "cor1","cor2","cor3","cor4",
                          "cor5","cor6","cor7","cor8",
                          "cor9","cor10")
#Creating features
graph_matrix$min_cor<-apply(autocor_matr,1,min)
start_time <- Sys.time()
graph_matrix$max_ma<-apply(fcst_matrix,1,max)
print("the run time")
print( Sys.time()-start_time)
graph_matrix$sd_mean_rat<-graph_matrix$deviations/graph_matrix$means
graph_matrix$max_dev<-(graph_matrix$max_ma-graph_matrix$means)/graph_matrix$deviations
mac_kend <- foreach(i=1:nrow(fcst_matrix),.combine=rbind, .packages=c("Kendall")) %dopar% { 
  mac_kend<-MannKendall(fcst_matrix[i,])$tau[1]
}
graph_matrix$man_kend<-mac_kend
#every 20th item in moving average
mov_avg<-fcst_matrix[,seq(1, length(fcst_matrix[1,]), 15)]
colnames(mov_avg)<-paste0("MMM",1:length(mov_avg[1,]))
graph_matrix<-cbind(graph_matrix,mov_avg)
graph_matrix[c('cor0','cor1','cor2','cor3','cor4','cor10')] <- list(NULL)
graph_matrix<-cbind(graph_matrix,true_names)
write.csv(graph_matrix, "final_set.csv", row.names = FALSE)