Source code for thoth.lab.inspection_report

# thoth-lab
# Copyright(C) 2019, 2020 Francesco Murdaca
#
# This program is free software: you can redistribute it and / or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

"""Inspection report generation and visualization."""

import logging
import pandas as pd
from IPython.core.display import HTML


logger = logging.getLogger("thoth.lab.inspection_report")

_INSPECTION_REPORT_FEATURES = {
    "hardware": ["platform", "processor", "ncpus"],
    "software_stack": ["requirements_locked"],
    "base_image": ["base_image"],
    "pi": ["script"],
    "exit_codes": ["exit_code"],
}

_INSPECTION_JSON_DF_KEYS_FEATURES_MAPPING = {
    "platform": ["hwinfo__platform"],
    "processor": ["cpu_type__is", "cpu_type__has"],
    "ncpus": ["hwinfo__cpu_type__ncpus"],
    "requirements_locked": ["requirements_locked__default", "requirements_locked___meta"],
    "base_image": ["os_release__name", "os_release__version"],
    "script": ["script", "script_sha256", "stdout__component", "@parameters"],
    "exit_code": ["exit_code"],
}


[docs]def multi_table(table_dict): """Accept a list of IpyTable objects and return a table which contains each IpyTable in a cell.""" return HTML( '<table><br style="background-color:white;">' + "".join(["<br>" + table._repr_html_() + "</br>" for table in table_dict.values()]) + "</br></table>" )
[docs]def create_df_report(df: pd.DataFrame) -> pd.DataFrame: """Show unique values for each column in the dataframe.""" dataframe_report = {} for c_name in df.columns.values: try: unique_values = df[c_name].unique() dataframe_report[c_name] = [unique_values] except Exception as exc: logger.info(exc) dataframe_report[c_name] = [df[c_name].values] pass df_unique = pd.DataFrame(dataframe_report) return df_unique
[docs]def create_dfs_inspection_classes(inspection_df: pd.DataFrame) -> dict: """Create all inspection dataframes per class with unique values and complete values.""" class_inspection_dfs = {} class_inspection_dfs_unique = {} for class_inspection, class_features in _INSPECTION_REPORT_FEATURES.items(): class_inspection_dfs[class_inspection] = {} class_inspection_dfs_unique[class_inspection] = {} if len(class_features) > 1: for feature in class_features: if len(feature) > 1: class_df = inspection_df[ [ col for col in inspection_df.columns.values if any(c in col for c in _INSPECTION_JSON_DF_KEYS_FEATURES_MAPPING[feature]) ] ] class_inspection_dfs[class_inspection][feature] = class_df class_df_unique = create_df_report(class_df) class_inspection_dfs_unique[class_inspection][feature] = class_df_unique else: class_df = inspection_df[ [ col for col in inspection_df.columns.values if _INSPECTION_JSON_DF_KEYS_FEATURES_MAPPING[feature] in col ] ] class_inspection_dfs[class_inspection][feature] = class_df class_df_unique = create_df_report(class_df) class_inspection_dfs_unique[class_inspection][feature] = class_df_unique elif len(_INSPECTION_JSON_DF_KEYS_FEATURES_MAPPING[class_features[0]]) > 1: class_df = inspection_df[ [ col for col in inspection_df.columns.values if any(c in col for c in _INSPECTION_JSON_DF_KEYS_FEATURES_MAPPING[class_features[0]]) ] ] class_inspection_dfs[class_inspection] = class_df class_df_unique = create_df_report(class_df) class_inspection_dfs_unique[class_inspection] = class_df_unique else: class_df = inspection_df[ [ col for col in inspection_df.columns.values if _INSPECTION_JSON_DF_KEYS_FEATURES_MAPPING[class_features[0]][0] in col ] ] class_inspection_dfs[class_inspection] = class_df class_df_unique = create_df_report(class_df) class_inspection_dfs_unique[class_inspection] = class_df_unique return class_inspection_dfs, class_inspection_dfs_unique