# 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
library(class)
library(dplyr)
library(randomForest)
# 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.

train <- read.csv(file="../input/train.csv",head=TRUE,sep=",")

train <- subset(train, train$x>2 & train$x <2.5 & train$y <2.5 & train$y >2 & train$accuracy<250)

#write.csv(train, file = "MyData.csv",row.names=FALSE)

train$place_id <- as.factor(train$place_id)


#grouped <- group_by(train, place_id)
#addCols <- as.data.frame(summarise(grouped, meanX=mean(x),meanY=mean(y)))
#train <- merge(x = train, y = addCols, by = "place_id", all.x = TRUE)
##train$distFromCentroid <- sqrt((train$x- train$meanX)^2+(train$y- train$meanY)^2)
#plot(train_sub$accuracy~train_sub$distFromCentroid)
#train[,7] <- NULL

str(train)

train <- train %>% mutate(hour=(time/60)%%24)
train <- train %>% mutate(day=(time/60/24)%/%1)

se <- function(x) sqrt(var(x)/length(x))

by_day <- train %>% group_by(day) %>% summarize(x.mean = mean(x), y.mean= mean(y), accuracy.mean = mean(accuracy),
                                                x.se = se(x), y.se = se(y), accuracy.se = se(accuracy))

#limits_x <- aes(ymax = x.mean + x.se, ymin=x.mean - x.se)
#limits_y <- aes(ymax = y.mean + y.se, ymin=y.mean - y.se)
#limits_acc <- aes(ymax = accuracy.mean + accuracy.se, ymin=accuracy.mean - accuracy.se)
#ggplot(by_day, aes(x= x.mean, y=y.mean, color = day)) + geom_point()  + ggtitle("y vs x per day")
#ggplot(by_day, aes(x= day, y=x.mean)) + geom_point() + geom_pointrange(limits_x) +  ggtitle("Mean x vs day")
#ggplot(by_day, aes(x= day, y=y.mean)) + geom_point() + geom_pointrange(limits_y) + ggtitle("Mean y vs day")
#ggplot(by_day, aes(x= day, y=accuracy.mean)) + geom_point() + geom_pointrange(limits_acc) + ggtitle("Mean accuracy vs day")

by_day <- as.data.frame(by_day)

train <- merge(x = train, y = by_day[,c(1,4)], by = "day", all.x = TRUE)
train$accuMod <- train$accuracy/train$accuracy.mean

train$accuMod <- train$accuMod/max(train$accuMod)
train$hour <- train$hour/max(train$hour)
train$x <- train$x/max(train$x)
train$y <- train$y/max(train$y)

train$accuByHour <-  train$accuMod/train$hour
train$hourByAccu <-  train$hour/train$accuMod
train$hourMultAccy <- train$hour*train$accuMod

index <- sample(1:nrow(train),round(0.25*nrow(train)))
train1 <- train[index, ]
test1 <- train[-index, ]


train1$place_id <- as.character(train1$place_id)
train1$place_id <- as.factor(train1$place_id)
rf <- randomForest(as.factor(place_id) ~day+x+y+accuMod+hour+hourByAccu+hourMultAccy, train1)
test1$model_knn = predict(rf, newdata=test1)

test1$place_id <- factor(test1$place_id, levels=levels(train1$place_id))
pred <- sum(test1$model_knn==test1$place_id, na.rm=TRUE)/nrow(test1)
pred



