# This Kernel calculates a ratio between onpromotion and not onpromotion unit_sales.
# It may be biased by most sold items.

library(data.table)

train <- fread("../input/train.csv", colClasses = c("integer", "character", "integer", "integer", "double", "logical"))

#impute Nas
train[,onpromotion := as.numeric(onpromotion)]
train[is.na(onpromotion), onpromotion:=0.5]

#filter only products with at least one promo and one non promo day.
train <- train[,p.promo := mean(onpromotion), by = .(item_nbr)]
train <- train[p.promo>0 & p.promo<1]

#calculate promo stats for each promo group
promocalc <- train[,.(mean_sales = mean(unit_sales),count = length(unit_sales)), by = onpromotion]

#print results
print( promocalc )

#print ratio
avgsales <- sum(promocalc$mean_sales*promocalc$count)/sum(promocalc$count)

print( paste("average daily sales:", avgsales) )

print( paste("promo/nonpromo ratio:",promocalc$mean_sales[3]/promocalc$mean_sales[2]) )
print( paste("unknown/nonpromo ratio:",promocalc$mean_sales[1]/promocalc$mean_sales[2]) )

#We could conclude that promotions help increment unit_sales,
#and most NA values in onpromotion are just not promotions (probably about the same proportion of onpromotion
#TRUE values than in the rest of the data (about 7.5%).

promoItems <- train[,.(mean_sales = mean(unit_sales),count = length(unit_sales)), by = .(item_nbr,onpromotion)]
promoItemsMean <- dcast(promoItems,item_nbr~onpromotion, value.var = "mean_sales")
#promoItemsCount <- dcast(promoItems,item_nbr~onpromotion, value.var = "count")

setnames(promoItemsMean, c("0","0.5","1"), c("no_promo_sales","unk_promo_sales","on_promo_sales"))
#setnames(promoItemsCount, c("0","0.5","1"), c("no_promo_count","unk_promo_count","on_promo_count"))

#promoItemsMean <- merge(promoItemsMean, promoItemsCount, by="item_nbr")

promoItemsMean[,promo.nopromo := on_promo_sales/no_promo_sales] 
promoItemsMean[,unkpromo.nopromo := unk_promo_sales/no_promo_sales]

print(summary(promoItemsMean))

#impute item ratios with global ratios
promoItemsMean[is.na(promo.nopromo),promo.nopromo:=1.66472183286966]
promoItemsMean[is.na(unkpromo.nopromo),unkpromo.nopromo:=1.09438056732578]

promoItemsMean <- promoItemsMean[,c("item_nbr","promo.nopromo","unkpromo.nopromo"),with=FALSE]

print(promoItemsMean)
hist(promoItemsMean$promo.nopromo)
hist(promoItemsMean$unkpromo.nopromo)

fwrite(promoItemsMean, "promoItemsMean.csv",row.names = F)