def build_train_and_test_features(
        df_columns,
        features_to_process,
        predict_feature,
        ignore_features):
    """build_train_and_test_features

    Order matters when slicing up datasets using scalers...

    if not, then something that is an int/bool can get into a float
    column and that is really bad for making predictions
    with new or pre-trained models...

    :param df_columns: columns in the dataframe
    :param features_to_process: requested features to train
    :param predict_feature: requested feature to predict
    :param ignore_features: requested non-numeric/not-wanted features
    """
    train_and_test_features = []

    # for all columns in the data
    # add columns in order if they are in the requested:
    # features_to_process list and not in the ignore_features
    for c in df_columns:
        if c == predict_feature:
            train_and_test_features.append(
                c)
        else:
            add_feature = True
            for i in ignore_features:
                if i == c:
                    add_feature = False
                    break
            if add_feature:
                for f in features_to_process:
                    if f == c:
                        train_and_test_features.append(
                            c)
                        break
    # end of filtering features before scalers

    return train_and_test_features