def evaluate(data, teX, teY, index_arr, kernelMeans, kernelSigma,
             kernelWeights, tau, E, original_P, target_P, mode):
    """model test"""
    print("== EVALUATE ==")
    f = open('result.txt', 'w')

    # recursive application
    assert (
        target_P % original_P == 0
    )  # check if target P can be achieved using n step applications of interval original_P
    gap = target_P - original_P
    loop = gap + 1
    print("Iterative Application for {} times".format(loop))

    Y_hat = []
    print(len(teX))
    for idx, x_element in enumerate(teX):
        data_copy = copy.deepcopy(data)
        data_at = index_arr[idx] - gap
        x = x_element
        for i in range(0, loop):
            y_h = predict(x, kernelMeans, kernelSigma, kernelWeights)
            # update value by prediction
            data_copy[data_at] = y_h
            x, data_at = ft.extracting_on_index(tau, E, original_P, data_copy,
                                                data_at, mode)
        Y_hat.append(y_h)

    err, rmse, rsq, mae = ft.loss_with_prediction_array(teY, Y_hat)

    return Y_hat, rmse, rsq, mae
def evaluate(data, teX, teY, teYdate, index_arr,
             num_kernels, kernelMeans, kernelSigma, kernelWeights,
             tau, E, original_P, target_P, mode,
             formatter, locater
             ):
    """model test"""
    print("== EVALUATE ==")
    f = open('result.txt', 'w')

    # recursive application
    assert(target_P % original_P == 0) # check if target P can be achieved using n step applications of interval original_P
    gap = target_P - original_P
    loop = gap + 1
    print("Iterative Application for {} times".format(loop))

    Y_hat = []
    print(len(teX))
    for idx, x_element in enumerate(teX):
        data_copy = copy.deepcopy(data)
        data_at = index_arr[idx] - gap
        x = x_element
        for i in range(0, loop):
            y_h = predict(x, kernelMeans, kernelSigma, kernelWeights)
            # update value by prediction
            data_copy[data_at] = y_h
            x, data_at = ft.extracting_on_index(tau, E, original_P, data_copy, data_at, mode)
        Y_hat.append(y_h)

    err, rmse, rsq, mae = ft.loss_with_prediction_array(teY, Y_hat)
    print(format('rmse: %f, R2: %f, MAE: %f') % (rmse, rsq, mae))
    f.write(format('rmse: %f, R2: %f, MAE: %f') % (rmse, rsq, mae) + '\n')

    """
        plot
    """
    dates = [datetime.datetime.strptime(d, "%Y-%m-%d").date() for d in teYdate]
    plt.gca().xaxis.set_major_formatter(formatter)
    plt.gca().xaxis.set_major_locator(locater)

    pre = teY - err
    plt.plot(dates, teY, 'r')
    plt.plot(dates, pre, 'b')
    plt.legend(["Test Data", "Prediction"])
    plt.savefig("./kernel" + str(num_kernels) + "_prediction_graph.png")
    plt.show()

    f.close()
    return rmse, rsq, mae
def rolling_forecast(teX, teY, teYdate, num_kernels, kernelMeans, kernelSigma,
                     kernelWeights, formatter, locater):
    """
    model test, rolling forecast
    """

    # forecast and update
    n = len(teX)
    Yest = []

    for i in range(n):
        # forecast
        Yhat = ft.output(teX[i], kernelMeans, kernelSigma, kernelWeights)
        Yest.append(Yhat)
        # update
        kernelMeans, kernelSigma, kernelWeights = \
            updateWeights(teX[i], teY[i],
                          num_kernels,
                          kernelMeans, kernelSigma, kernelWeights)

    # evaluate
    f = open('result.txt', 'w')
    err, rmse, rsq, mae = ft.loss_with_prediction_array(teY, Yest)
    print(format('rmse: %f, R2: %f, MAE: %f') % (rmse, rsq, mae))
    f.write(format('rmse: %f, R2: %f, MAE: %f') % (rmse, rsq, mae) + '\n')
    """
        plot
    """
    dates = [datetime.datetime.strptime(d, "%Y-%m-%d").date() for d in teYdate]
    plt.gca().xaxis.set_major_formatter(formatter)
    plt.gca().xaxis.set_major_locator(locater)

    pre = teY - err
    plt.plot(dates, teY, 'r')
    plt.plot(dates, pre, 'b')
    plt.legend(["Test Data", "Prediction"])
    plt.savefig("./kernel" + str(num_kernels) + "_prediction_graph.png")
    plt.show()

    f.close()
    return rmse, rsq, mae
def rolling_forecast(teX, teY, num_kernels, kernelMeans, kernelSigma, kernelWeights, loop):
    """
    model test, rolling forecast
    """

    # forecast and update
    n = len(teX)
    Yest = []

    for i in range(n):
        # forecast
        Yhat = ft.output(teX[i], kernelMeans, kernelSigma, kernelWeights)
        Yest.append(Yhat)
        # update
        kernelMeans, kernelSigma, kernelWeights = \
            updateWeights(teX[i], teY[i],
                          num_kernels,
                          kernelMeans, kernelSigma, kernelWeights,
                          loop)

    # evaluate
    f = open('result.txt', 'w')
    err, rmse, rsq, mae = ft.loss_with_prediction_array(teY, Yest)
    print(format('rmse: %f, R2: %f, MAE: %f') % (rmse, rsq, mae))
    f.write(format('rmse: %f, R2: %f, MAE: %f') % (rmse, rsq, mae) + '\n')

    # plot
    pre = teY - err
    plt.plot(teY, 'r')
    plt.plot(pre, 'b')
    plt.legend(["Test Data", "Prediction"])
    plt.savefig("./kernel" + str(num_kernels) + "_prediction_graph.png")
    plt.show()

    f.close()
    return rmse, rsq, mae
def rolling_forecast(teX, teY, num_kernels, kernelMeans, kernelSigma,
                     kernelWeights):
    """
    model test, rolling forecast
    """

    # forecast and update
    n = len(teX)
    Yest = []

    for i in range(n):
        # forecast
        Yhat = ft.output(teX[i], kernelMeans, kernelSigma, kernelWeights)
        Yest.append(Yhat)
        # update
        kernelMeans, kernelSigma, kernelWeights = \
            updateWeights(teX[i], teY[i],
                          num_kernels,
                          kernelMeans, kernelSigma, kernelWeights)

    # evaluate
    err, rmse, rsq, mae = ft.loss_with_prediction_array(teY, Yest)

    return Yest, rmse, rsq, mae