code: def merge_features(self, users, items, feature_cols=None):
      df = pd.DataFrame(
          self.features, columns=["user", "item"], dtype=np.int64
      )
      df["labels"] = self.labels
      df = users.merge(df, on="user")
      df = df.merge(items, on="item")
  
      # To make the order of data columns as expected.
      if feature_cols:
          self.features = df.loc[:, feature_cols]
      self.features = tuple(
          map(list, self.features.itertuples(index=False))
      )
      self.labels = df["labels"].values.tolist()
  
imports: import os
  import tempfile
  import numpy
  import pandas
  import scipy.sparse
  from sklearn.model_selection import train_test_split
  from sklearn.preprocessing import MinMaxScaler
  import torch.utils.data
  from bigdl.dllib.utils.file_utils import is_local_path
  from bigdl.orca.data.file import get_remote_dir_to_local, get_remote_file_to_local
label_desc: Use image node_id 3 for calling the NCFData obj's underlying member method code with example usage: obj.merge_features(users, items, feature_cols) without return types