in docker/services/metrics_service.py [0:0]
def validate_metric_file(self, algorithm: Algorithm, metric_file_path):
try:
df = self.read_metrics(metric_file_path=metric_file_path,
algorithm=algorithm, parse_index=False)
except Exception as e:
_LOG.warning(f'Metric file can not be read: Exception: {e}')
raise ExecutorException(
step_name=JOB_STEP_VALIDATE_METRICS,
reason=f'Metric file can not be read: Exception: {e}'
)
column_names = list(df.columns)
required_columns_set = set(list(algorithm.required_data_attributes))
file_columns_set = set(column_names)
missing_columns = list(required_columns_set - file_columns_set)
excess_columns = list(file_columns_set - required_columns_set)
if missing_columns or excess_columns:
_LOG.error(f'File \'{metric_file_path}\' does not match the '
f'required set of columns')
error_message = []
if missing_columns:
_LOG.error(f'Missing columns: \'{missing_columns}\'')
error_message.append(f'Missing columns: \'{missing_columns}\'')
if excess_columns:
_LOG.error(f'Excess columns: \'{excess_columns}\'')
if error_message:
raise ExecutorException(
step_name=JOB_STEP_VALIDATE_METRICS,
reason=';'.join(error_message)
)
absent_metric_attrs = []
metric_attrs = list(algorithm.metric_attributes)
for metric_attr in metric_attrs:
if (df[metric_attr] == -1).all():
absent_metric_attrs.append(metric_attr)
if set(absent_metric_attrs) == set(metric_attrs):
_LOG.warning(f'Metric file must contain data for at '
f'least one metric: {", ".join(metric_attrs)}')
raise ExecutorException(
step_name=JOB_STEP_INITIALIZE_ALGORITHM,
reason=f'Metric file must contain data for at '
f'least one metric: {", ".join(metric_attrs)}'
)