docstr: save instrument data to file
  
  Parameters
  ----------
  symbol: str
      instrument code
  df : pd.DataFrame
      df.columns must contain "symbol" and "datetime"
code: def save_instrument(self, symbol, df: pd.DataFrame):
      """save instrument data to file
  
      Parameters
      ----------
      symbol: str
          instrument code
      df : pd.DataFrame
          df.columns must contain "symbol" and "datetime"
      """
      if df is None or df.empty:
          logger.warning(f"{symbol} is empty")
          return
  
      symbol = self.normalize_symbol(symbol)
      symbol = code_to_fname(symbol)
      instrument_path = self.save_dir.joinpath(f"{symbol}.csv")
      df["symbol"] = symbol
      if instrument_path.exists():
          _old_df = pd.read_csv(instrument_path)
          df = pd.concat([_old_df, df], sort=False)
      df.to_csv(instrument_path, index=False)
  
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 9 for calling the BaseCollector obj's underlying member method code with example usage: obj.save_instrument(symbol, df) without return types