def METHOD_NAME(self, query: str, **kwargs) -> Tuple[pd.DataFrame, Any]:
    """
    Execute query string and return DataFrame of results.
    Parameters
    ----------
    query : str
        Query to execute against Resource Graph
    Returns
    -------
    Union[pd.DataFrame,Any]
        A DataFrame (if successful) or
        the underlying provider result if an error occurs.
    """
    if not self.connected:
        self.connect()
    if not self.connected:
        raise MsticpyNotConnectedError(
            "Source is not connected. ", "Please call connect() and retry."
        )
    result_truncated = False
    top = kwargs.get("top", 1000)
    request_options = QueryRequestOptions(
        top=top,
        result_format=ResultFormat.object_array,
    )
    request = QueryRequest(
        query=query,
        subscriptions=self.subscription_ids,
        options=request_options,
    )
    response: QueryResponse = self.client.resources(request)
    # Pagination logic adapted from azure-cli-extensions
    # https://github.com/Azure/azure-cli-extensions/blob/8dade2f6fe28803d0fbdb1700c3ab4e4d71e5318/src/resource-graph/azext_resourcegraph/custom.py#L75
    if response.result_truncated == ResultTruncated.true:
        result_truncated = True
    if result_truncated and top is not None and len(response.data) < top:
        warnings.warn(
            "Unable to paginate the results of the query. "
            "Some resources may be missing from the results. "
            "To rewrite the query and enable paging, "
            "see the docs for an example: https://aka.ms/arg-results-truncated",
        )
    return pd.json_normalize(response.data), response