def validate_metric_file()

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)}'
            )