def generate_column_names(forecaster_set_size=3, number_options=3):
    """
    This function generates a list which will be used for columns,
    
    Arguments:
    forecaster_set_size -- this determines the number of forecasters we will use per row (by default=3)
    number_options -- this determines the number of options a forecaster has to fultill (by default=3)
    
    Returns:
    column_names -- a list containing the column names
    Example of return list:
    'user_id_1_a',
    'answer_option_1_a',
    'value_1_a',
    
    'user_id_1_b',
    'answer_option_1_b',
    'value_1_b',
    
    'user_id_1',
    'answer_option_1_c',
    'value_1_c',
    
    fcast_date_1,
    
    'user_id_2_a',
    'answer_option_2_a',
    'value_2_a', 
    ...
    
    """
    if number_options < 1 or number_options > 26:
        raise ValueError('Number of options out of range, sould be between 1 and 26')
    column_names = []
    
    
    for f_id in range(forecaster_set_size):
        for n_opt in range(number_options):
            if n_opt == 0:
                column_names.append("user_id_{}".format(f_id+1))
            column_names.append("answer_option_{}_{}".format(f_id+1,chr(n_opt+ord('a'))))
            column_names.append("value_{}_{}".format(f_id+1,chr(n_opt+ord('a'))))
        column_names.append("date_fcast_{}".format(f_id+1))
    return column_names