docstr: download data from Internet
  
  Parameters
  ----------
  max_collector_count: int
      default 2
  delay: float
      time.sleep(delay), default 0
  start: str
      start datetime, default "2000-01-01"
  end: str
      end datetime, default ``pd.Timestamp(datetime.datetime.now() + pd.Timedelta(days=1))``
  check_data_length: int
      check data length, if not None and greater than 0, each symbol will be considered complete if its data length is greater than or equal to this value, otherwise it will be fetched again, the maximum number of fetches being (max_collector_count). By default None.
  limit_nums: int
      using for debug, by default None
  
  Examples
  ---------
      # get daily data
      $ python collector.py download_data --source_dir ~/.qlib/instrument_data/source --region CN --start 2020-11-01 --end 2020-11-10 --delay 0.1 --interval 1d
      # get 1m data
      $ python collector.py download_data --source_dir ~/.qlib/instrument_data/source --region CN --start 2020-11-01 --end 2020-11-10 --delay 0.1 --interval 1m
code: def download_data(
      self,
      max_collector_count=2,
      delay=0,
      start=None,
      end=None,
      check_data_length: int = None,
      limit_nums=None,
      **kwargs,
  ):
      """download data from Internet
  
      Parameters
      ----------
      max_collector_count: int
          default 2
      delay: float
          time.sleep(delay), default 0
      start: str
          start datetime, default "2000-01-01"
      end: str
          end datetime, default ``pd.Timestamp(datetime.datetime.now() + pd.Timedelta(days=1))``
      check_data_length: int
          check data length, if not None and greater than 0, each symbol will be considered complete if its data length is greater than or equal to this value, otherwise it will be fetched again, the maximum number of fetches being (max_collector_count). By default None.
      limit_nums: int
          using for debug, by default None
  
      Examples
      ---------
          # get daily data
          $ python collector.py download_data --source_dir ~/.qlib/instrument_data/source --region CN --start 2020-11-01 --end 2020-11-10 --delay 0.1 --interval 1d
          # get 1m data
          $ python collector.py download_data --source_dir ~/.qlib/instrument_data/source --region CN --start 2020-11-01 --end 2020-11-10 --delay 0.1 --interval 1m
      """
  
      _class = getattr(
          self._cur_module, self.collector_class_name
      )  # type: Type[BaseCollector]
      _class(
          self.source_dir,
          max_workers=self.max_workers,
          max_collector_count=max_collector_count,
          delay=delay,
          start=start,
          end=end,
          interval=self.interval,
          check_data_length=check_data_length,
          limit_nums=limit_nums,
          **kwargs,
      ).collector_data()
  
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 5 for calling the BaseRun obj's underlying member method code with example usage: obj.download_data(max_collector_count, delay, start, end, check_data_length, limit_nums) without return types