From f4043bc6a5af1443a6221186124849f945e103d9 Mon Sep 17 00:00:00 2001 From: Greg Elphick <11791585+elphick@users.noreply.github.com> Date: Tue, 14 May 2024 10:14:30 +0800 Subject: [PATCH] closes #149. Removed default loggers (#152) --- HISTORY.rst | 9 +++++++ elphick/mass_composition/mass_composition.py | 7 ++++- elphick/mass_composition/mc_status.py | 3 ++- elphick/mass_composition/network.py | 6 ++--- elphick/mass_composition/utils/loader.py | 27 +++++++++++++------- pyproject.toml | 2 +- 6 files changed, 39 insertions(+), 15 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 91dc597b..e722570c 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,3 +1,12 @@ +Mass_Composition 0.4.11 (2024-05-14) +==================================== + +Other Tasks +----------- + +- Removed default loggers. (#149) + + Mass_Composition 0.4.10 (2024-05-13) ==================================== diff --git a/elphick/mass_composition/mass_composition.py b/elphick/mass_composition/mass_composition.py index 583a2226..fbb01964 100644 --- a/elphick/mass_composition/mass_composition.py +++ b/elphick/mass_composition/mass_composition.py @@ -1012,12 +1012,17 @@ def __truediv__(self, other: 'MassComposition') -> 'MassComposition': return res + def __eq__(self, other): + if isinstance(other, MassComposition): + return self.__dict__ == other.__dict__ + return False + @staticmethod def _check_cols_in_data_cols(cols: List[str], cols_data: List[str]): for col in cols: if (col is not None) and (col not in cols_data): msg: str = f"{col} not in the data columns: {cols_data}" - logging.error(msg) + logging.getLogger(__name__).error(msg) raise IndexError(msg) @staticmethod diff --git a/elphick/mass_composition/mc_status.py b/elphick/mass_composition/mc_status.py index ef7c1020..6f68a324 100644 --- a/elphick/mass_composition/mc_status.py +++ b/elphick/mass_composition/mc_status.py @@ -6,6 +6,7 @@ class Status: def __init__(self, df_oor: pd.DataFrame): + self._logger = logging.getLogger(__name__) self.oor: pd.DataFrame = df_oor self.num_oor: int = len(df_oor) self.failing_components: List[str] = list(df_oor.dropna(axis=1).columns) if self.num_oor > 0 else None @@ -13,7 +14,7 @@ def __init__(self, df_oor: pd.DataFrame): @property def ok(self) -> bool: if self.num_oor > 0: - logging.warning(f'{self.num_oor} OOR records exist.') + self._logger.warning(f'{self.num_oor} OOR records exist.') return True if self.num_oor == 0 else False def __str__(self) -> str: diff --git a/elphick/mass_composition/network.py b/elphick/mass_composition/network.py index b5a751f6..b07b7daf 100644 --- a/elphick/mass_composition/network.py +++ b/elphick/mass_composition/network.py @@ -978,13 +978,13 @@ def _check_indexes(cls, streams): s: str = stream.name tmp_nans: pd.Series = stream_nans.query('stream==@s').sum(axis=1) if tmp_nans.iloc[0] > 0: - logging.debug(f'The {s} stream has missing coarse sizes') + logger.debug(f'The {s} stream has missing coarse sizes') first_zero_index = tmp_nans.loc[tmp_nans == 0].index[0] if tmp_nans[tmp_nans.index <= first_zero_index].sum() > 0: - logging.debug(f'The {s} stream has missing sizes requiring interpolation') + logger.debug(f'The {s} stream has missing sizes requiring interpolation') raise NotImplementedError('Coming soon - we need interpolation!') else: - logging.debug(f'The {s} stream has missing coarse sizes only') + logger.debug(f'The {s} stream has missing coarse sizes only') stream_df = df_streams_full.loc[:, (slice(None), s)].droplevel(-1, axis=1).fillna(0) # recreate the stream from the dataframe stream.set_data(stream_df) diff --git a/elphick/mass_composition/utils/loader.py b/elphick/mass_composition/utils/loader.py index e948f49f..f4901d2c 100644 --- a/elphick/mass_composition/utils/loader.py +++ b/elphick/mass_composition/utils/loader.py @@ -11,15 +11,23 @@ from elphick.mass_composition.utils.parallel import TqdmParallel from elphick.mass_composition.utils.pd_utils import column_prefix_counts, column_prefixes +logger = logging.getLogger(__name__) + def create_mass_composition(stream_data: Tuple[Union[int, str], pd.DataFrame], interval_edges: Optional[Union[Iterable, int]] = None) -> Tuple[ - Union[int, str], MassComposition]: + Union[int, str], MassComposition]: stream, data = stream_data - if interval_edges is not None: - return stream, MassComposition(data=data, name=stream).resample_1d(interval_edges=interval_edges) - else: - return stream, MassComposition(data=data, name=stream) + res = None + try: + if interval_edges is not None: + res = stream, MassComposition(data=data, name=stream).resample_1d(interval_edges=interval_edges) + else: + res = stream, MassComposition(data=data, name=stream) + except Exception as e: + logger.error(f"Error creating MassComposition object for {stream}: {e}") + + return res def streams_from_dataframe(df: pd.DataFrame, @@ -40,11 +48,10 @@ def streams_from_dataframe(df: pd.DataFrame, Returns: """ - logger: logging.Logger = logging.getLogger(__name__) - stream_data: Dict[str, pd.DataFrame] = {} index_names: List[str] = [] if mc_name_col: + logger.debug("Creating MassComposition objects by name column.") if mc_name_col in df.index.names: index_names = df.index.names df.reset_index(mc_name_col, inplace=True) @@ -58,6 +65,7 @@ def streams_from_dataframe(df: pd.DataFrame, df.reset_index(inplace=True) df.set_index(index_names, inplace=True) else: + logger.debug("Creating MassComposition objects by column prefixes.") # wide case - find prefixes where there are at least 3 columns prefix_counts = column_prefix_counts(df.columns) prefix_cols = column_prefixes(df.columns) @@ -69,6 +77,7 @@ def streams_from_dataframe(df: pd.DataFrame, columns={col: col.replace(f'{prefix}_', '') for col in df.columns}) if interval_edges is not None: + logger.debug("Resampling MassComposition objects to new interval edges.") # unify the edges - this will also interp missing grades if not isinstance(df.index, pd.IntervalIndex): raise NotImplementedError(f"The index `{df.index}` of the dataframe is not a pd.Interval. " @@ -82,8 +91,8 @@ def streams_from_dataframe(df: pd.DataFrame, indx = pd.IntervalIndex.from_arrays(left=all_edges[0:-1], right=all_edges[1:]) interval_edges = _upsample_grid_by_factor(indx=indx, factor=interval_edges) - with TqdmParallel(desc="Creating MassComposition objects", n_jobs=n_jobs, prefer="processes", - total=len(stream_data)) as p: + with TqdmParallel(desc="Creating MassComposition objects", n_jobs=n_jobs, + prefer=None, total=len(stream_data)) as p: res = p(delayed(create_mass_composition)(stream_data, interval_edges) for stream_data in stream_data.items()) res = dict(res) diff --git a/pyproject.toml b/pyproject.toml index de7a3945..941c0f40 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mass-composition" -version = "0.4.10" +version = "0.4.11" description = "For managing multi-dimensional mass-composition datasets, supporting weighted mathematical operations and visualisation." authors = ["Greg "] packages = [{ include = "elphick/mass_composition" }]