Skip to content

Commit ac7e890

Browse files
authored
[ENH] pandas 3 compatibility (#703)
Ensure `pandas 3` compatibility while maintaining `pandas 2` compatibility. * ensuring explicit dimension casting to fix deprecated coercion of Nd arrays to float * use of `"ME"` instead of deprecated `"M"` frequency from `pandas 3.0` onwards in tests
1 parent ff75586 commit ac7e890

4 files changed

Lines changed: 26 additions & 7 deletions

File tree

pypfopt/cla.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,16 @@ def _compute_w(self, covarF_inv, covarFB, meanF, wB):
138138
g1 = np.dot(np.dot(onesF.T, covarF_inv), meanF)
139139
g2 = np.dot(np.dot(onesF.T, covarF_inv), onesF)
140140
if wB is None:
141-
g, w1 = float(-self.ls[-1] * g1 / g2 + 1 / g2), 0
141+
g = -self.ls[-1] * g1 / g2 + 1 / g2
142+
w1 = 0
142143
else:
143144
onesB = np.ones(wB.shape)
144145
g3 = np.dot(onesB.T, wB)
145146
g4 = np.dot(covarF_inv, covarFB)
146147
w1 = np.dot(g4, wB)
147148
g4 = np.dot(onesF.T, w1)
148-
g = float(-self.ls[-1] * g1 / g2 + (1 - g3 + g4) / g2)
149+
g = -self.ls[-1] * g1 / g2 + (1 - g3 + g4) / g2
150+
g = float(g[0, 0])
149151
# 2) compute weights
150152
w2 = np.dot(covarF_inv, onesF)
151153
w3 = np.dot(covarF_inv, meanF)
@@ -167,14 +169,16 @@ def _compute_lambda(self, covarF_inv, covarFB, meanF, wB, i, bi):
167169
# 3) Lambda
168170
if wB is None:
169171
# All free assets
170-
return float((c4[i] - c1 * bi) / c), bi
172+
res = (c4[i] - c1 * bi) / c
171173
else:
172174
onesB = np.ones(wB.shape)
173175
l1 = np.dot(onesB.T, wB)
174176
l2 = np.dot(covarF_inv, covarFB)
175177
l3 = np.dot(l2, wB)
176178
l2 = np.dot(onesF.T, l3)
177-
return float(((1 - l1 + l2) * c4[i] - c1 * (bi + l3[i])) / c), bi
179+
res = ((1 - l1 + l2) * c4[i] - c1 * (bi + l3[i])) / c
180+
res = float(res[0, 0])
181+
return res, bi
178182

179183
def _get_matrices(self, f):
180184
# Slice covarF,covarFB,covarB,meanF,meanB,wF,wB

tests/test_efficient_cdar.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,14 @@ def test_cdar_example_weekly():
8484

8585

8686
def test_cdar_example_monthly():
87+
if _check_soft_dependencies("pandas<3", severity="none"):
88+
MONTHLY_FREQ = "M"
89+
else:
90+
MONTHLY_FREQ = "ME"
91+
8792
beta = 0.90
8893
df = get_data()
89-
df = df.resample("M").first()
94+
df = df.resample(MONTHLY_FREQ).first()
9095
mu = expected_returns.mean_historical_return(df, frequency=12)
9196
historical_rets = expected_returns.returns_from_prices(df).dropna()
9297
cd = EfficientCDaR(mu, historical_rets, beta=beta)

tests/test_efficient_cvar.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,14 @@ def test_cvar_example_weekly():
9292

9393

9494
def test_cvar_example_monthly():
95+
if _check_soft_dependencies("pandas<3", severity="none"):
96+
MONTHLY_FREQ = "M"
97+
else:
98+
MONTHLY_FREQ = "ME"
99+
95100
beta = 0.95
96101
df = get_data()
97-
df = df.resample("M").first()
102+
df = df.resample(MONTHLY_FREQ).first()
98103
mu = expected_returns.mean_historical_return(df, frequency=12)
99104
historical_rets = expected_returns.returns_from_prices(df).dropna()
100105
cv = EfficientCVaR(mu, historical_rets, beta=beta)

tests/test_efficient_semivariance.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,13 @@ def test_es_example_weekly():
119119

120120

121121
def test_es_example_monthly():
122+
if _check_soft_dependencies("pandas<3", severity="none"):
123+
MONTHLY_FREQ = "M"
124+
else:
125+
MONTHLY_FREQ = "ME"
126+
122127
df = get_data()
123-
df = df.resample("M").first()
128+
df = df.resample(MONTHLY_FREQ).first()
124129
mu = expected_returns.mean_historical_return(df, frequency=12)
125130
historical_rets = expected_returns.returns_from_prices(df).dropna()
126131
es = EfficientSemivariance(mu, historical_rets, frequency=12)

0 commit comments

Comments
 (0)