library(data.table)
library(signal)

# reading data
train <- fread('../input/training_set_metadata.csv')
train_ts <- fread('../input/training_set.csv')
train_ts <- merge(train_ts, train[,.(object_id, target)], on=c('object_id'))
with(train, table(is.na(distmod), target))
colors <- with(train_ts, rainbow(length(unique(passband))))

class <- 6
object <- 122270224
# select time series data for selected object
signal <- train_ts[object_id == object, ]$flux
noise <- train_ts[object_id == object, ]$flux_err
# getting limits for plot
x_min <- min(train_ts[object_id == object, ]$mjd) 
x_max <- max(train_ts[object_id == object, ]$mjd)
y_min <- min(signal - noise, na.rm=TRUE) 
y_max <- max(signal + noise, na.rm=TRUE)

# plotting light curves before equalization
with(train_ts[object_id == object,], plot(mjd, flux, xlim=c(x_min, x_max), ylim=c(y_min, y_max), col=colors[passband + 1], type='p', xlab='Время', ylab='Флюксы'))
with(train_ts[object_id == object], arrows(mjd, flux - flux_err, mjd, flux + flux_err, length=0.05, angle=90, code=3, col=colors[passband + 1]))
with(train_ts[object_id == object, .N, by=passband][order(passband)], legend(x_min, y_max, passband, col=colors[passband + 1], pch=1))

# linear interpolation for each passband in known measure times
for (pass in c(0:5)){
    eval(parse(text=paste0("train_ts[object_id == object, y", pass, " := interp1(train_ts[object_id == object & passband == ", pass, ",]$mjd, train_ts[object_id == object & passband == ", pass, ",]$flux, train_ts[object_id == object,]$mjd, method='linear')]")))
}
# selecting passband 0 as a target for linear model
train_ts[object_id == object & passband == 0, pred:= y0]
train_ts[object_id == object & passband == 0, intercept:= 0]
train_ts[object_id == object & passband == 0, slope:= 1]
# making own model for each passband (1 - 5) with passband 0 as a target.
for (pass in c(1:5)){
    eval(parse(text=paste0("train_ts[object_id == object & passband == ", pass, ", pred:= predict(lm(y0 ~ y", pass, ", data=train_ts[object_id == object,]), train_ts[object_id == object & passband == ", pass, ", .(y", pass, ")])]")))
}
# retrieve linear coefficients
for (pass in c(1:5)){
    eval(parse(text=paste0("coeff <- lm(y0 ~ y", pass, ", data=train_ts[object_id == object,])$coefficients")))
    train_ts[object_id == object & passband == pass, intercept:= coeff[1]]
    train_ts[object_id == object & passband == pass, slope:= coeff[2]]
}
# transforming passbands using that models
signal <- train_ts[object_id == object, ]$pred
train_ts[object_id == object, pred_err := flux_err*slope]
noise <- train_ts[object_id == object, ]$pred_err
y_min <- min(signal - noise, na.rm=TRUE) 
y_max <- max(signal + noise, na.rm=TRUE)

# plotting light curves after equalization
with(train_ts[object_id == object,], plot(mjd, pred, xlim=c(x_min, x_max), ylim=c(y_min, y_max), col=colors[passband + 1], type='p', xlab='Время', ylab='Флюксы'))
with(train_ts[object_id == object], arrows(mjd, pred - pred_err, mjd, pred + pred_err, length=0.05, angle=90, code=3, col=colors[passband + 1]))
with(train_ts[object_id == object, .N, by=passband][order(passband)], legend(x_min, y_max, passband, col=colors[passband + 1], pch=1))