code: def vertical_concat_dfs(
      df_list, join_cols, common_value_cols=[], different_value_cols=[]
  ):
      """For a given set of datarfames with same columns
      in ``df_dict``, it will concat them vertically by using
      ``join_cols`` as joining columns.
  
      For ``common_value_cols`` it only extract the columns from the first
      dataframe.
  
      For ``different_value_cols`` it will extract them for each
      df and concat them horizontally. The new column names will
      have an added index based on their order in ``df_list``.
  
      Parameters
      ----------
      df_list : `list` [`pandas.DataFrame`]
          A list of dataframes which are to be concatenated.
      join_cols : `list` [`str`]
          The list of columns which are to be used for joining.
      common_value_cols : `list` [`str`], default ``[]``
          The list of column names for which we assume the values are the
          same across dataframes in ``df_list``. For these columns only data
          is pulled from the first dataframe appearing in ``df_list`.`
      different_value_cols : `list` [`str`], default ``[]``
          The list of columns which are assumed to have potentially different
          values across dataframes.
  
      Returns
      -------
      result : `pd.DataFrame`
          The resulting concatenated dataframe.
      """
      new_df_list = []
      for i, df in enumerate(df_list):
          df = df.copy()
          # only keeps the `common_value_cols` from the first df
          if i != 0:
              for col in common_value_cols:
                  del df[col]
  
          for col in different_value_cols:
              df[f"{col}{i}"] = df[col]
              del df[col]
          new_df_list.append(df)
  
      concat_df = reduce(
          lambda left, right: pd.merge(left, right, on=join_cols),
          new_df_list,
      )
  
      return concat_df
  
file_path: greykite/greykite/detection/detector/ad_utils.py
imports: from functools import reduce
  import pandas
  from greykite.common.constants import ANOMALY_COL
  from greykite.common.constants import END_TIME_COL
  from greykite.common.constants import START_TIME_COL
  from greykite.common.constants import TIME_COL
  from greykite.common.features.outlier import ZScoreOutlierDetector
  from greykite.common.logging import LoggingLevelEnum
  from greykite.common.logging import log_message
  from greykite.detection.detector.constants import Z_SCORE_CUTOFF
label_desc: Use image node_id 2 for calling a global function with example usage: vertical_concat_dfs(df_list, join_cols, common_value_cols, different_value_cols) and returns: concat_df