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
36 changes: 20 additions & 16 deletions TM1py/Services/ElementService.py
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,18 @@ def get_elements_dataframe(self, dimension_name: str = None, hierarchy_name: str

cell_service = self._get_cell_service()

# override column names. hierarchy name with dimension and prefix attributes
element_attributes = self.get_element_attributes(dimension_name, hierarchy_name)
column_renaming = dict()
if attribute_column_prefix or attribute_suffix:
column_renaming = {
ea.name: f"{attribute_column_prefix}{ea.name}" + (
f":{ea.attribute_type.lower()[0]}"
if attribute_suffix
else "")
for ea
in element_attributes}

# responses are similar but not equivalent.
# Therefor only use execute_mdx_dataframe when use_blob is True
if use_blob:
Expand All @@ -455,14 +467,21 @@ def get_elements_dataframe(self, dimension_name: str = None, hierarchy_name: str
columns='}ElementAttributes_' + dimension_name,
values='Value',
aggfunc='first',
sort=False).reset_index()
sort=False)

# override column names. hierarchy name with dimension and prefix attributes
df_data.columns = [column_renaming.get(col, col) for col in df_data.columns]
df_data = df_data.reset_index()

# Drop the group key
df_data = df_data.fillna("").drop(columns='_group')

else:
df_data = cell_service.execute_mdx_dataframe_shaped(mdx, **kwargs)

# override column names. hierarchy name with dimension and prefix attributes
df_data.columns = [df_data.columns[0]] + [column_renaming.get(col, col) for col in df_data.columns[1:]]

if levels_dict:
# rename level names to conform sto standard levels "1" -> "level001"
df_data.rename(columns=levels_dict, inplace=True)
Expand Down Expand Up @@ -494,21 +513,6 @@ def get_elements_dataframe(self, dimension_name: str = None, hierarchy_name: str
for col in alias_attributes:
df_data[col] = np.where(df_data[col] == '', df_data[dimension_name], df_data[col])

# override column names. hierarchy name with dimension and prefix attributes
column_renaming = dict()
if attribute_column_prefix or attribute_suffix:
column_renaming = {
ea.name: f"{attribute_column_prefix}{ea.name}" + (
f":{ea.attribute_type.lower()[0]}"
if attribute_suffix
else "")
for ea
in element_attributes}

column_renaming[hierarchy_name] = dimension_name

df_data.rename(columns=column_renaming, inplace=True)

# shift levels to right hand side
if not skip_parents:
# skip max level (= leaves)
Expand Down
40 changes: 40 additions & 0 deletions Tests/ElementService_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ def setUp(self):

self.dimension_name = pure_dimension_name
self.dimension_with_hierarchies_name = pure_dimension_name + '_with_hierarchies'
self.dimension_with_same_attribute_name = pure_dimension_name + '_attribute_same_name'
self.hierarchy_name = pure_dimension_name
self.attribute_cube_name = '}ElementAttributes_' + pure_dimension_name
self.dimension_does_not_exist_name = pure_dimension_name + "_does_not_exist"
Expand Down Expand Up @@ -79,9 +80,15 @@ def setUp(self):

self.create_or_update_dimension_with_hierarchies()

d.name = self.dimension_with_same_attribute_name
h = d.get_hierarchy(d.name)
h.add_element_attribute(name=self.dimension_with_same_attribute_name, attribute_type="String")
self.tm1.dimensions.update_or_create(d)

def tearDown(self):
self.tm1.dimensions.delete(self.dimension_name)
self.tm1.dimensions.delete(self.dimension_with_hierarchies_name)
self.tm1.dimensions.delete(self.dimension_with_same_attribute_name)

def create_or_update_dimension_with_hierarchies(self):
dimension = Dimension(self.dimension_with_hierarchies_name)
Expand Down Expand Up @@ -575,6 +582,39 @@ def run_test_get_elements_dataframe_not_elements(self, use_blob: bool):

self.assertTrue(df.equals(reference_df))

@skip_if_no_pandas
def test_get_elements_dataframe_attribute_same_name(self):
self.run_test_get_elements_dataframe_attribute_same_name(False)

@skip_if_no_pandas
def test_get_elements_dataframe_attribute_same_name_use_blob(self):
self.run_test_get_elements_dataframe_attribute_same_name(True)

def run_test_get_elements_dataframe_attribute_same_name(self, use_blob: bool):
df = self.tm1.elements.get_elements_dataframe(
dimension_name=self.dimension_with_same_attribute_name,
hierarchy_name=self.dimension_with_same_attribute_name,
skip_consolidations=True,
attributes=None,
attribute_column_prefix="Attribute ",
skip_parents=True,
level_names=None,
parent_attribute=None,
skip_weights=False,
use_blob=use_blob)

expected_columns = (
self.dimension_with_same_attribute_name,
'Type',
'Attribute Previous Year',
'Attribute Next Year',
'Attribute Financial Year',
'Attribute ' + self.dimension_with_same_attribute_name
,)

self.assertEqual((5, 6), df.shape)
self.assertEqual(expected_columns, tuple(df.columns))

@skip_if_no_pandas
def test_get_elements_dataframe_not_elements(self):
self.run_test_get_elements_dataframe_not_elements(use_blob=False)
Expand Down