code: def fetch_data(self):
      # create a data frame directly from the full text of
      # the response from the returned file-descriptor.
      data = self.fetch_url(self.url)
      fd = StringIO()
  
      if isinstance(data, str):
          fd.write(data)
      else:
          for chunk in data:
              fd.write(chunk)
  
      self.fetch_size = fd.tell()
  
      fd.seek(0)
  
      try:
          # see if pandas can parse csv data
          frames = read_csv(fd, **self.pandas_kwargs)
  
          frames_hash = hashlib.md5(str(fd.getvalue()).encode("utf-8"))
          self.fetch_hash = frames_hash.hexdigest()
      except pd.parser.CParserError:
          # could not parse the data, raise exception
          raise Exception("Error parsing remote CSV data.")
      finally:
          fd.close()
  
      return frames
  
imports: from abc import ABCMeta, abstractmethod
  from collections import namedtuple
  import hashlib
  from textwrap import dedent
  import warnings
  from logbook import Logger
  import numpy
  import pandas
  from pandas import read_csv
  import pytz
  import requests
  from six import StringIO, iteritems, with_metaclass
  from zipline.errors import MultipleSymbolsFound, SymbolNotFound, ZiplineError
  from zipline.protocol import DATASOURCE_TYPE, Event
  from zipline.assets import Equity
label_desc: Use image node_id 4 for calling the PandasRequestsCSV obj's underlying member method code with example usage: obj.fetch_data() and returns: frames