code: def _dump_features(self):
      logger.info("start dump features......")
      error_code = {}
      with ProcessPoolExecutor(max_workers=self.works) as executor:
          futures = {}
          for _code, _df in self._all_data.groupby(
              self.symbol_field_name
          ):
              _code = fname_to_code(str(_code).lower()).upper()
              _start, _end = self._get_date(_df, is_begin_end=True)
              if not (
                  isinstance(_start, pd.Timestamp)
                  and isinstance(_end, pd.Timestamp)
              ):
                  continue
              if _code in self._update_instruments:
                  # exists stock, will append data
                  _update_calendars = (
                      _df[
                          _df[self.date_field_name]
                          > self._update_instruments[_code][
                              self.INSTRUMENTS_END_FIELD
                          ]
                      ][self.date_field_name]
                      .sort_values()
                      .to_list()
                  )
                  if _update_calendars:
                      self._update_instruments[_code][
                          self.INSTRUMENTS_END_FIELD
                      ] = self._format_datetime(_end)
                      futures[
                          executor.submit(
                              self._dump_bin, _df, _update_calendars
                          )
                      ] = _code
              else:
                  # new stock
                  _dt_range = self._update_instruments.setdefault(
                      _code, dict()
                  )
                  _dt_range[
                      self.INSTRUMENTS_START_FIELD
                  ] = self._format_datetime(_start)
                  _dt_range[
                      self.INSTRUMENTS_END_FIELD
                  ] = self._format_datetime(_end)
                  futures[
                      executor.submit(
                          self._dump_bin, _df, self._new_calendar_list
                      )
                  ] = _code
  
          with tqdm(total=len(futures)) as p_bar:
              for _future in as_completed(futures):
                  try:
                      _future.result()
                  except Exception:
                      error_code[
                          futures[_future]
                      ] = traceback.format_exc()
                  p_bar.update()
          logger.info(f"dump bin errors: {error_code}")
  
      logger.info("end of features dump.\n")
  
imports: import abc
  import shutil
  import traceback
  from pathlib import Path
  from typing import Iterable, List, Union
  from functools import partial
  from concurrent.futures import ThreadPoolExecutor, as_completed, ProcessPoolExecutor
  import fire
  import numpy
  import pandas
  from tqdm import tqdm
  from loguru import logger
  from qlib.utils import fname_to_code, code_to_fname
label_desc: Use image node_id 5 for calling the DumpDataUpdate obj's underlying member method code with example usage: obj._dump_features() without return types