code: def __init__(
      self, filename, shuffle=False, rng=None, normalize=False
  ):
      super(CsvDataSource, self).__init__(shuffle=shuffle, rng=rng)
      self._filename = filename
      self._normalize = normalize
  
      # Store contents of CSV file into the self._rows list.
      self._generation = -1
      self._rows = []
      self._filereader = FileReader(self._filename)
      with self._filereader.open(
          textmode=True, encoding="utf-8-sig"
      ) as f:
          csvreader = csv.reader(f)
          header = next(csvreader)
          self._rows = list(csvreader)
          self._size = len(self._rows)
          self._remove_comment_cols(header, self._rows)
          self._process_header(header)
      self._original_source_uri = self._filename
      self._original_order = list(range(self._size))
      self._order = list(range(self._size))
      self._variables = tuple(self._variables_dict.keys())
      self.reset()
  
imports: import atexit
  import csv
  import os
  import threading
  from collections import OrderedDict, deque
  from time import sleep
  import numpy
  from nnabla.config import nnabla_config
  from nnabla.logger import logger
  from nnabla.utils.communicator_util import current_communicator
  from six.moves import queue
  from .data_source import DataSource
  from .data_source_loader import FileReader, load
label_desc: Use image node_id 6 to create a new CsvDataSource object from inherited base classes: DataSource with example: obj = CsvDataSource(filename, shuffle, rng, normalize)