def get_displacement_model_traces(load_data, visualised_load_data, traces, model, model_name, model_color, y_axis, start_date, end_date):
    predicted_load_data = displacement_model.predict(
        load_data, start_date, end_date, model)
    assert (len(visualised_load_data) == len(predicted_load_data)) # prevents plotting a model when not all displaced data is available
    predicted_load_traces = generate_traces(
        visualised_load_data['Date'], predicted_load_data[y_axis], model_name, predicted_load_data['Date'].tolist(), color=model_color)
    traces.extend(predicted_load_traces)
    return traces
def get_regression_model_traces(load_data, visualised_load_data, traces, model, model_name, model_color, y_axis, start_date, end_date):
    try:
        predicted_load_data = regression_model.predict(
            load_data, start_date, end_date, model, y_axis)
    except Exception as predict_error:
        raise predict_error
    
    predicted_load_traces = generate_traces(
        visualised_load_data['Date'], predicted_load_data, model_name, color=model_color)
    traces.extend(predicted_load_traces)
    return traces
def get_highlighted_traces(traces, highlight_variable, highlight_value, load_data, start_date, end_date, y_axis):
    visualised_load_data = load_data[(
        load_data.Date >= start_date) & (load_data.Date <= end_date)]
    if (highlight_variable != 'None' and highlight_value != 'None'): #if there is highlighted data points specified
        highlighted_load_data = pd.DataFrame() #structure to hold data entries that are highlighted 
        highlighted_load_data['Date'], highlighted_load_data['y_axis'] = zip(*visualised_load_data.apply(
            lambda row: get_highlighted_entries_dataframe(row, highlight_variable, highlight_value, y_axis), axis=1))
        highlighted_traces = generate_traces(
            highlighted_load_data['Date'], highlighted_load_data['y_axis'], 'Highlighted Load', color=highlight_color, line_width=2)
        traces.extend(highlighted_traces)
    return traces 
def generate_model_error_traces(load_data, graph_figure, models,
                                test_data_start_date, test_data_end_date,
                                highlight_variable, highlight_value):
    actual_load_y = graph_figure['data'][0]['y']
    # if there is highlighted data points, models index >= 2
    if (graph_figure['data'][1]['name'] == 'Highlighted Load'):
        start_index = 2
        highlighted_dates = graph_figure['data'][1][
            'x']  # list of dates that are highlighted in the visualised models graph
    else:
        start_index = 1
        highlighted_dates = [
        ]  #no highlighted dates in the model visualisation graph

    if (test_data_start_date == None or test_data_end_date
            == None):  #if there is test data chosen, need to visualise this
        is_test_data = False
    else:
        is_test_data = True

    model_error_traces = []  #list of traces to plot
    highlighted_data_points = pd.DataFrame(
        columns=['APE', 'Percentage', 'Text']
    )  # structure to contain the highlighted data error points to superimpose onto the graph
    for i in range(start_index, len(graph_figure['data'])
                   ):  #iterate through all model visualisation points on graph
        plotted_model = graph_figure['data'][
            i]  #the model forecast plotted in the load visualisation graph
        model_error_traces, highlighted_data_points = generate_visualised_error_traces(
            plotted_model, actual_load_y, model_error_traces,
            highlighted_dates, highlighted_data_points)
        if (
                is_test_data == True
        ):  #test data is chosen, generate test data model error visualisation points
            model_error_traces, highlighted_data_points = generate_test_error_traces(
                plotted_model, models, load_data, test_data_start_date,
                test_data_end_date, highlight_variable, highlight_value,
                model_error_traces, highlighted_data_points)
    if (len(highlighted_data_points)
        ):  #if there is highlighted points generate their superimposed traces
        highlighted_traces = generate_traces(
            highlighted_data_points['APE'],
            highlighted_data_points['Percentage'],
            'Highlighted',
            highlighted_data_points['Text'].tolist(),
            color=highlight_color,
            marker_size=4,
            mode='markers')
        model_error_traces.extend(highlighted_traces)
    return model_error_traces
def generate_error_traces(model_error_traces, model_error_data, legend_name,
                          model_color, highlighted_data_points):
    error_traces = generate_traces(model_error_data['APE'],
                                   model_error_data['Percentage'],
                                   legend_name,
                                   model_error_data['Text'].tolist(),
                                   color=model_color,
                                   marker_size=1.5,
                                   mode='lines+markers',
                                   line_width=2)
    model_error_traces.extend(error_traces)
    highlighted_data_points = highlighted_data_points.append(
        model_error_data[model_error_data['Highlight'] == True], sort=False)
    return model_error_traces, highlighted_data_points
def get_visualised_traces(load_data, start_date, end_date, y_axis):
    visualised_load_data = load_data[(
        load_data.Date >= start_date) & (load_data.Date <= end_date)]
    visualised_traces = generate_traces(
        visualised_load_data['Date'], visualised_load_data[y_axis], 'Actual Load', color=actual_load_color)
    return visualised_traces