rm(list = ls())
gc()
sprintf("start %s", Sys.time())
getwd()
library(readr)
library(data.table)
library(MLmetrics)
#tr <- read_csv("../input/train.csv")
#te <- read_csv("../input/test.csv")

fileName = "../input/train.csv"
verbose = 1
Train <-
  data.table::fread(
    file =
      fileName,
    colClasses = c(
      "first_active_month"  = "character",
      "card_id" = "character",
      "feature_1" = "numeric",
      "feature_2" = "numeric",
      "feature_3" = "numeric",
      "target"    = "numeric"
    )
  )
sprintf("Train.csv Loaded %s", Sys.time())
sprintf("class(Train) %s", class(Train))
sprintf("sum(is.na(Train$target)) = %d", sum(is.na(Train$target)))
#Train[is.na(Train$target),c("target")] <- min(Train$target,na.rm = TRUE) - 1
fileName = "../input/test.csv"
Test <-
  data.table::fread(
    file =
      fileName,
    colClasses = c(
      "first_active_month"  = "character",
      "card_id" = "character",
      "feature_1" = "numeric",
      "feature_2" = "numeric",
      "feature_3" = "numeric"#,
      #"target"    = "numeric"
    )
  )
sprintf("Test.csv Loaded %s", Sys.time())
sprintf("class(Test) %s", class(Train))
Test$target <- NA

train_test <- rbind(Train, Test)
rm(Test)
rm(Train)
invisible(gc())
Sys.sleep(0.01)

sprintf("colnames(train_test)")
print(colnames(train_test))
train_test <-
  train_test[, c("card_id",
                 "target",
                 "first_active_month",
                 "feature_1",
                 "feature_2",
                 "feature_3"), with = FALSE]

sprintf("sum(is.na(train_test$first_active_month)) = %d", sum(is.na(train_test$first_active_month)))
sprintf("sum(is.na(train_test$card_id))= %d", sum(is.na(train_test$card_id)))
sprintf("sum(is.na(train_test$feature_1))= %d", sum(is.na(train_test$feature_1)))
sprintf("sum(is.na(train_test$feature_2)) = %d", sum(is.na(train_test$feature_2)))
sprintf("sum(is.na(train_test$feature_3))= %d", sum(is.na(train_test$feature_3)))
sprintf("sum(is.na(train_test$target)) = %d", sum(is.na(train_test$target)))
sprintf("sum(is.na(train_test$first_active_month)) = %d", sum(is.na(train_test$first_active_month)))


suppressWarnings(key(train_test) <- c("card_id"))
train_test$first_active_month <-
  paste0(train_test$first_active_month, "-01")
train_test$first_active_month <-
  as.POSIXct(x = train_test$first_active_month, format = "%Y-%m-%d")

train_test[i = is.na(train_test$first_active_month), "first_active_month"] <-
  min(train_test$first_active_month, na.rm = TRUE)
print(sprintf("sum(is.na(train_test$first_active_month)) = %d", sum(is.na(
  train_test$first_active_month
))))

train_test$first_active_Year <-
  lubridate::year(train_test$first_active_month)
sprintf("sort(x = table(train_test$first_active_Year))")
sort(x = table(train_test$first_active_Year))

train_test$first_active_Semester <-
  lubridate::semester(train_test$first_active_month)
sprintf("sort(x = table(train_test$first_active_Semester))")
sort(x = table(train_test$first_active_Semester))

train_test$first_active_Quarters <-
  lubridate::quarter(train_test$first_active_month)
sprintf("sort(x = table(train_test$first_active_Quarters))")
sort(x = table(train_test$first_active_Quarters))

train_test$first_active_Month <-
  lubridate::month(train_test$first_active_month)
sprintf("sort(x = table(train_test$first_active_Month))")
sort(x = table(train_test$first_active_Month))

train_test$first_active_Week <-
  lubridate::week(train_test$first_active_month)
sprintf("sort(x = table(train_test$first_active_Week))")
sort(x = table(train_test$first_active_Week))

train_test$first_active_WeekDay <-
  lubridate::wday(train_test$first_active_month)
sprintf("sort(x = table(train_test$first_active_WeekDay))")
sort(x = table(train_test$first_active_WeekDay))

train_test$feature_1 <-
  as.factor(as.character(train_test$feature_1))
train_test$feature_2 <-
  as.factor(as.character(train_test$feature_2))
train_test$feature_3 <-
  as.factor(as.character(train_test$feature_3))

sprintf("sort(table(train_test$feature_1))")
sort(table(train_test$feature_1))

sprintf("sort(table(train_test$feature_2))")
sort(table(train_test$feature_2))

sprintf("sort(table(train_test$feature_3))")
sort(table(train_test$feature_3))

# one hot encoding
ohe_feats = c('feature_1', 'feature_2', 'feature_3')
for (f in ohe_feats)
{
  train_test_dummy = ade4::acm.disjonctif(train_test[, f, with = FALSE])
  train_test = cbind(train_test, train_test_dummy)
}

train_test$feature_1.1 <- NULL
train_test$feature_2.3 <- NULL
train_test$feature_3.0 <- NULL

train_test$feature_1 <-
  log1p(as.numeric(as.character(train_test$feature_1)))
train_test$feature_2 <-
  log1p(as.numeric(as.character(train_test$feature_2)))
train_test$feature_3 <-
  log1p(as.numeric(as.character(train_test$feature_3)))


Model.data <- train_test[i = (!is.na(train_test$target)), , ]

Model.data$card_id <- NULL
Model.data$first_active_month <- NULL


train_test.model <- lm(formula = target ~ ., data = Model.data)
summary(train_test.model)

suppressWarnings(Kaggle.Evaluation.RMSE <-
  MLmetrics::RMSE(y_pred = train_test.model$fitted.values,
                  y_true = train_test.model$model$target))

sprintf("Kaggle.Evaluation.RMSE =%f", Kaggle.Evaluation.RMSE)

suppressWarnings(target <-
  predict(object = train_test.model, newdata = train_test))
summmsion <- cbind(train_test, target)
summmsion <- summmsion[, c("card_id", "target")]
summmsion$target <- round(summmsion$target, digits = 3)
train_test$feature_1.4 <- NULL
train_test$feature_1.5 <- NULL
train_test$feature_2.2 <- NULL
train_test$feature_3.1 <- NULL

Model.data <- train_test[i = (!is.na(train_test$target)), , ]

Model.data$card_id <- NULL
Model.data$first_active_month <- NULL


train_test.model <- lm(formula = target ~ ., data = Model.data)
summary(train_test.model)

Kaggle.Evaluation.RMSE.V2 <-
                   MLmetrics::RMSE(y_pred = train_test.model$fitted.values,
                                   y_true = train_test.model$model$target)

sprintf("Kaggle.Evaluation.RMSE.V2 =%f", Kaggle.Evaluation.RMSE.V2)

target.predict <-  predict(object = train_test.model, newdata = train_test)
summmsion <- cbind(train_test, target.predict)
summmsion <- summmsion[, c("card_id", "target.predict")]
summmsion$target.predict <- round(summmsion$target.predict, digits = 3)
colnames(summmsion) <- c("card_id", "target")
 # write.csv(x = summmsion,
 #           file = "submission.csv",
 #           row.names = FALSE)
#sprintf("start %s", Sys.time())

train_test.model <- step(object = lm(formula = target ~ ., data = Model.data),direction = "both")
summary(train_test.model)

target.predict <- predict(object = train_test.model,newdata = train_test)
Kaggle.Evaluation.RMSE.V3 <- MLmetrics::RMSE(y_pred = train_test.model$fitted.values,
                                             y_true = train_test.model$model$target)

sprintf("Kaggle.Evaluation.RMSE.V3 =%f", Kaggle.Evaluation.RMSE.V3)

target.predict <-  predict(object = train_test.model, newdata = train_test)
summmsion <- cbind(train_test, target.predict)
summmsion <- summmsion[, c("card_id", "target.predict")]
summmsion$target.predict <- round(summmsion$target.predict, digits = 3)
colnames(summmsion) <- c("card_id", "target")
 write.csv(x = summmsion,
           file = "submission.csv",
           row.names = FALSE)
 sprintf("start %s", Sys.time())
