## R version of most popular local hotels
library(data.table)
expedia_train <- fread('../input/train.csv', header=TRUE, select= c("is_booking","orig_destination_distance","srch_ci", "srch_co","hotel_cluster","srch_destination_id"))
expedia_test <- fread('../input/test.csv', header=TRUE)

# taking the best improving tradeoff between views and applies from existing applications.
# Best way to select one - crossvalidation one year versus another in training data.
sum_and_count <- function(x){
  const <- 0.91
  sum(x)*const + length(x)*(1-const)
}

# convert dates to months for generalization over 
convert_date_to_month <- function(x) {
  gsub("^.*[-]([0-9]{1,2})[-].*$", "\\1", x)
}

# Assumption is that 
expedia_train[,srch_ci := convert_date_to_month(srch_ci)]
expedia_train[,srch_co := convert_date_to_month(srch_co)]
expedia_test[,srch_ci := convert_date_to_month(srch_ci)]
expedia_test[,srch_co := convert_date_to_month(srch_co)]

data_by_original_destination     <- expedia_train[,sum_and_count(is_booking),by=list(orig_destination_distance, hotel_cluster)]
data_by_destination_id_and_dates <- expedia_train[,sum_and_count(is_booking),by=list(srch_destination_id, srch_ci, srch_co, hotel_cluster)]
data_by_destination_id           <- expedia_train[,sum_and_count(is_booking),by=list(srch_destination_id, hotel_cluster)]

top_x_results <- function(hc,v1, limit){
  hc_sorted <- hc[order(v1,decreasing=TRUE)]
  n <- min(limit,length(hc_sorted))
  paste(hc_sorted[1:n],collapse=" ")
}

# gave alone ~28% MPA@5
top5_dcico <- data_by_destination_id_and_dates[,top_x_results(hotel_cluster,V1,3),by=list(srch_destination_id, srch_ci, srch_co)]

# - other competitors show it yields good results, and geospatially speaking, .0001 precision in (km? miles?) gives good pairing between origination and destination.
top5_ord <- data_by_original_destination[,top_x_results(hotel_cluster,V1,3),by=list(orig_destination_distance)]

# fallback to statistics over destination ids
top5_d <- data_by_destination_id[,top_x_results(hotel_cluster,V1,3),by=list(srch_destination_id)]

resulting_table_main <- merge(expedia_test,top5_ord, by="orig_destination_distance",all.x=TRUE)[order(id),list(id,V1)]
resulting_table_second <- merge(expedia_test,top5_dcico, by=c("srch_destination_id", "srch_ci", "srch_co") ,all.x=TRUE)[order(id),list(id,V1)]
resulting_table_third <- merge(expedia_test,top5_d, by="srch_destination_id",all.x=TRUE)[order(id),list(id,V1)]

resulting_table_main$V1[is.na(resulting_table_main$V1)] <- resulting_table_second$V1[is.na(resulting_table_main$V1)] 
resulting_table_main$V1[is.na(resulting_table_main$V1)] <- resulting_table_third$V1[is.na(resulting_table_main$V1)] 

setnames(resulting_table_main,c("id","hotel_cluster"))
write.csv(resulting_table_main, file='submission_009-3.1.csv', row.names=FALSE)
