code: def _valid_data_column_names(features_list, target_columns):
      # logic for determining on which columns can be learned. Note that from the
      # OpenML guide follows that columns that have the `is_row_identifier` or
      # `is_ignore` flag, these can not be learned on. Also target columns are
      # excluded.
      valid_data_column_names = []
      for feature in features_list:
          if (
              feature["name"] not in target_columns
              and feature["is_ignore"] != "true"
              and feature["is_row_identifier"] != "true"
          ):
              valid_data_column_names.append(feature["name"])
      return valid_data_column_names
  
imports: import gzip
  import hashlib
  import json
  import os
  import shutil
  import time
  from contextlib import closing
  from functools import wraps
  from os.path import join
  from tempfile import TemporaryDirectory
  from typing import Any, Callable, Dict, List, Optional, Tuple, Union
  from urllib.error import HTTPError, URLError
  from urllib.request import Request, urlopen
  from warnings import warn
  import numpy
  from ..utils import Bunch, check_pandas_support
  from ..utils._param_validation import Integral, Interval, Real, StrOptions, validate_params
  from .None import get_data_home
  from ._arff_parser import load_arff_from_gzip_file
label_desc: Use image node_id 14 for calling a global function with example usage: _valid_data_column_names(features_list, target_columns) and returns: valid_data_column_names