code: def test_save_load(self):
      print("-" * 80)
      logger.info(
          "TestMeanAnomEnsemble.test_save_load\n" + "-" * 80 + "\n"
      )
  
      self.ensemble.train(self.vals_train)
      scores = self.ensemble.get_anomaly_label(self.vals_test)
  
      self.ensemble.save(join(rootdir, "tmp", "mean_anom_ensemble"))
      ensemble = DetectorEnsemble.load(
          join(rootdir, "tmp", "mean_anom_ensemble")
      )
      loaded_scores = ensemble.get_anomaly_label(self.vals_test)
      self.assertSequenceEqual(list(scores), list(loaded_scores))
  
      # serialize and deserialize
      obj = self.ensemble.to_bytes()
      ensemble = ModelFactory.load_bytes(obj)
      loaded_scores = ensemble.get_anomaly_label(self.vals_test)
      self.assertSequenceEqual(list(scores), list(loaded_scores))
  
imports: import logging
  from os.path import abspath, dirname, join
  import sys
  import unittest
  import numpy
  from merlion.models.anomaly.windstats import WindStats, WindStatsConfig
  from merlion.models.ensemble.anomaly import DetectorEnsemble, DetectorEnsembleConfig
  from merlion.models.ensemble.combine import Mean, Median
  from merlion.models.factory import ModelFactory
  from merlion.transform.resample import TemporalResample
  from merlion.utils.data_io import csv_to_time_series
label_desc: Use image node_id 3 for calling the TestMeanAnomEnsemble obj's underlying member method code with example usage: obj.test_save_load() without return types