code: def query(self, method_verb, endpoint, authenticate=False,
                *args, **kwargs):
          
          if self.version:
              endpoint_path = join(self.version, endpoint)
          else:
              endpoint_path = endpoint
  
          url = urljoin(self.uri, endpoint_path)
          if authenticate:  # sign off kwargs and url before sending request
              url, request_kwargs = self.sign(url, endpoint, endpoint_path,
                                              method_verb, *args, **kwargs)
          else:
              request_kwargs = kwargs
          log.debug("Making request to: %s, kwargs: %s", url, request_kwargs)
          r = self.api_request(method_verb, url, timeout=self.timeout,
                               **request_kwargs)
          log.debug("Made %s request made to %s, with headers %s and body %s. "
                    "Status code %s", r.request.method,
                    r.request.url, r.request.headers,
                    r.request.body, r.status_code)
          return r
docs: Queries exchange using given data. Defaults to unauthenticated query.
          :param method_verb: valid request type (PUT, GET, POST etc)
          :param endpoint: endpoint path for the resource to query, sans the url &
                           API version (i.e. '/btcusd/ticker/').
          :param authenticate: Bool to determine whether or not a signature is
                               required.
          :param args: Optional args for requests.request()
          :param kwargs: Optional Kwargs for self.sign() and requests.request()
          :return: request.response() obj