docstr: Parameters
  ----------
  source_dir: str or Path
      The directory where the raw data collected from the Internet is saved
  target_dir: str or Path
      Directory for normalize data
  normalize_class: Type[YahooNormalize]
      normalize class
  max_workers: int
      Concurrent number, default is 16
  date_field_name: str
      date field name, default is date
  symbol_field_name: str
      symbol field name, default is symbol
code: def __init__(
      self,
      source_dir: [str, Path],
      target_dir: [str, Path],
      normalize_class: Type[BaseNormalize],
      max_workers: int = 16,
      date_field_name: str = "date",
      symbol_field_name: str = "symbol",
      **kwargs,
  ):
      """
  
      Parameters
      ----------
      source_dir: str or Path
          The directory where the raw data collected from the Internet is saved
      target_dir: str or Path
          Directory for normalize data
      normalize_class: Type[YahooNormalize]
          normalize class
      max_workers: int
          Concurrent number, default is 16
      date_field_name: str
          date field name, default is date
      symbol_field_name: str
          symbol field name, default is symbol
      """
      if not (source_dir and target_dir):
          raise ValueError("source_dir and target_dir cannot be None")
      self._source_dir = Path(source_dir).expanduser()
      self._target_dir = Path(target_dir).expanduser()
      self._target_dir.mkdir(parents=True, exist_ok=True)
      self._date_field_name = date_field_name
      self._symbol_field_name = symbol_field_name
      self._end_date = kwargs.get("end_date", None)
      self._max_workers = max_workers
  
      self._normalize_obj = normalize_class(
          date_field_name=date_field_name,
          symbol_field_name=symbol_field_name,
          **kwargs,
      )
  
imports: import abc
  import time
  import datetime
  import importlib
  from pathlib import Path
  from typing import Type, Iterable
  from concurrent.futures import ProcessPoolExecutor
  import pandas
  from tqdm import tqdm
  from loguru import logger
  from joblib import Parallel, delayed
  from qlib.utils import code_to_fname
label_desc: Use image node_id 1 to create a new Normalize object  with example: obj = Normalize(source_dir, target_dir, normalize_class, max_workers, date_field_name, symbol_field_name)