Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 19 additions & 12 deletions pypfopt/risk_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

import numpy as np
import pandas as pd
from skbase.utils.dependencies import _check_soft_dependencies

from .expected_returns import returns_from_prices

Expand Down Expand Up @@ -298,11 +299,14 @@ def min_cov_determinant(
warnings.warn("data is not in a dataframe", RuntimeWarning)
prices = pd.DataFrame(prices)

# Extra dependency
try:
import sklearn.covariance
except (ModuleNotFoundError, ImportError):
raise ImportError("Please install scikit-learn via pip or poetry")
if not _check_soft_dependencies(["scikit-learn"], severity="none"):
raise ImportError(
"scikit-learn is required to use min_cov_determinant. "
"Please ensure that scikit-learn is installed in your environment,"
" e.g via pip install scikit-learn"
)

from sklearn.covariance import fast_mcd

assets = prices.columns

Expand All @@ -312,7 +316,7 @@ def min_cov_determinant(
X = returns_from_prices(prices, log_returns)
# X = np.nan_to_num(X.values)
X = X.dropna().values
raw_cov_array = sklearn.covariance.fast_mcd(X, random_state=random_state)[1]
raw_cov_array = fast_mcd(X, random_state=random_state)[1]
cov = pd.DataFrame(raw_cov_array, index=assets, columns=assets) * frequency
return fix_nonpositive_semidefinite(cov, kwargs.get("fix_method", "spectral"))

Expand Down Expand Up @@ -379,13 +383,16 @@ def __init__(self, prices, returns_data=False, frequency=252, log_returns=False)
:param log_returns: whether to compute using log returns
:type log_returns: bool, defaults to False
"""
# Optional import
try:
from sklearn import covariance
if not _check_soft_dependencies(["scikit-learn"], severity="none"):
raise ImportError(
"scikit-learn is required to use CovarianceShrinkage. "
"Please ensure that scikit-learn is installed in your environment,"
" e.g via pip install scikit-learn"
)

from sklearn import covariance

self.covariance = covariance
except (ModuleNotFoundError, ImportError): # pragma: no cover
raise ImportError("Please install scikit-learn via pip or poetry")
self.covariance = covariance

if not isinstance(prices, pd.DataFrame):
warnings.warn("data is not in a dataframe", RuntimeWarning)
Expand Down
3 changes: 1 addition & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ dependencies = [
"cvxpy>=1.1.19",
"numpy>=1.26.0",
"pandas>=0.19",
"scikit-base<0.14.0",
"scikit-learn>=0.24.1",
"scipy>=1.3.0",
"scikit-base<0.14.0",
]

[project.optional-dependencies]
Expand All @@ -54,7 +54,6 @@ dependencies = [
all_extras = [
"matplotlib>=3.2.0",
"plotly>=5.0.0,<6",
"scikit-learn>=0.24.1",
"ecos>=2.0.14,<2.1",
"plotly>=5.0.0,<7",
"cvxopt; python_version < '3.14'",
Expand Down