code: def load_csv_files(
      input_files: List[str], shard_size: Optional[int] = None
  ) -> Iterator[pd.DataFrame]:
      """Load data as pandas dataframe from CSV files.
  
      Parameters
      ----------
      input_files: List[str]
          List of filenames
      shard_size: int, default None
          The shard size to yield at one time.
  
      Returns
      -------
      Iterator[pd.DataFrame]
          Generator which yields the dataframe which is the same shard size.
      """
      # First line of user-specified CSV *must* be header.
      shard_num = 1
      for input_file in input_files:
          if shard_size is None:
              yield pd.read_csv(input_file)
          else:
              logger.info(
                  "About to start loading CSV from %s" % input_file
              )
              for df in pd.read_csv(input_file, chunksize=shard_size):
                  logger.info(
                      "Loading shard %d of size %s."
                      % (shard_num, str(shard_size))
                  )
                  df = df.replace(np.nan, str(""), regex=True)
                  shard_num += 1
                  yield df
  
imports: import joblib
  import gzip
  import pickle
  import os
  import tempfile
  import tarfile
  import zipfile
  import logging
  from urllib.request import urlretrieve
  from typing import Any, Iterator, List, Optional, Tuple, Union, cast, IO
  import pandas
  import numpy
  import deepchem
label_desc: Use image node_id 8 for calling a global function with example usage: load_csv_files(input_files, shard_size) without return types