From a7ad3dbd4fe7e5b4b83244ae4ae5499b582dd30c Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Mon, 6 Apr 2026 18:12:45 +0100 Subject: [PATCH 01/16] add macOS files to the .gitignore file --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index ad42b86..8233709 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ __pycache__/ # Mac files .idea +.DS_Store # Distribution / packaging .Python @@ -50,6 +51,7 @@ nosetests.xml coverage.xml *.cover .hypothesis/ +notebooks/ # Translations *.mo From f579cb3af3f5bc4c66ba62244213e860de735531 Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Mon, 6 Apr 2026 18:37:40 +0100 Subject: [PATCH 02/16] change attribute force_all_finite to ensure_all_finite in check_array function to ensure compatibility with scikit-learn version 1.6 and later --- mbpls/mbpls.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/mbpls/mbpls.py b/mbpls/mbpls.py index b4dcd73..fdb891e 100644 --- a/mbpls/mbpls.py +++ b/mbpls/mbpls.py @@ -290,7 +290,7 @@ def fit(self, X, Y): self.method = 'NIPALS' global U_, T_, R_ - Y = check_array(Y, dtype=np.float64, ensure_2d=False, force_all_finite=not self.sparse_data, copy=self.copy) + Y = check_array(Y, dtype=np.float64, ensure_2d=False, ensure_all_finite=not self.sparse_data, copy=self.copy) if self.sparse_data is True: self.sparse_Y_info_ = {} self.sparse_Y_info_['Y'] = self.check_sparsity_level(Y) @@ -308,14 +308,14 @@ def fit(self, X, Y): # Check dimensions check_consistent_length(X[block], Y) X[block] = check_array(X[block], dtype=np.float64, copy=self.copy, - force_all_finite=not self.sparse_data) + ensure_all_finite=not self.sparse_data) if self.sparse_data is True: self.sparse_X_info_[block] = self.check_sparsity_level(X[block]) X[block] = self.x_scalers_[block].fit_transform(X[block]) else: self.x_scalers_.append(StandardScaler(with_mean=True, with_std=True)) # Check dimensions - X = check_array(X, dtype=np.float64, copy=self.copy, force_all_finite=not self.sparse_data) + X = check_array(X, dtype=np.float64, copy=self.copy, ensure_all_finite=not self.sparse_data) if self.sparse_data is True: self.sparse_X_info_ = {} self.sparse_X_info_[0] = self.check_sparsity_level(X) @@ -334,12 +334,12 @@ def fit(self, X, Y): # Check dimensions check_consistent_length(X[block], Y) X[block] = check_array(X[block], dtype=np.float64, copy=self.copy, - force_all_finite=not self.sparse_data) + ensure_all_finite=not self.sparse_data) if self.sparse_data is True: self.sparse_X_info_[block] = self.check_sparsity_level(X[block]) else: # Check dimensions - X = check_array(X, dtype=np.float64, copy=self.copy, force_all_finite=not self.sparse_data) + X = check_array(X, dtype=np.float64, copy=self.copy, ensure_all_finite=not self.sparse_data) if self.sparse_data is True: self.sparse_X_info_ = {} self.sparse_X_info_[0] = self.check_sparsity_level(X) @@ -1091,13 +1091,13 @@ def transform(self, X, Y=None, return_block_scores=False, copy=True): X = deepcopy(X) for block in range(len(X)): # Check dimensions - X[block] = check_array(X[block], dtype=np.float64, force_all_finite=not self.sparse_data, copy=copy) + X[block] = check_array(X[block], dtype=np.float64, ensure_all_finite=not self.sparse_data, copy=copy) if self.sparse_data: sparse_X_info_[block] = self.check_sparsity_level(X[block]) X[block] = self.x_scalers_[block].transform(X[block]) else: # Check dimensions - X = check_array(X, dtype=np.float64, force_all_finite=not self.sparse_data, copy=copy) + X = check_array(X, dtype=np.float64, ensure_all_finite=not self.sparse_data, copy=copy) if self.sparse_data: sparse_X_info_[0] = self.check_sparsity_level(X) X = [self.x_scalers_[0].transform(X)] @@ -1117,7 +1117,7 @@ def transform(self, X, Y=None, return_block_scores=False, copy=True): Ts_ = X_comp.dot(self.R_) if Y is not None: - Y = check_array(Y, dtype=np.float64, ensure_2d=False, force_all_finite=not self.sparse_data, copy=copy) + Y = check_array(Y, dtype=np.float64, ensure_2d=False, ensure_all_finite=not self.sparse_data, copy=copy) if self.sparse_data: sparse_Y_info_['Y'] = self.check_sparsity_level(Y) if Y.ndim == 1: @@ -1225,12 +1225,12 @@ def transform(self, X, Y=None, return_block_scores=False, copy=True): X = deepcopy(X) for block in range(len(X)): # Check dimensions - X[block] = check_array(X[block], dtype=np.float64, force_all_finite=not self.sparse_data, copy=copy) + X[block] = check_array(X[block], dtype=np.float64, ensure_all_finite=not self.sparse_data, copy=copy) if self.sparse_data: sparse_X_info_[block] = self.check_sparsity_level(X[block]) else: # Check dimensions - X = check_array(X, dtype=np.float64, force_all_finite=not self.sparse_data, copy=copy) + X = check_array(X, dtype=np.float64, ensure_all_finite=not self.sparse_data, copy=copy) if self.sparse_data: sparse_X_info_[0] = self.check_sparsity_level(X) X = [X] @@ -1250,7 +1250,7 @@ def transform(self, X, Y=None, return_block_scores=False, copy=True): Ts_ = X_comp.dot(self.R_) if Y is not None: - Y = check_array(Y, dtype=np.float64, ensure_2d=False, force_all_finite=not self.sparse_data, copy=copy) + Y = check_array(Y, dtype=np.float64, ensure_2d=False, ensure_all_finite=not self.sparse_data, copy=copy) if self.sparse_data: sparse_Y_info_['Y'] = self.check_sparsity_level(Y) if Y.ndim == 1: @@ -1365,10 +1365,10 @@ def predict(self, X, copy=True): X = deepcopy(X) for block in range(len(X)): # Check dimensions - X[block] = check_array(X[block], dtype=np.float64, force_all_finite=not self.sparse_data, copy=copy) + X[block] = check_array(X[block], dtype=np.float64, ensure_all_finite=not self.sparse_data, copy=copy) X[block] = self.x_scalers_[block].transform(X[block]) else: - X = check_array(X, dtype=np.float64, force_all_finite=not self.sparse_data, copy=copy) + X = check_array(X, dtype=np.float64, ensure_all_finite=not self.sparse_data, copy=copy) X = [self.x_scalers_[0].transform(X)] @@ -1390,9 +1390,9 @@ def predict(self, X, copy=True): X = deepcopy(X) for block in range(len(X)): # Check dimensions - X[block] = check_array(X[block], dtype=np.float64, force_all_finite=not self.sparse_data, copy=copy) + X[block] = check_array(X[block], dtype=np.float64, ensure_all_finite=not self.sparse_data, copy=copy) else: - X = check_array(X, dtype=np.float64, force_all_finite=not self.sparse_data, copy=copy) + X = check_array(X, dtype=np.float64, ensure_all_finite=not self.sparse_data, copy=copy) X = [X] X = np.hstack(X) if self.sparse_data: From e573eb83d9f2c00ec1e8e81391a76264a779d2e8 Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Mon, 6 Apr 2026 18:50:27 +0100 Subject: [PATCH 03/16] resolve syntax warning introduced in Python 3.8 when comparing two strings using `is not` instead of `!=`. `is not` compares object identity, not value. --- mbpls/mbpls.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mbpls/mbpls.py b/mbpls/mbpls.py index fdb891e..ea16e04 100644 --- a/mbpls/mbpls.py +++ b/mbpls/mbpls.py @@ -358,7 +358,7 @@ def fit(self, X, Y): self.W_ = [] self.W_non_normal_ = [] - if self.method is not 'SIMPLS': + if self.method != 'SIMPLS': self.A_ = np.empty((self.num_blocks_, 0)) self.A_corrected_ = np.empty((self.num_blocks_, 0)) self.T_ = [] @@ -372,7 +372,7 @@ def fit(self, X, Y): for block in range(self.num_blocks_): self.W_.append(np.empty((X[block].shape[1], 0))) self.W_non_normal_.append(np.empty((X[block].shape[1], 0))) - if self.method is not 'SIMPLS': + if self.method != 'SIMPLS': self.T_.append(np.empty((X[block].shape[0], 0))) # Concatenate X blocks @@ -1124,7 +1124,7 @@ def transform(self, X, Y=None, return_block_scores=False, copy=True): Y = Y.reshape(-1, 1) Y = self.y_scaler_.transform(Y) # Here the block scores are calculated iteratively for new blocks - if self.method is not 'SIMPLS': + if self.method != 'SIMPLS': T_ = [] for block in range(self.num_blocks_): T_.append(np.empty((X[block].shape[0], 0))) @@ -1182,7 +1182,7 @@ def transform(self, X, Y=None, return_block_scores=False, copy=True): U_ = Y.dot(self.V_) / np.linalg.norm(Y.dot(self.V_), axis=0) return Ts_, U_ else: - if self.method is not 'SIMPLS': + if self.method != 'SIMPLS': # Here the block scores are calculated iteratively for new blocks T_ = [] for block in range(self.num_blocks_): From 66b4cfc0eceb7e2361d69b3aaed8069c1ef8ecca Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Mon, 6 Apr 2026 18:55:51 +0100 Subject: [PATCH 04/16] fix sklearn compatibility: reshape 1D array in plot method StandardScaler.inverse_transform now requires 2D input in newer versions of scikit-learn. Reshape the loadings slice to 2D before inverse transforming and flatten the result. --- mbpls/mbpls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mbpls/mbpls.py b/mbpls/mbpls.py index ea16e04..eba11cf 100644 --- a/mbpls/mbpls.py +++ b/mbpls/mbpls.py @@ -1493,7 +1493,7 @@ def plot(self, num_components=2): for block in range(self.num_blocks_): # Inverse transforming weights/loadings if self.standardize: - P_inv_trans.append(self.x_scalers_[block].inverse_transform(self.P_[block][:, comp])) + P_inv_trans.append(self.x_scalers_[block].inverse_transform(self.P_[block][:, comp].reshape(1, -1)).flatten()) else: P_inv_trans.append(self.P_[block][:, comp]) From 157726156af224ab32e482d6637c97bdb618c86b Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Mon, 6 Apr 2026 19:09:50 +0100 Subject: [PATCH 05/16] add to .gitignore .claude/ config files used for diagnostics --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 8233709..56c6c12 100644 --- a/.gitignore +++ b/.gitignore @@ -112,3 +112,6 @@ venv.bak/ # Temporary install .unipls.egg-info + +# Claude config files +.claude/ \ No newline at end of file From 87168c52c31f02846497f189514438a245d6dcc4 Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Sat, 18 Apr 2026 21:46:27 +0100 Subject: [PATCH 06/16] update dependecy minimal requirements to match with modern versions of python --- requirements.txt | 8 ++++---- setup.py | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/requirements.txt b/requirements.txt index 4df1cd2..9264c70 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -numpy>=1.13.3 -scipy>=1.0.0 -scikit-learn>=0.20.0 -pandas>=0.20.0 \ No newline at end of file +numpy>=1.19.5 +scipy>=1.6.0 +scikit-learn>=1.6.0 +pandas>=2.0.0 diff --git a/setup.py b/setup.py index 605396f..4200d83 100644 --- a/setup.py +++ b/setup.py @@ -20,10 +20,10 @@ LICENSE = 'new BSD' # This is the lowest tested version. Below might work as well -NUMPY_MIN_VERSION = '1.13.3' -SCIPY_MIN_VERSION = '1.0.0' -SCIKIT_LEARN_MIN_VERSION = '0.22.1' -PANDAS_MIN_VERSION = '0.20.0' +NUMPY_MIN_VERSION = '1.19.5' +SCIPY_MIN_VERSION = '1.6.0' +SCIKIT_LEARN_MIN_VERSION = '1.6.0' +PANDAS_MIN_VERSION = '2.0.0' def setup_package(): with open('README.rst') as f: @@ -50,9 +50,12 @@ def setup_package(): 'Operating System :: POSIX', 'Operating System :: Unix', 'Operating System :: MacOS', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', + 'Programming Language :: Python :: 3.13', + 'Programming Language :: Python :: 3.14', # 'Development Status :: 4 - Beta', 'Development Status :: 5 - Production/Stable' ], @@ -75,7 +78,7 @@ def setup_package(): 'matplotlib', ], }, - python_requires='>=3.5', + python_requires='>=3.9', ) if __name__ == '__main__': From 466806537b7fb3883f78d8b4b58bca333e385327 Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Sat, 18 Apr 2026 22:19:38 +0100 Subject: [PATCH 07/16] add matplotlib as a dependency uptil this point, matplotlib was an extra, but the example code requires it, therefore, it was changed to requirements --- requirements.txt | 1 + setup.py | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 9264c70..6b47760 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ numpy>=1.19.5 scipy>=1.6.0 scikit-learn>=1.6.0 pandas>=2.0.0 +matplotlib>=3.0.0 diff --git a/setup.py b/setup.py index 4200d83..ce1dd49 100644 --- a/setup.py +++ b/setup.py @@ -24,6 +24,7 @@ SCIPY_MIN_VERSION = '1.6.0' SCIKIT_LEARN_MIN_VERSION = '1.6.0' PANDAS_MIN_VERSION = '2.0.0' +MATPLOTLIB_MIN_VERSION = '3.0.0' def setup_package(): with open('README.rst') as f: @@ -63,7 +64,8 @@ def setup_package(): 'numpy>={0}'.format(NUMPY_MIN_VERSION), 'scipy>={0}'.format(SCIPY_MIN_VERSION), 'scikit-learn>={0}'.format(SCIKIT_LEARN_MIN_VERSION), - 'pandas>={0}'.format(PANDAS_MIN_VERSION) + 'pandas>={0}'.format(PANDAS_MIN_VERSION), + 'matplotlib>={0}'.format(MATPLOTLIB_MIN_VERSION) ], extras_require={ 'tests': [ @@ -73,9 +75,6 @@ def setup_package(): 'sphinx_rtd_theme', 'nbsphinx', 'nbsphinx_link' - ], - 'extras': [ - 'matplotlib', ], }, python_requires='>=3.9', From d58b0c7ad78cf7f24418edd76c5d60cb04a94066 Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Sun, 19 Apr 2026 16:21:19 +0100 Subject: [PATCH 08/16] update licence and readme for new maintaned version --- LICENSE.txt | 1 + README.rst | 24 +++++++++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 4e57206..b561f4b 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,6 +1,7 @@ BSD 3-Clause License Copyright (c) 2018, Andreas Baum and Laurent Vermue +Copyright (c) 2026, Lukas Kopecky, Imperial College London All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.rst b/README.rst index efa82d9..e7304ca 100644 --- a/README.rst +++ b/README.rst @@ -1,12 +1,7 @@ Multiblock Partial Least Squares Package ======================================== -.. image:: https://img.shields.io/pypi/v/mbpls.svg - :target: https://pypi.python.org/pypi/mbpls - :alt: Pypi Version -.. image:: https://travis-ci.com/DTUComputeStatisticsAndDataAnalysis/MBPLS.svg?branch=master - :target: https://travis-ci.com/DTUComputeStatisticsAndDataAnalysis/MBPLS - :alt: Build Status + .. image:: https://img.shields.io/pypi/l/mbpls.svg :target: https://pypi.python.org/pypi/mbpls/ :alt: License @@ -17,6 +12,21 @@ Multiblock Partial Least Squares Package :target: https://doi.org/10.21105/joss.01190 :alt: JOSS Paper DOI + .. note:: + + This is a newly maintained version of the package, based on the original + MBPLS software originally developed by Andreas Baum and Laurent Vermue + (homepabe: https://github.com/DTUComputeStatisticsAndDataAnalysis/MBPLS/). + + This maintained version has been updated to be compatible with Python 3.8 and later, and modern + version of the dependencies. The original version of the package is no longer maintained, + and users are encouraged to use this updated version for their work. + + To cite this package, plase use the original publication by Baum et al. (2019) as described below + or refer to the GitHub repository for the most recent updates and contributions. + + Lukas Kopecky (l.kopecky22@imperial.ac.uk), April 2026. + An easy to use Python package for (Multiblock) Partial Least Squares prediction modelling of univariate or multivariate outcomes. Four state of the art algorithms have been implemented and optimized for robust @@ -27,7 +37,7 @@ toolbox. The documentation is available at https://mbpls.readthedocs.io and elaborate (real-world) Jupyter Notebook examples can be found at -https://github.com/DTUComputeStatisticsAndDataAnalysis/MBPLS/tree/master/examples +https://github.com/kopeckylukas/MB-PLS/tree/master/examples This package can be cited using the following reference. From e8a1f5e57b1b116d8884cdfb55a47204ebd227f0 Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Sun, 19 Apr 2026 16:23:57 +0100 Subject: [PATCH 09/16] update readme with a disclaimer --- README.rst | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/README.rst b/README.rst index e7304ca..2137356 100644 --- a/README.rst +++ b/README.rst @@ -12,20 +12,18 @@ Multiblock Partial Least Squares Package :target: https://doi.org/10.21105/joss.01190 :alt: JOSS Paper DOI - .. note:: - This is a newly maintained version of the package, based on the original - MBPLS software originally developed by Andreas Baum and Laurent Vermue - (homepabe: https://github.com/DTUComputeStatisticsAndDataAnalysis/MBPLS/). + *This is a newly maintained version of the package, based on the original + MBPLS software originally developed by Andreas Baum and Laurent Vermue + (homepabe: https://github.com/DTUComputeStatisticsAndDataAnalysis/MBPLS/). + This maintained version has been updated to be compatible with Python 3.8 and later, and modern + version of the dependencies. The original version of the package is no longer maintained, + and users are encouraged to use this updated version for their work.* - This maintained version has been updated to be compatible with Python 3.8 and later, and modern - version of the dependencies. The original version of the package is no longer maintained, - and users are encouraged to use this updated version for their work. + *To cite this package, plase use the original publication by Baum et al. (2019) as described below + or refer to the GitHub repository for the most recent updates and contributions.* - To cite this package, plase use the original publication by Baum et al. (2019) as described below - or refer to the GitHub repository for the most recent updates and contributions. - - Lukas Kopecky (l.kopecky22@imperial.ac.uk), April 2026. + *Lukas Kopecky, April 2026.* An easy to use Python package for (Multiblock) Partial Least Squares prediction modelling of univariate or multivariate outcomes. Four state From 70b9cb66a4e57d54f6879b4f30c31547a278c7d6 Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Sun, 19 Apr 2026 16:24:38 +0100 Subject: [PATCH 10/16] update readme --- README.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.rst b/README.rst index 2137356..2887e5f 100644 --- a/README.rst +++ b/README.rst @@ -13,17 +13,17 @@ Multiblock Partial Least Squares Package :alt: JOSS Paper DOI - *This is a newly maintained version of the package, based on the original - MBPLS software originally developed by Andreas Baum and Laurent Vermue - (homepabe: https://github.com/DTUComputeStatisticsAndDataAnalysis/MBPLS/). - This maintained version has been updated to be compatible with Python 3.8 and later, and modern - version of the dependencies. The original version of the package is no longer maintained, - and users are encouraged to use this updated version for their work.* +*This is a newly maintained version of the package, based on the original +MBPLS software originally developed by Andreas Baum and Laurent Vermue +(homepabe: https://github.com/DTUComputeStatisticsAndDataAnalysis/MBPLS/). +This maintained version has been updated to be compatible with Python 3.8 and later, and modern +version of the dependencies. The original version of the package is no longer maintained, +and users are encouraged to use this updated version for their work.* - *To cite this package, plase use the original publication by Baum et al. (2019) as described below - or refer to the GitHub repository for the most recent updates and contributions.* +*To cite this package, plase use the original publication by Baum et al. (2019) as described below +or refer to the GitHub repository for the most recent updates and contributions.* - *Lukas Kopecky, April 2026.* +*Lukas Kopecky, April 2026.* An easy to use Python package for (Multiblock) Partial Least Squares prediction modelling of univariate or multivariate outcomes. Four state From bcb824d0ec2d91f3e38a9cd949bedb1f0e195b7d Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Sun, 19 Apr 2026 16:27:36 +0100 Subject: [PATCH 11/16] update readme to make the disclaimer shorter *This is a newly maintained version of the MBPLS software originally developed by Andreas Baum and Laurent Vermue (homepage: https://github.com/DTUComputeStatisticsAndDataAnalysis/MBPLS/). This maintained version has been updated to be compatible with Python 3.8 and later. Lukas Kopecky, April 2026.* --- README.rst | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/README.rst b/README.rst index 2887e5f..081a934 100644 --- a/README.rst +++ b/README.rst @@ -13,17 +13,9 @@ Multiblock Partial Least Squares Package :alt: JOSS Paper DOI -*This is a newly maintained version of the package, based on the original -MBPLS software originally developed by Andreas Baum and Laurent Vermue -(homepabe: https://github.com/DTUComputeStatisticsAndDataAnalysis/MBPLS/). -This maintained version has been updated to be compatible with Python 3.8 and later, and modern -version of the dependencies. The original version of the package is no longer maintained, -and users are encouraged to use this updated version for their work.* - -*To cite this package, plase use the original publication by Baum et al. (2019) as described below -or refer to the GitHub repository for the most recent updates and contributions.* - -*Lukas Kopecky, April 2026.* +*This is a newly maintained version of the MBPLS software originally developed by Andreas Baum and Laurent Vermue +(homepage: https://github.com/DTUComputeStatisticsAndDataAnalysis/MBPLS/). This maintained version has been updated to be compatible with Python 3.8 and later. +Lukas Kopecky, April 2026.* An easy to use Python package for (Multiblock) Partial Least Squares prediction modelling of univariate or multivariate outcomes. Four state From 04314d2c6ddcfcc135bf630f09579814a8194802 Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Sun, 19 Apr 2026 16:35:43 +0100 Subject: [PATCH 12/16] update setup for new a new maintained version of the package and add pyproject.toml configuration file --- mbpls/__init__.py | 2 +- pyproject.toml | 3 +++ setup.py | 8 ++++---- 3 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 pyproject.toml diff --git a/mbpls/__init__.py b/mbpls/__init__.py index 721825e..0cd2072 100644 --- a/mbpls/__init__.py +++ b/mbpls/__init__.py @@ -22,4 +22,4 @@ __all__ = ["mbpls", "data"] -__version__ = "1.0.4" \ No newline at end of file +__version__ = "1.1.0" \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..737e278 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools>=64", "wheel"] +build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/setup.py b/setup.py index ce1dd49..1b28da1 100644 --- a/setup.py +++ b/setup.py @@ -11,12 +11,12 @@ import mbpls -NAME = "mbpls" +NAME = "mb-pls" VERSION = mbpls.__version__ DESCRIPTION = "An implementation of the most common partial least squares algorithms as multi-block methods" -URL = 'https://github.com/DTUComputeStatisticsAndDataAnalysis/MBPLS' -AUTHORS = "Andreas Baum, Laurent Vermue" -AUTHOR_MAILS = ", " +URL = 'https://github.com/kopeckylukas/MB-PLS' +AUTHORS = "Andreas Baum, Laurent Vermue, Lukas Kopecky" +AUTHOR_MAILS = ", , " LICENSE = 'new BSD' # This is the lowest tested version. Below might work as well From ad58af220200cf6ff1240f533e93a908a3c9fa17 Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Sun, 19 Apr 2026 17:01:01 +0100 Subject: [PATCH 13/16] update PyPI distribution name to multiblock-pls to avoid name clashes --- README.rst | 2 +- setup.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 081a934..f5de1ed 100644 --- a/README.rst +++ b/README.rst @@ -41,7 +41,7 @@ Installation - | Install the package for Python3 using the following command. Some dependencies might require an upgrade (scikit-learn, numpy and scipy). - | ``$ pip install mbpls`` + | ``$ pip install multiblock-pls`` - | Now you can import the MBPLS class by typing | ``from mbpls.mbpls import MBPLS`` diff --git a/setup.py b/setup.py index 1b28da1..606c0cc 100644 --- a/setup.py +++ b/setup.py @@ -9,10 +9,11 @@ from setuptools import setup, find_packages -import mbpls +# import mbpls -NAME = "mb-pls" -VERSION = mbpls.__version__ +NAME = "multiblock-pls" +# VERSION = mbpls.__version__ +VERSION = '1.1.0' DESCRIPTION = "An implementation of the most common partial least squares algorithms as multi-block methods" URL = 'https://github.com/kopeckylukas/MB-PLS' AUTHORS = "Andreas Baum, Laurent Vermue, Lukas Kopecky" From cd1c5531e5c553651dd187d0601af5b178427b85 Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Sun, 19 Apr 2026 17:08:34 +0100 Subject: [PATCH 14/16] trial mb-pls name --- README.rst | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index f5de1ed..8bf8cb3 100644 --- a/README.rst +++ b/README.rst @@ -41,7 +41,7 @@ Installation - | Install the package for Python3 using the following command. Some dependencies might require an upgrade (scikit-learn, numpy and scipy). - | ``$ pip install multiblock-pls`` + | ``$ pip install mb-pls`` - | Now you can import the MBPLS class by typing | ``from mbpls.mbpls import MBPLS`` diff --git a/setup.py b/setup.py index 606c0cc..ebdacb6 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ # import mbpls -NAME = "multiblock-pls" +NAME = "mb-pls" # VERSION = mbpls.__version__ VERSION = '1.1.0' DESCRIPTION = "An implementation of the most common partial least squares algorithms as multi-block methods" From d3c1e35de1958ff5fe898314ab1599f384bf7f83 Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Sun, 19 Apr 2026 17:15:48 +0100 Subject: [PATCH 15/16] add pypi badge to readme --- README.rst | 9 ++++++--- setup.py | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 8bf8cb3..d80936b 100644 --- a/README.rst +++ b/README.rst @@ -2,8 +2,11 @@ Multiblock Partial Least Squares Package ======================================== -.. image:: https://img.shields.io/pypi/l/mbpls.svg - :target: https://pypi.python.org/pypi/mbpls/ +.. image:: https://img.shields.io/pypi/v/multiblock-pls.svg + :target: https://pypi.python.org/pypi/multiblock-pls + :alt: Pypi Version +.. image:: https://img.shields.io/pypi/l/multiblock-pls.svg + :target: https://pypi.python.org/pypi/multiblock-pls :alt: License .. image:: https://readthedocs.org/projects/mbpls/badge/?version=latest :target: https://mbpls.readthedocs.io/en/latest/?badge=latest @@ -41,7 +44,7 @@ Installation - | Install the package for Python3 using the following command. Some dependencies might require an upgrade (scikit-learn, numpy and scipy). - | ``$ pip install mb-pls`` + | ``$ pip install multiblock-pls`` - | Now you can import the MBPLS class by typing | ``from mbpls.mbpls import MBPLS`` diff --git a/setup.py b/setup.py index ebdacb6..606c0cc 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ # import mbpls -NAME = "mb-pls" +NAME = "multiblock-pls" # VERSION = mbpls.__version__ VERSION = '1.1.0' DESCRIPTION = "An implementation of the most common partial least squares algorithms as multi-block methods" From 24e7332df89abbb53efa398e1f7b941322663fbf Mon Sep 17 00:00:00 2001 From: Lukas Kopecky <56082570+kopeckylukas@users.noreply.github.com> Date: Sun, 19 Apr 2026 17:16:56 +0100 Subject: [PATCH 16/16] update badge target --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index d80936b..0ba0bcf 100644 --- a/README.rst +++ b/README.rst @@ -3,7 +3,7 @@ Multiblock Partial Least Squares Package .. image:: https://img.shields.io/pypi/v/multiblock-pls.svg - :target: https://pypi.python.org/pypi/multiblock-pls + :target: https://pypi.org/project/multiblock-pls/ :alt: Pypi Version .. image:: https://img.shields.io/pypi/l/multiblock-pls.svg :target: https://pypi.python.org/pypi/multiblock-pls