def _condition_logic(base_idx: pd.Index, sub_select_idx: pd.Index, state_idx: pd.Index, condition_idx: pd.Index, logic: str) -> pd.Index: if str(logic).upper() == 'ALL': return base_idx.intersection(condition_idx).sort_values() elif str(logic).upper() == 'ANY': return sub_select_idx.intersection(condition_idx).sort_values() elif str(logic).upper() == 'AND': return state_idx.intersection(condition_idx).sort_values() elif str(logic).upper() == 'NAND': return sub_select_idx.drop(state_idx.intersection(condition_idx)).sort_values() elif str(logic).upper() == 'OR': return state_idx.append(state_idx.union(condition_idx)).drop_duplicates().sort_values() elif str(logic).upper() == 'NOR': result = state_idx.append(state_idx.union(condition_idx)).drop_duplicates().sort_values() return sub_select_idx.drop(result) elif str(logic).upper() == 'NOT': return state_idx.difference(condition_idx) elif str(logic).upper() == 'XOR': return state_idx.union(condition_idx).difference(state_idx.intersection(condition_idx)) raise ValueError(f"The logic '{logic}' must be AND, NAND, OR, NOR, NOT, XOR ANY or ALL")