What are you trying to achieve?
Hi
I have a strange problem with senatic link labs. I wanted to upgrade from version 0.12.9 to 0.13.1. The transition seems to go fine however I suddenly got error from a notebook using the function labs.vertipaq_analyzer. At first I tried to roll the version back to 0.12.9 in my environment but the error was still there.
What have you tried so far?
After a lot of including / excludeing python libraries from environment it seems the problem is only when semant-link is in the same environment (we use version 0.13.1). I also see the same problem if I “pip install” from an environment without any prior install libraries.
I do not understand how it was working at first but then even after rolling back to version 0.12.9 the function still does not.
Has anyone seen this error and do anyone have a workaround?
I tried other functions
Appendix:
Example of call of fucniton
import sempy_labs as labs
df_test = labs.vertipaq_analyzer(dataset = 'PAM_PRICES', workspace = 'ds_models_test')
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Cell In[10], line 1 ----> 1 df_test = labs.vertipaq_analyzer(dataset = 'PAM_PRICES', workspace = 'ds_models_test') File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/_utils/_log.py:370, in mds_log..get_wrapper..log_decorator_wrapper(*args, **kwargs) 367 start_time = time.perf_counter() 369 try: --> 370 result = func(*args, **kwargs) 372 # The invocation for get_message_dict moves after the function 373 # so it can access the state after the method call 374 message.update(extractor.get_completion_message_dict(result, arg_dict)) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy_labs/_vertipaq.py:165, in vertipaq_analyzer(dataset, workspace, export, read_stats_from_data, **kwargs) 162 columns_to_keep = list(vertipaq_map["Tables"].keys()) 163 dfT = dfT[dfT.columns.intersection(columns_to_keep)] --> 165 dfC = fabric.list_columns(dataset=dataset_id, extended=True, workspace=workspace_id) 166 dfC["Column Object"] = format_dax_object_name(dfC["Table Name"], dfC["Column Name"]) 167 dfC.rename(columns={"Column Cardinality": "Cardinality"}, inplace=True) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/_utils/_log.py:370, in mds_log..get_wrapper..log_decorator_wrapper(*args, **kwargs) 367 start_time = time.perf_counter() 369 try: --> 370 result = func(*args, **kwargs) 372 # The invocation for get_message_dict moves after the function 373 # so it can access the state after the method call 374 message.update(extractor.get_completion_message_dict(result, arg_dict)) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/fabric/_credentials.py:239, in with_credential..wrapped(*args, **kwargs) 237 credential = kwargs.pop("credential", None) 238 with set_default_credential(credential): --> 239 return func(*args, **kwargs) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/fabric/_flat_list_columns.py:141, in list_columns(dataset, table, extended, additional_xmla_properties, workspace, credential) 138 df.set_index(["Table Name", "Column Name"], inplace=True) 140 # table id/column id -> table name/column name --> 141 df_table_column = _fetch_table_column(dataset, workspace) 143 # Column cardinality 144 series_column_cardinality = _fetch_column_cardinality(df_table_column, dataset, workspace) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/fabric/_flat_list_columns.py:200, in _fetch_table_column(dataset, workspace) 179 df_col = evaluate_dax(dataset, 180 """ 181 SELECT (...) 187 """, 188 workspace=workspace) 190 df_table = evaluate_dax(dataset, 191 """ 192 SELECT (...) 197 """, 198 workspace=workspace) --> 200 df_table = df_table.merge(df_col, on="SemPyTableID") 202 # rename columns (strip SemPy prefix) 203 df_table = df_table.rename({'SemPyTableName': 'Table Name', 'SemPyColumnName': 'Column Name'}, axis='columns') File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/_metadata/_mdataframe.py:192, in MDataFrame.getattribute.._column_metadata_trimmer(*args, **kwargs) 191 def _column_metadata_trimmer(*args, **kwargs): --> 192 result = attr(*args, **kwargs) 193 self._trim_metadata_to_columns() 194 return result File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/pandas/core/frame.py:12884, in DataFrame.merge(self, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate) 12880 self._check_copy_deprecation(copy) 12882 from pandas.core.reshape.merge import merge > 12884 return merge( 12885 self, 12886 right, 12887 how=how, 12888 on=on, 12889 left_on=left_on, 12890 right_on=right_on, 12891 left_index=left_index, 12892 right_index=right_index, 12893 sort=sort, 12894 suffixes=suffixes, 12895 indicator=indicator, 12896 validate=validate, 12897 ) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/pandas/core/reshape/merge.py:399, in merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate) 384 else: 385 op = _MergeOperation( 386 left_df, 387 right_df, (...) 397 validate=validate, 398 ) --> 399 return op.get_result() File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/pandas/core/reshape/merge.py:1152, in _MergeOperation.get_result(self) 1148 self._maybe_add_join_keys(result, left_indexer, right_indexer) 1150 self._maybe_restore_index_levels(result) -> 1152 return result.finalize( 1153 types.SimpleNamespace( 1154 input_objs=[self.left, self.right], left=self.left, right=self.right 1155 ), 1156 method="merge", 1157 ) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/_metadata/_mdataframe.py:66, in MDataFrame.finalize(self, other, method, **kwargs) 63 # pandas implements a large number of methods with "merge" and "concat" and slicing. 64 # The physical implementation can be verified by placing a debugger breakpoint here. 65 if method == "merge": ---> 66 column_metadata = _merge_metadata(other.left, other.right, other.suffixes) 67 elif method == "concat": 68 column_metadata = _concat_metadata(other.objs, self._headers) AttributeError: 'types.SimpleNamespace' object has no attribute 'suffixes'
What are you trying to achieve?
Hi
I have a strange problem with senatic link labs. I wanted to upgrade from version 0.12.9 to 0.13.1. The transition seems to go fine however I suddenly got error from a notebook using the function labs.vertipaq_analyzer. At first I tried to roll the version back to 0.12.9 in my environment but the error was still there.
What have you tried so far?
After a lot of including / excludeing python libraries from environment it seems the problem is only when semant-link is in the same environment (we use version 0.13.1). I also see the same problem if I “pip install” from an environment without any prior install libraries.
I do not understand how it was working at first but then even after rolling back to version 0.12.9 the function still does not.
Has anyone seen this error and do anyone have a workaround?
I tried other functions
Appendix:
Example of call of fucniton
import sempy_labs as labs
df_test = labs.vertipaq_analyzer(dataset = 'PAM_PRICES', workspace = 'ds_models_test')
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Cell In[10], line 1 ----> 1 df_test = labs.vertipaq_analyzer(dataset = 'PAM_PRICES', workspace = 'ds_models_test') File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/_utils/_log.py:370, in mds_log..get_wrapper..log_decorator_wrapper(*args, **kwargs) 367 start_time = time.perf_counter() 369 try: --> 370 result = func(*args, **kwargs) 372 # The invocation for get_message_dict moves after the function 373 # so it can access the state after the method call 374 message.update(extractor.get_completion_message_dict(result, arg_dict)) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy_labs/_vertipaq.py:165, in vertipaq_analyzer(dataset, workspace, export, read_stats_from_data, **kwargs) 162 columns_to_keep = list(vertipaq_map["Tables"].keys()) 163 dfT = dfT[dfT.columns.intersection(columns_to_keep)] --> 165 dfC = fabric.list_columns(dataset=dataset_id, extended=True, workspace=workspace_id) 166 dfC["Column Object"] = format_dax_object_name(dfC["Table Name"], dfC["Column Name"]) 167 dfC.rename(columns={"Column Cardinality": "Cardinality"}, inplace=True) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/_utils/_log.py:370, in mds_log..get_wrapper..log_decorator_wrapper(*args, **kwargs) 367 start_time = time.perf_counter() 369 try: --> 370 result = func(*args, **kwargs) 372 # The invocation for get_message_dict moves after the function 373 # so it can access the state after the method call 374 message.update(extractor.get_completion_message_dict(result, arg_dict)) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/fabric/_credentials.py:239, in with_credential..wrapped(*args, **kwargs) 237 credential = kwargs.pop("credential", None) 238 with set_default_credential(credential): --> 239 return func(*args, **kwargs) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/fabric/_flat_list_columns.py:141, in list_columns(dataset, table, extended, additional_xmla_properties, workspace, credential) 138 df.set_index(["Table Name", "Column Name"], inplace=True) 140 # table id/column id -> table name/column name --> 141 df_table_column = _fetch_table_column(dataset, workspace) 143 # Column cardinality 144 series_column_cardinality = _fetch_column_cardinality(df_table_column, dataset, workspace) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/fabric/_flat_list_columns.py:200, in _fetch_table_column(dataset, workspace) 179 df_col = evaluate_dax(dataset, 180 """ 181 SELECT (...) 187 """, 188 workspace=workspace) 190 df_table = evaluate_dax(dataset, 191 """ 192 SELECT (...) 197 """, 198 workspace=workspace) --> 200 df_table = df_table.merge(df_col, on="SemPyTableID") 202 # rename columns (strip SemPy prefix) 203 df_table = df_table.rename({'SemPyTableName': 'Table Name', 'SemPyColumnName': 'Column Name'}, axis='columns') File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/_metadata/_mdataframe.py:192, in MDataFrame.getattribute.._column_metadata_trimmer(*args, **kwargs) 191 def _column_metadata_trimmer(*args, **kwargs): --> 192 result = attr(*args, **kwargs) 193 self._trim_metadata_to_columns() 194 return result File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/pandas/core/frame.py:12884, in DataFrame.merge(self, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate) 12880 self._check_copy_deprecation(copy) 12882 from pandas.core.reshape.merge import merge > 12884 return merge( 12885 self, 12886 right, 12887 how=how, 12888 on=on, 12889 left_on=left_on, 12890 right_on=right_on, 12891 left_index=left_index, 12892 right_index=right_index, 12893 sort=sort, 12894 suffixes=suffixes, 12895 indicator=indicator, 12896 validate=validate, 12897 ) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/pandas/core/reshape/merge.py:399, in merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate) 384 else: 385 op = _MergeOperation( 386 left_df, 387 right_df, (...) 397 validate=validate, 398 ) --> 399 return op.get_result() File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/pandas/core/reshape/merge.py:1152, in _MergeOperation.get_result(self) 1148 self._maybe_add_join_keys(result, left_indexer, right_indexer) 1150 self._maybe_restore_index_levels(result) -> 1152 return result.finalize( 1153 types.SimpleNamespace( 1154 input_objs=[self.left, self.right], left=self.left, right=self.right 1155 ), 1156 method="merge", 1157 ) File /nfs4/pyenv-ce1590f5-38ce-4f61-b288-a1408b84ab78/lib/python3.11/site-packages/sempy/_metadata/_mdataframe.py:66, in MDataFrame.finalize(self, other, method, **kwargs) 63 # pandas implements a large number of methods with "merge" and "concat" and slicing. 64 # The physical implementation can be verified by placing a debugger breakpoint here. 65 if method == "merge": ---> 66 column_metadata = _merge_metadata(other.left, other.right, other.suffixes) 67 elif method == "concat": 68 column_metadata = _concat_metadata(other.objs, self._headers) AttributeError: 'types.SimpleNamespace' object has no attribute 'suffixes'