From 9291b53f93582eaf526c3d6fc919c6719f31242a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20F=C3=B6rster?= Date: Wed, 20 Nov 2024 14:57:47 +0100 Subject: [PATCH] added test cases --- lang_main_config.toml | 3 + src/lang_main/analysis/shared.py | 2 - src/lang_main/analysis/timeline.py | 9 +- src/lang_main/constants.py | 3 + src/lang_main/lang_main_config.toml | 1 + src/lang_main/pipelines/predefined.py | 2 + .../preprocess_pre_cleaned.pkl | Bin 0 -> 68485 bytes .../preprocess_pre_cleaned.xlsx | Bin 0 -> 67344 bytes .../timeline_01_act_per_objid.pkl | Bin 0 -> 617 bytes .../timeline_01_act_per_objid.xlsx | Bin 0 -> 4946 bytes .../timeline_01_df_filtered.pkl | Bin 0 -> 1554 bytes .../timeline_01_df_filtered.xlsx | Bin 0 -> 5360 bytes .../timeline_01_timeline_cands_dict.pkl | Bin 0 -> 145 bytes tests/analysis/test_preprocessing.py | 1 + tests/analysis/test_timeline.py | 316 ++++++++++++++++++ tests/conftest.py | 9 +- 16 files changed, 340 insertions(+), 6 deletions(-) create mode 100644 tests/_comparison_results/preprocess_pre_cleaned.pkl create mode 100644 tests/_comparison_results/preprocess_pre_cleaned.xlsx create mode 100644 tests/_comparison_results/timeline_01_act_per_objid.pkl create mode 100644 tests/_comparison_results/timeline_01_act_per_objid.xlsx create mode 100644 tests/_comparison_results/timeline_01_df_filtered.pkl create mode 100644 tests/_comparison_results/timeline_01_df_filtered.xlsx create mode 100644 tests/_comparison_results/timeline_01_timeline_cands_dict.pkl create mode 100644 tests/analysis/test_timeline.py diff --git a/lang_main_config.toml b/lang_main_config.toml index b83bb12..c3d3e6e 100644 --- a/lang_main_config.toml +++ b/lang_main_config.toml @@ -1,4 +1,6 @@ # lang_main: Config file +[info] +pkg = 'lang_main' [paths] inputs = './inputs/' @@ -40,6 +42,7 @@ threshold_edge_number = 330 threshold_unique_texts = 4 criterion_feature = 'HObjektText' feature_name_obj_id = 'ObjektID' +feature_name_obj_text = 'HObjektText' [time_analysis.preparation] name_delta_feat_to_repair = 'Zeitspanne bis zur Behebung [Tage]' diff --git a/src/lang_main/analysis/shared.py b/src/lang_main/analysis/shared.py index 80579a9..a90df48 100644 --- a/src/lang_main/analysis/shared.py +++ b/src/lang_main/analysis/shared.py @@ -112,8 +112,6 @@ def candidates_by_index( ) # cosine similarity cos_sim = cast(npt.NDArray, model.similarity(embds, embds).numpy()) - # TODO check removal - # cos_sim = cast(npt.NDArray, sentence_transformers.util.cos_sim(embds, embds).numpy()) np.fill_diagonal(cos_sim, 0.0) cos_sim = np.triu(cos_sim) cos_sim_idx = np.argwhere(cos_sim >= cos_sim_threshold) diff --git a/src/lang_main/analysis/timeline.py b/src/lang_main/analysis/timeline.py index 9339a7d..d5f582d 100644 --- a/src/lang_main/analysis/timeline.py +++ b/src/lang_main/analysis/timeline.py @@ -142,7 +142,7 @@ def filter_activities_per_obj_id( threshold_num_activities: int = 1, ) -> tuple[DataFrame, Series]: data = data.copy() - # filter only relevant activities count occurrences for each ObjectID + # filter only relevant activities, count occurrences for each ObjectID logger.info('Filtering activities per ObjectID...') filt_rel_activities = data[activity_feature].isin(relevant_activity_types) data_filter_activities = data.loc[filt_rel_activities].copy() @@ -249,6 +249,7 @@ def _transform_timeline_candidates( def _map_obj_id_to_texts( data: DataFrame, feature_obj_id: str = 'ObjektID', + feature_obj_text: str = 'HObjektText', ) -> dict[ObjectID, str]: data = data.copy() obj_ids = cast(Iterable[ObjectID], data[feature_obj_id].unique()) @@ -256,9 +257,9 @@ def _map_obj_id_to_texts( obj_id_to_text: dict[ObjectID, str] = {} for obj_id in tqdm(obj_ids): - data_per_obj = cast(DataFrame, data.loc[data['ObjektID'] == obj_id]) + data_per_obj = cast(DataFrame, data.loc[data[feature_obj_id] == obj_id]) # just take first entry - obj_text = cast(str, data_per_obj['HObjektText'].dropna().iat[0]) + obj_text = cast(str, data_per_obj[feature_obj_text].dropna().iat[0]) obj_text = obj_text.strip(r' ,.:') obj_id_to_text[obj_id] = obj_text @@ -272,6 +273,7 @@ def get_timeline_candidates( model: SentenceTransformer, cos_sim_threshold: float, feature_obj_id: str = 'ObjektID', + feature_obj_text: str = 'HObjektText', model_input_feature: str = 'nlp_model_input', ) -> tuple[TimelineCandidates, dict[ObjectID, str]]: logger.info('Obtaining timeline candidates...') @@ -290,6 +292,7 @@ def get_timeline_candidates( map_obj_text = _map_obj_id_to_texts( data=data, feature_obj_id=feature_obj_id, + feature_obj_text=feature_obj_text, ) logger.info('ObjectIDs successfully mapped to text descriptors.') diff --git a/src/lang_main/constants.py b/src/lang_main/constants.py index 7b7f50c..1f604a8 100644 --- a/src/lang_main/constants.py +++ b/src/lang_main/constants.py @@ -145,6 +145,9 @@ UNIQUE_CRITERION_FEATURE: Final[str] = CONFIG['time_analysis']['uniqueness'][ 'criterion_feature' ] FEATURE_NAME_OBJ_ID: Final[str] = CONFIG['time_analysis']['uniqueness']['feature_name_obj_id'] +FEATURE_NAME_OBJ_TEXT: Final[str] = CONFIG['time_analysis']['uniqueness'][ + 'feature_name_obj_text' +] # ** time_analysis.preparation # NAME_DELTA_FEAT_TO_REPAIR: Final[str] = 'delta_to_repair' CONFIG['time_analysis']['preparation']['name_delta_feat_to_repair'] diff --git a/src/lang_main/lang_main_config.toml b/src/lang_main/lang_main_config.toml index 521c6a0..c3d3e6e 100644 --- a/src/lang_main/lang_main_config.toml +++ b/src/lang_main/lang_main_config.toml @@ -42,6 +42,7 @@ threshold_edge_number = 330 threshold_unique_texts = 4 criterion_feature = 'HObjektText' feature_name_obj_id = 'ObjektID' +feature_name_obj_text = 'HObjektText' [time_analysis.preparation] name_delta_feat_to_repair = 'Zeitspanne bis zur Behebung [Tage]' diff --git a/src/lang_main/pipelines/predefined.py b/src/lang_main/pipelines/predefined.py index 22bb04d..48337cc 100644 --- a/src/lang_main/pipelines/predefined.py +++ b/src/lang_main/pipelines/predefined.py @@ -29,6 +29,7 @@ from lang_main.constants import ( CYTO_BASE_NETWORK_NAME, DATE_COLS, FEATURE_NAME_OBJ_ID, + FEATURE_NAME_OBJ_TEXT, MODEL_INPUT_FEATURES, NAME_DELTA_FEAT_TO_REPAIR, SAVE_PATH_FOLDER, @@ -287,6 +288,7 @@ def build_timeline_pipe() -> Pipeline: 'model': STFR_MODEL, 'cos_sim_threshold': THRESHOLD_TIMELINE_SIMILARITY, 'feature_obj_id': FEATURE_NAME_OBJ_ID, + 'feature_obj_text': FEATURE_NAME_OBJ_TEXT, 'model_input_feature': 'nlp_model_input', }, save_result=True, diff --git a/tests/_comparison_results/preprocess_pre_cleaned.pkl b/tests/_comparison_results/preprocess_pre_cleaned.pkl new file mode 100644 index 0000000000000000000000000000000000000000..5d8f8efe34f648dc630bff5a48e6bc3934547bdb GIT binary patch literal 68485 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 literal 0 HcmV?d00001 diff --git a/tests/_comparison_results/timeline_01_act_per_objid.pkl b/tests/_comparison_results/timeline_01_act_per_objid.pkl new file mode 100644 index 0000000000000000000000000000000000000000..260d0199699f0ec36397f2ad5e306a6ef54ff9ca GIT binary patch literal 617 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 literal 0 HcmV?d00001 diff --git a/tests/_comparison_results/timeline_01_df_filtered.xlsx b/tests/_comparison_results/timeline_01_df_filtered.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..82912b75cc58875c2b30a91703e1e8a0d4f402b0 GIT binary patch literal 5360 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 R;B@9-K^AJ8(mJJB4*)geH244j literal 0 HcmV?d00001 diff --git a/tests/analysis/test_preprocessing.py b/tests/analysis/test_preprocessing.py index bc87f15..c52754d 100644 --- a/tests/analysis/test_preprocessing.py +++ b/tests/analysis/test_preprocessing.py @@ -3,6 +3,7 @@ executed in in a pipeline """ from pathlib import Path + from lang_main import model_loader from lang_main.analysis import preprocessing as ppc from lang_main.analysis import shared diff --git a/tests/analysis/test_timeline.py b/tests/analysis/test_timeline.py new file mode 100644 index 0000000..374b882 --- /dev/null +++ b/tests/analysis/test_timeline.py @@ -0,0 +1,316 @@ +from pathlib import Path +from typing import cast + +import numpy as np +import pandas as pd +import pytest + +from lang_main import io, model_loader +from lang_main.analysis import timeline as tl +from lang_main.types import STFRModelTypes, TimelineCandidates + + +@pytest.fixture(scope='module') +def data_timeline_filter_activities() -> pd.DataFrame: + pth_data = Path('./tests/_comparison_results/timeline_01_df_filtered.pkl') + return pd.read_pickle(pth_data) + + +@pytest.fixture(scope='module') +def data_timeline_number_activities() -> pd.Series: + pth_data = Path('./tests/_comparison_results/timeline_01_act_per_objid.pkl') + return pd.read_pickle(pth_data) + + +@pytest.fixture(scope='module') +def STFR_model(): + model = model_loader.load_sentence_transformer( + model_name=STFRModelTypes.ALL_MINI_LM_L6_V2, + ) + return model + + +@pytest.fixture(scope='module') +def data_timeline_cands_dict() -> TimelineCandidates: + pth_data = './tests/_comparison_results/timeline_01_timeline_cands_dict.pkl' + tl_cands = cast(TimelineCandidates, io.load_pickle(pth_data)) + return tl_cands + + +def test_cleanup_descriptions(data_pre_cleaned): + data = data_pre_cleaned.copy() + data.at[0, 'VorgangsBeschreibung'] = np.nan + data.at[3, 'VorgangsBeschreibung'] = np.nan + data.at[5, 'ErledigungsBeschreibung'] = np.nan + properties = ('VorgangsBeschreibung', 'ErledigungsBeschreibung') + (data_proc,) = tl.cleanup_descriptions(data, properties=properties) + assert data_proc.at[0, 'VorgangsBeschreibung'] == 'N.V.' + assert data_proc.at[3, 'VorgangsBeschreibung'] == 'N.V.' + assert data_proc.at[5, 'ErledigungsBeschreibung'] == 'N.V.' + + +@pytest.mark.parametrize('convert_to_days', [True, False]) +def test_calc_delta_to_repair(data_pre_cleaned, convert_to_days): + feat_start = 'ErstellungsDatum' + feat_end = 'ErledigungsDatum' + name_delta_feature = 'Test' + (data,) = tl.calc_delta_to_repair( + data_pre_cleaned, + date_feature_start=feat_start, + date_feature_end=feat_end, + name_delta_feature=name_delta_feature, + convert_to_days=convert_to_days, + ) + assert name_delta_feature in data.columns + test_date = data_pre_cleaned.at[0, feat_end] - data_pre_cleaned.at[0, feat_start] + if convert_to_days: + assert test_date.days == data.at[0, name_delta_feature] + else: + assert test_date == data.at[0, name_delta_feature] + + +def test_non_relevant_obj_ids(data_pre_cleaned): + feature_uniqueness = 'HObjektText' + feature_obj_id = 'ObjektID' + threshold = 1 + data = data_pre_cleaned.copy() + data.at[0, feature_obj_id] = 1 + ids_to_ignore = tl._non_relevant_obj_ids( + data, + thresh_unique_feat_per_id=threshold, + feature_uniqueness=feature_uniqueness, + feature_obj_id=feature_obj_id, + ) + assert len(ids_to_ignore) == 1 + assert ids_to_ignore == (1,) + + +def test_remove_non_relevant_obj_ids(data_pre_cleaned): + feature_uniqueness = 'HObjektText' + feature_obj_id = 'ObjektID' + threshold = 1 + data = data_pre_cleaned.copy() + data.at[0, feature_obj_id] = 1 + + (data_proc,) = tl.remove_non_relevant_obj_ids( + data, + thresh_unique_feat_per_id=threshold, + feature_uniqueness=feature_uniqueness, + feature_obj_id=feature_obj_id, + ) + unique_obj_ids = data_proc[feature_obj_id].unique() + assert 1 not in unique_obj_ids + assert len(unique_obj_ids) == 2 + + +def test_generate_model_input(data_pre_cleaned): + target_feature_name = 'nlp_model_input' + model_input_features = ( + 'VorgangsTypName', + 'VorgangsBeschreibung', + ) + data = data_pre_cleaned.copy() + (data_proc,) = tl.generate_model_input( + data, + target_feature_name=target_feature_name, + model_input_features=model_input_features, + ) + feat1 = data.at[0, model_input_features[0]] + feat2 = data.at[0, model_input_features[1]] + test_result = f'{feat1} - {feat2}' + assert data_proc.at[0, target_feature_name] == test_result + + +def test_filter_activities_per_obj_id(data_pre_cleaned): + activity_feature = 'VorgangsTypName' + relevant_activity_types = ('Störungsmeldung',) + feature_obj_id = 'ObjektID' + threshold_num_activities = 1 # at least 2 occurrences per ObjID + + data = data_pre_cleaned.copy() + data = data.iloc[:5] + + df_filtered, act_per_obj_id = tl.filter_activities_per_obj_id( + data, + activity_feature=activity_feature, + relevant_activity_types=relevant_activity_types, + feature_obj_id=feature_obj_id, + threshold_num_activities=threshold_num_activities, + ) + assert len(df_filtered) == 2 + assert df_filtered.iat[0, 1] == act_per_obj_id.index[0] + assert act_per_obj_id.iat[0] == 2 + + +def test_get_timeline_candidates_index( + data_timeline_filter_activities, + data_timeline_number_activities, + STFR_model, +): + data = data_timeline_filter_activities.copy() + target_feature_name = 'nlp_model_input' + model_input_features = ('VorgangsBeschreibung',) + (data,) = tl.generate_model_input( + data, + target_feature_name=target_feature_name, + model_input_features=model_input_features, + ) + data_num_act = data_timeline_number_activities.copy() + cos_sim_threshold = 0.8 + tl_cands_iter = tl._get_timeline_candidates_index( + data=data, + num_activities_per_obj_id=data_num_act, + model=STFR_model, + cos_sim_threshold=cos_sim_threshold, + feature_obj_id='ObjektID', + model_input_feature=target_feature_name, + ) + tl_cands_idx = tuple(tl_cands_iter) # format tuple((ObjID, (Idx1, Idx2))) + assert len(tl_cands_idx) == 0 + + cos_sim_threshold = 0.0 + tl_cands_iter = tl._get_timeline_candidates_index( + data=data, + num_activities_per_obj_id=data_num_act, + model=STFR_model, + cos_sim_threshold=cos_sim_threshold, + feature_obj_id='ObjektID', + model_input_feature=target_feature_name, + ) + tl_cands_idx = tuple(tl_cands_iter) + assert len(tl_cands_idx) == 1 + assert tl_cands_idx == ((3, (np.int64(3), np.int64(4))),) + + +def test_transform_timeline_candidates( + data_timeline_filter_activities, + data_timeline_number_activities, + STFR_model, +): + data = data_timeline_filter_activities.copy() + target_feature_name = 'nlp_model_input' + model_input_features = ('VorgangsBeschreibung',) + (data,) = tl.generate_model_input( + data, + target_feature_name=target_feature_name, + model_input_features=model_input_features, + ) + data_num_act = data_timeline_number_activities.copy() + cos_sim_threshold = 0.0 + tl_cands_iter = tl._get_timeline_candidates_index( + data=data, + num_activities_per_obj_id=data_num_act, + model=STFR_model, + cos_sim_threshold=cos_sim_threshold, + feature_obj_id='ObjektID', + model_input_feature=target_feature_name, + ) + tl_cands_dict = tl._transform_timeline_candidates(tl_cands_iter) + + assert 3 in tl_cands_dict + assert tl_cands_dict[3] == ((np.int64(3), np.int64(4)),) + + +def test_map_obj_id_to_texts(data_pre_cleaned): + data = data_pre_cleaned.iloc[:5].copy() + feature_obj_id = 'ObjektID' + feature_obj_text = 'HObjektText' + map_text = tl._map_obj_id_to_texts( + data=data, + feature_obj_id=feature_obj_id, + feature_obj_text=feature_obj_text, + ) + assert len(map_text) == 3 # three unique IDs + assert map_text[1] == 'Fräsmaschine-FS435X' + assert map_text[2] == 'Schleifmaschine-S4x87' + assert map_text[3] == 'Bohrbearbeitungszentrum-BBZ35' + + +def test_get_timeline_candidates( + data_timeline_filter_activities, + data_timeline_number_activities, + STFR_model, +): + data = data_timeline_filter_activities.copy() + target_feature_name = 'nlp_model_input' + model_input_features = ('VorgangsBeschreibung',) + (data,) = tl.generate_model_input( + data, + target_feature_name=target_feature_name, + model_input_features=model_input_features, + ) + data_num_act = data_timeline_number_activities.copy() + cos_sim_threshold = 0.0 + tl_cands_dict, map_text = tl.get_timeline_candidates( + data=data, + num_activities_per_obj_id=data_num_act, + model=STFR_model, + cos_sim_threshold=cos_sim_threshold, + feature_obj_id='ObjektID', + feature_obj_text='HObjektText', + model_input_feature=target_feature_name, + ) + assert 3 in tl_cands_dict + assert tl_cands_dict[3] == ((np.int64(3), np.int64(4)),) + assert len(map_text) == 1 # three unique IDs + assert map_text[3] == 'Bohrbearbeitungszentrum-BBZ35' + + +def test_filter_timeline_cands(data_pre_cleaned, data_timeline_cands_dict): + obj_id = 3 + entry_idx = 0 + sort_feature = 'ErstellungsDatum' + data_proc = tl.filter_timeline_cands( + data_pre_cleaned, + data_timeline_cands_dict, + obj_id=obj_id, + entry_idx=entry_idx, + sort_feature=sort_feature, + ) + assert 3 in data_proc.index + assert 4 in data_proc.index + assert data_proc.at[3, 'ObjektID'] == 3 + assert data_proc.at[4, 'ObjektID'] == 3 + assert data_proc.at[3, 'VorgangsTypName'] == 'Störungsmeldung' + assert data_proc.at[4, 'VorgangsTypName'] == 'Störungsmeldung' + assert ( + data_proc.at[3, 'ErledigungsBeschreibung'] + == 'Beseitigung der Blockierung und Überprüfung des Antriebs' + ) + assert ( + data_proc.at[4, 'ErledigungsBeschreibung'] + == 'Reinigung der Leitungen und Austausch des Kühlmittels' + ) + + +@pytest.mark.parametrize('convert_to_days', [True, False]) +def test_calc_delta_to_next_failure( + data_pre_cleaned, + data_timeline_cands_dict, + convert_to_days, +): + obj_id = 3 + entry_idx = 0 + sort_feature = 'ErstellungsDatum' + data_tl_filtered = tl.filter_timeline_cands( + data_pre_cleaned, + data_timeline_cands_dict, + obj_id=obj_id, + entry_idx=entry_idx, + sort_feature=sort_feature, + ) + name_delta_feature = 'test_delta' + data_proc = tl.calc_delta_to_next_failure( + data_tl_filtered, + date_feature=sort_feature, + name_delta_feature=name_delta_feature, + convert_to_days=convert_to_days, + ) + test_date = data_proc.at[4, sort_feature] - data_pre_cleaned.at[3, sort_feature] + test_date_last = pd.Timedelta(0) + if convert_to_days: + assert test_date.days == data_proc.at[3, name_delta_feature] + assert test_date_last.days == data_proc.at[4, name_delta_feature] + else: + assert test_date == data_proc.at[3, name_delta_feature] + assert test_date_last == data_proc.at[4, name_delta_feature] diff --git a/tests/conftest.py b/tests/conftest.py index c2f44e6..1d2fce3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,9 +1,10 @@ from pathlib import Path -from lang_main.analysis import graphs import pandas as pd import pytest +from lang_main.analysis import graphs + DATE_COLS: tuple[str, ...] = ( 'VorgangsDatum', 'ErledigungsDatum', @@ -25,6 +26,12 @@ def raw_data_date_cols(): return DATE_COLS +@pytest.fixture(scope='session') +def data_pre_cleaned() -> pd.DataFrame: + pth_data = Path('./tests/_comparison_results/preprocess_pre_cleaned.pkl') + return pd.read_pickle(pth_data) + + @pytest.fixture(scope='session') def data_analyse_feature() -> pd.DataFrame: pth_data = Path('./tests/_comparison_results/analyse_feature.pkl')