code: def _build_features_caches(self):
          
          _donors_pool = self._donors_pool.get()[0]
          _lr_curves = self._lr_curves.get()[0]
  
          if _donors_pool is None or _lr_curves is None:
              # We need to have both donors_pool and lr_curves defined
              # to reconstruct the matrices
              return None
  
          self.num_donors = len(_donors_pool)
  
          # Build a numpy matrix cache for the continuous features.
          self.continuous_features = np.zeros((self.num_donors, len(CONTINUOUS_FEATURES)))
          for idx, d in enumerate(_donors_pool):
              features = [d.get(specified_key) for specified_key in CONTINUOUS_FEATURES]
              self.continuous_features[idx] = features
  
          # Build the cache for categorical features.
          self.categorical_features = np.zeros(
              (self.num_donors, len(CATEGORICAL_FEATURES)), dtype="object"
          )
          for idx, d in enumerate(_donors_pool):
              features = [d.get(specified_key) for specified_key in CATEGORICAL_FEATURES]
              self.categorical_features[idx] = np.array([features], dtype="object")
  
          self.logger.info("Reconstructed matrices for similarity recommender")
docs: This function build two feature cache matrices.
  
          That's the self.categorical_features and
          self.continuous_features attributes.
  
          One matrix is for the continuous features and the other is for
          the categorical features. This is needed to speed up the similarity
          recommendation process.