class_docstr: Merge a dict of rolling dataframe like `prediction` or `IC` into an ensemble.
  
  NOTE: The values of dict must be pd.DataFrame, and have the index "datetime".
  
  When calling this class:
  
      Args:
          ensemble_dict (dict): a dict like {"A": pd.DataFrame, "B": pd.DataFrame}.
          The key of the dict will be ignored.
  
      Returns:
          pd.DataFrame: the complete result of rolling.
class_docstr_tok: ["Merge","a","dict","of","rolling","dataframe","like","`","prediction","`","or","`","IC","`","into","an","ensemble",".","NOTE",":","The","values","of","dict","must","be","pd.DataFrame",",","and","have","the","index","``","datetime","''",".","When","calling","this","class",":","Args",":","ensemble_dict","(","dict",")",":","a","dict","like","{","``","A","''",":","pd.DataFrame",",","``","B","''",":","pd.DataFrame","}",".","The","key","of","the","dict","will","be","ignored",".","Returns",":","pd.DataFrame",":","the","complete","result","of","rolling","."]
code: def __call__(self, ensemble_dict: dict) -> pd.DataFrame:
      get_module_logger("RollingEnsemble").info(
          f"keys in group: {list(ensemble_dict.keys())}"
      )
      artifact_list = list(ensemble_dict.values())
      artifact_list.sort(
          key=lambda x: x.index.get_level_values("datetime").min()
      )
      artifact = pd.concat(artifact_list)
      # If there are duplicated predition, use the latest perdiction
      artifact = artifact[~artifact.index.duplicated(keep="last")]
      artifact = artifact.sort_index()
      return artifact
  
file_path: qlib/qlib/model/ens/ensemble.py
imports: from typing import Union
  import pandas
  from qlib.utils import FLATTEN_TUPLE, flatten_dict
  from qlib.log import get_module_logger
label_desc: Use image node_id 1 for calling the RollingEnsemble obj's underlying member method code with example usage: obj.__call__(ensemble_dict) and returns: artifact