eb-optimization 0.1.1__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {eb_optimization-0.1.1/src/eb_optimization.egg-info → eb_optimization-0.2.0}/PKG-INFO +8 -1
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/README.md +5 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/pyproject.toml +3 -1
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/policies/__init__.py +2 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/policies/ral_policy.py +44 -11
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/search/__init__.py +5 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/tuning/__init__.py +5 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0/src/eb_optimization.egg-info}/PKG-INFO +8 -1
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization.egg-info/SOURCES.txt +2 -1
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization.egg-info/requires.txt +2 -0
- eb_optimization-0.2.0/tests/test_public_api.py +39 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/LICENSE +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/setup.cfg +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/__init__.py +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/_utils.py +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/policies/cost_ratio_policy.py +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/policies/tau_policy.py +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/search/grid.py +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/search/kernels.py +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/search/results.py +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/tuning/cost_ratio.py +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/tuning/ral.py +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/tuning/sensitivity.py +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/tuning/tau.py +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization.egg-info/dependency_links.txt +0 -0
- {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: eb-optimization
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Electric Barometer: Optimization and tuning utilities for EB objectives and policy parameters.
|
|
5
5
|
Author-email: "Kyle Corrie (Economistician)" <kcorrie@economistician.com>
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -28,13 +28,20 @@ Provides-Extra: opt
|
|
|
28
28
|
Provides-Extra: test
|
|
29
29
|
Requires-Dist: pytest>=8.0; extra == "test"
|
|
30
30
|
Requires-Dist: scikit-learn>=1.3; extra == "test"
|
|
31
|
+
Requires-Dist: eb-optimization[eb]; extra == "test"
|
|
31
32
|
Provides-Extra: dev
|
|
32
33
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
33
34
|
Requires-Dist: pytest-cov>=5.0; extra == "dev"
|
|
35
|
+
Requires-Dist: eb-optimization[eb]; extra == "dev"
|
|
34
36
|
Dynamic: license-file
|
|
35
37
|
|
|
36
38
|
# Electric Barometer · Optimization (`eb-optimization`)
|
|
37
39
|
|
|
40
|
+
[](https://github.com/Economistician/eb-optimization/actions/workflows/ci.yml)
|
|
41
|
+

|
|
42
|
+

|
|
43
|
+

|
|
44
|
+
|
|
38
45
|
Decision and policy layer for the Electric Barometer ecosystem, responsible for tuning, calibration, and governed parameter selection.
|
|
39
46
|
|
|
40
47
|
---
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Electric Barometer · Optimization (`eb-optimization`)
|
|
2
2
|
|
|
3
|
+
[](https://github.com/Economistician/eb-optimization/actions/workflows/ci.yml)
|
|
4
|
+

|
|
5
|
+

|
|
6
|
+

|
|
7
|
+
|
|
3
8
|
Decision and policy layer for the Electric Barometer ecosystem, responsible for tuning, calibration, and governed parameter selection.
|
|
4
9
|
|
|
5
10
|
---
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
######################################
|
|
4
4
|
[project]
|
|
5
5
|
name = "eb-optimization"
|
|
6
|
-
version = "0.
|
|
6
|
+
version = "0.2.0"
|
|
7
7
|
description = "Electric Barometer: Optimization and tuning utilities for EB objectives and policy parameters."
|
|
8
8
|
readme = "README.md"
|
|
9
9
|
requires-python = ">=3.10"
|
|
@@ -75,12 +75,14 @@ opt = [
|
|
|
75
75
|
test = [
|
|
76
76
|
"pytest>=8.0",
|
|
77
77
|
"scikit-learn>=1.3",
|
|
78
|
+
"eb-optimization[eb]",
|
|
78
79
|
]
|
|
79
80
|
|
|
80
81
|
# Local developer tooling
|
|
81
82
|
dev = [
|
|
82
83
|
"pytest>=8.0",
|
|
83
84
|
"pytest-cov>=5.0",
|
|
85
|
+
"eb-optimization[eb]",
|
|
84
86
|
]
|
|
85
87
|
|
|
86
88
|
######################################
|
|
@@ -62,11 +62,13 @@ __all__ = [
|
|
|
62
62
|
"apply_tau_policy",
|
|
63
63
|
"apply_tau_policy_hr",
|
|
64
64
|
"apply_entity_tau_policy",
|
|
65
|
+
|
|
65
66
|
# Cost ratio policies
|
|
66
67
|
"CostRatioPolicy",
|
|
67
68
|
"DEFAULT_COST_RATIO_POLICY",
|
|
68
69
|
"apply_cost_ratio_policy",
|
|
69
70
|
"apply_entity_cost_ratio_policy",
|
|
71
|
+
|
|
70
72
|
# RAL policies
|
|
71
73
|
"RALPolicy",
|
|
72
74
|
"DEFAULT_RAL_POLICY",
|
|
@@ -23,8 +23,10 @@ optimization, not the optimization process itself.
|
|
|
23
23
|
|
|
24
24
|
from dataclasses import dataclass
|
|
25
25
|
from typing import Optional, Sequence
|
|
26
|
+
|
|
26
27
|
import pandas as pd
|
|
27
28
|
|
|
29
|
+
|
|
28
30
|
@dataclass(frozen=True)
|
|
29
31
|
class RALPolicy:
|
|
30
32
|
r"""Portable policy artifact for the Readiness Adjustment Layer (RAL).
|
|
@@ -67,7 +69,7 @@ class RALPolicy:
|
|
|
67
69
|
artifacts needed to execute the adjustment.
|
|
68
70
|
"""
|
|
69
71
|
|
|
70
|
-
global_uplift: float
|
|
72
|
+
global_uplift: float = 1.0
|
|
71
73
|
segment_cols: Sequence[str] = ()
|
|
72
74
|
uplift_table: Optional[pd.DataFrame] = None
|
|
73
75
|
|
|
@@ -93,16 +95,17 @@ class RALPolicy:
|
|
|
93
95
|
pd.Series
|
|
94
96
|
A series with the adjusted forecast values.
|
|
95
97
|
"""
|
|
96
|
-
|
|
97
|
-
adjusted_forecast = df[forecast_col] * self.global_uplift
|
|
98
|
+
adjusted_forecast = df[forecast_col] * float(self.global_uplift)
|
|
98
99
|
|
|
99
|
-
# Apply segment-level uplifts if available
|
|
100
100
|
if self.is_segmented():
|
|
101
101
|
# Merge uplift_table with the DataFrame based on segment columns
|
|
102
|
-
uplift_df = df.merge(self.uplift_table, on=self.segment_cols, how="left")
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
102
|
+
uplift_df = df.merge(self.uplift_table, on=list(self.segment_cols), how="left")
|
|
103
|
+
|
|
104
|
+
# Apply the segment-level uplift (if available) to the forecast.
|
|
105
|
+
# NOTE: `uplift` here is interpreted as a multiplicative factor relative to the
|
|
106
|
+
# global uplift. Missing segments default to 1.0 (no additional uplift).
|
|
107
|
+
return adjusted_forecast * uplift_df["uplift"].fillna(1.0)
|
|
108
|
+
|
|
106
109
|
return adjusted_forecast
|
|
107
110
|
|
|
108
111
|
def transform(self, df: pd.DataFrame, forecast_col: str) -> pd.DataFrame:
|
|
@@ -124,6 +127,36 @@ class RALPolicy:
|
|
|
124
127
|
The transformed DataFrame with the adjusted forecast values added.
|
|
125
128
|
"""
|
|
126
129
|
df_copy = df.copy()
|
|
127
|
-
|
|
128
|
-
df_copy
|
|
129
|
-
|
|
130
|
+
df_copy["readiness_forecast"] = self.adjust_forecast(df_copy, forecast_col)
|
|
131
|
+
return df_copy
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
# Convenience default policy instance (for the policies package API)
|
|
135
|
+
DEFAULT_RAL_POLICY = RALPolicy()
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def apply_ral_policy(
|
|
139
|
+
df: pd.DataFrame,
|
|
140
|
+
forecast_col: str,
|
|
141
|
+
policy: RALPolicy = DEFAULT_RAL_POLICY,
|
|
142
|
+
) -> pd.DataFrame:
|
|
143
|
+
"""Convenience functional wrapper to apply a RALPolicy.
|
|
144
|
+
|
|
145
|
+
This is a thin wrapper around :meth:`RALPolicy.transform` used by callers/tests
|
|
146
|
+
that prefer a functional interface.
|
|
147
|
+
|
|
148
|
+
Parameters
|
|
149
|
+
----------
|
|
150
|
+
df : pd.DataFrame
|
|
151
|
+
Input DataFrame containing the forecast column.
|
|
152
|
+
forecast_col : str
|
|
153
|
+
Name of the forecast column to adjust.
|
|
154
|
+
policy : RALPolicy
|
|
155
|
+
Policy artifact to apply. Defaults to :data:`DEFAULT_RAL_POLICY`.
|
|
156
|
+
|
|
157
|
+
Returns
|
|
158
|
+
-------
|
|
159
|
+
pd.DataFrame
|
|
160
|
+
Copy of `df` with `readiness_forecast` added.
|
|
161
|
+
"""
|
|
162
|
+
return policy.transform(df=df, forecast_col=forecast_col)
|
|
@@ -19,6 +19,11 @@ re-exporting function symbols. This avoids import-time breakage when internals
|
|
|
19
19
|
are renamed during refactors.
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
|
+
from . import cost_ratio
|
|
23
|
+
from . import sensitivity
|
|
24
|
+
from . import tau
|
|
25
|
+
from . import ral
|
|
26
|
+
|
|
22
27
|
__all__ = [
|
|
23
28
|
"cost_ratio",
|
|
24
29
|
"sensitivity",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: eb-optimization
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Electric Barometer: Optimization and tuning utilities for EB objectives and policy parameters.
|
|
5
5
|
Author-email: "Kyle Corrie (Economistician)" <kcorrie@economistician.com>
|
|
6
6
|
License-Expression: BSD-3-Clause
|
|
@@ -28,13 +28,20 @@ Provides-Extra: opt
|
|
|
28
28
|
Provides-Extra: test
|
|
29
29
|
Requires-Dist: pytest>=8.0; extra == "test"
|
|
30
30
|
Requires-Dist: scikit-learn>=1.3; extra == "test"
|
|
31
|
+
Requires-Dist: eb-optimization[eb]; extra == "test"
|
|
31
32
|
Provides-Extra: dev
|
|
32
33
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
33
34
|
Requires-Dist: pytest-cov>=5.0; extra == "dev"
|
|
35
|
+
Requires-Dist: eb-optimization[eb]; extra == "dev"
|
|
34
36
|
Dynamic: license-file
|
|
35
37
|
|
|
36
38
|
# Electric Barometer · Optimization (`eb-optimization`)
|
|
37
39
|
|
|
40
|
+
[](https://github.com/Economistician/eb-optimization/actions/workflows/ci.yml)
|
|
41
|
+

|
|
42
|
+

|
|
43
|
+

|
|
44
|
+
|
|
38
45
|
Decision and policy layer for the Electric Barometer ecosystem, responsible for tuning, calibration, and governed parameter selection.
|
|
39
46
|
|
|
40
47
|
---
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
def test_policies_public_api_imports():
|
|
2
|
+
from eb_optimization.policies import (
|
|
3
|
+
TauPolicy,
|
|
4
|
+
CostRatioPolicy,
|
|
5
|
+
RALPolicy,
|
|
6
|
+
DEFAULT_COST_RATIO_POLICY,
|
|
7
|
+
DEFAULT_RAL_POLICY,
|
|
8
|
+
apply_tau_policy,
|
|
9
|
+
apply_tau_policy_hr,
|
|
10
|
+
apply_entity_tau_policy,
|
|
11
|
+
apply_cost_ratio_policy,
|
|
12
|
+
apply_entity_cost_ratio_policy,
|
|
13
|
+
apply_ral_policy,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
# Touch symbols so linters/optimizers can't "optimize away" imports
|
|
17
|
+
assert TauPolicy and CostRatioPolicy and RALPolicy
|
|
18
|
+
assert DEFAULT_COST_RATIO_POLICY is not None
|
|
19
|
+
assert DEFAULT_RAL_POLICY is not None
|
|
20
|
+
assert callable(apply_tau_policy)
|
|
21
|
+
assert callable(apply_tau_policy_hr)
|
|
22
|
+
assert callable(apply_entity_tau_policy)
|
|
23
|
+
assert callable(apply_cost_ratio_policy)
|
|
24
|
+
assert callable(apply_entity_cost_ratio_policy)
|
|
25
|
+
assert callable(apply_ral_policy)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_search_and_tuning_module_exports():
|
|
29
|
+
# module-level stability (export modules, not functions)
|
|
30
|
+
from eb_optimization import search, tuning
|
|
31
|
+
|
|
32
|
+
assert hasattr(search, "grid")
|
|
33
|
+
assert hasattr(search, "kernels")
|
|
34
|
+
assert hasattr(search, "results")
|
|
35
|
+
|
|
36
|
+
assert hasattr(tuning, "cost_ratio")
|
|
37
|
+
assert hasattr(tuning, "sensitivity")
|
|
38
|
+
assert hasattr(tuning, "tau")
|
|
39
|
+
assert hasattr(tuning, "ral")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/policies/cost_ratio_policy.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|