Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions gooddata-pandas/gooddata_pandas/dataframe.py
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,7 @@ def for_exec_result_id(
result_cache_metadata: Optional[ResultCacheMetadata] = None,
result_size_dimensions_limits: ResultSizeDimensions = (),
result_size_bytes_limit: Optional[int] = None,
use_local_ids_in_headers: bool = False,
) -> pandas.DataFrame:
"""
Creates a data frame using an execution result's metadata identified by result_id. The data frame will respect
Expand Down Expand Up @@ -335,6 +336,7 @@ def for_exec_result_id(
:param result_cache_metadata: Metadata for the corresponding exec result. Optional.
:param result_size_dimensions_limits: A tuple containing maximum size of result dimensions. Optional.
:param result_size_bytes_limits: Maximum size of result in bytes. Optional.
:param use_local_ids_in_headers: Use local identifiers of header attributes and metrics. Optional.

:return: a new dataframe
"""
Expand All @@ -356,4 +358,5 @@ def for_exec_result_id(
label_overrides=label_overrides,
result_size_dimensions_limits=result_size_dimensions_limits,
result_size_bytes_limit=result_size_bytes_limit,
use_local_ids_in_headers=use_local_ids_in_headers,
)
50 changes: 38 additions & 12 deletions gooddata-pandas/gooddata_pandas/result_convertor.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,14 +197,19 @@ def _read_complete_execution_result(


def _create_header_mapper(
response: BareExecutionResponse, dim: int, label_overrides: Optional[LabelOverrides] = None
response: BareExecutionResponse,
dim: int,
label_overrides: Optional[LabelOverrides] = None,
use_local_ids_in_headers: bool = False,
) -> Callable[[Any, Optional[int]], str]:
"""
Prepares header mapper function which is doing header structures translations into appropriate label used
in a dataframe
:param response: Response structure to gather dimension header details
:param dim: dimension id
:param label_overrides: label overrides
:param use_local_ids_in_headers: Use local identifiers of header attributes and metrics. Optional.

:return: Mapper function
"""
if label_overrides is None:
Expand All @@ -223,20 +228,26 @@ def _mapper(header: Any, header_idx: Optional[int]) -> str:
label = header["attributeHeader"]["labelValue"]
elif "labelName" in header["attributeHeader"]:
attr_local_id = header["attributeHeader"]["localIdentifier"]
if attr_local_id in attribute_labels:
label = attribute_labels[attr_local_id]["title"]
if use_local_ids_in_headers:
label = attr_local_id
else:
label = header["attributeHeader"]["labelName"]
if attr_local_id in attribute_labels:
label = attribute_labels[attr_local_id]["title"]
else:
label = header["attributeHeader"]["labelName"]
elif "measureHeader" in header and header_idx is not None:
measure_idx = header["measureHeader"]["measureIndex"]
measure_descriptor = dim_descriptor["headers"][header_idx]["measureGroupHeaders"][measure_idx]

if measure_descriptor["localIdentifier"] in measure_labels:
label = measure_labels[measure_descriptor["localIdentifier"]]["title"]
elif "name" in measure_descriptor:
label = measure_descriptor["name"]
else:
if use_local_ids_in_headers:
label = measure_descriptor["localIdentifier"]
else:
if measure_descriptor["localIdentifier"] in measure_labels:
label = measure_labels[measure_descriptor["localIdentifier"]]["title"]
elif "name" in measure_descriptor:
label = measure_descriptor["name"]
else:
label = measure_descriptor["localIdentifier"]
elif "totalHeader" in header:
label = header["totalHeader"]["function"]
return label
Expand All @@ -249,11 +260,17 @@ def _headers_to_index(
headers: Tuple[_DataHeaders, Optional[_DataHeaders]],
response: BareExecutionResponse,
label_overrides: LabelOverrides,
use_local_ids_in_headers: bool = False,
) -> Optional[pandas.Index]:
if len(response.dimensions) <= dim_idx or not len(response.dimensions[dim_idx]["headers"]):
return None

mapper = _create_header_mapper(response=response, dim=dim_idx, label_overrides=label_overrides)
mapper = _create_header_mapper(
response=response,
dim=dim_idx,
label_overrides=label_overrides,
use_local_ids_in_headers=use_local_ids_in_headers,
)

return pandas.MultiIndex.from_arrays(
[
Expand Down Expand Up @@ -309,6 +326,7 @@ def convert_execution_response_to_dataframe(
label_overrides: LabelOverrides,
result_size_dimensions_limits: ResultSizeDimensions,
result_size_bytes_limit: Optional[int] = None,
use_local_ids_in_headers: bool = False,
) -> pandas.DataFrame:
"""
Converts execution result to a pandas dataframe, maintaining the dimensionality of the result.
Expand All @@ -332,9 +350,17 @@ def convert_execution_response_to_dataframe(
return pandas.DataFrame(
data=full_data,
index=_headers_to_index(
dim_idx=0, headers=full_headers, response=execution_response, label_overrides=label_overrides
dim_idx=0,
headers=full_headers,
response=execution_response,
label_overrides=label_overrides,
use_local_ids_in_headers=use_local_ids_in_headers,
),
columns=_headers_to_index(
dim_idx=1, headers=full_headers, response=execution_response, label_overrides=label_overrides
dim_idx=1,
headers=full_headers,
response=execution_response,
label_overrides=label_overrides,
use_local_ids_in_headers=use_local_ids_in_headers,
),
)