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.
Files changed (26) hide show
  1. {eb_optimization-0.1.1/src/eb_optimization.egg-info → eb_optimization-0.2.0}/PKG-INFO +8 -1
  2. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/README.md +5 -0
  3. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/pyproject.toml +3 -1
  4. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/policies/__init__.py +2 -0
  5. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/policies/ral_policy.py +44 -11
  6. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/search/__init__.py +5 -0
  7. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/tuning/__init__.py +5 -0
  8. {eb_optimization-0.1.1 → eb_optimization-0.2.0/src/eb_optimization.egg-info}/PKG-INFO +8 -1
  9. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization.egg-info/SOURCES.txt +2 -1
  10. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization.egg-info/requires.txt +2 -0
  11. eb_optimization-0.2.0/tests/test_public_api.py +39 -0
  12. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/LICENSE +0 -0
  13. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/setup.cfg +0 -0
  14. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/__init__.py +0 -0
  15. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/_utils.py +0 -0
  16. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/policies/cost_ratio_policy.py +0 -0
  17. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/policies/tau_policy.py +0 -0
  18. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/search/grid.py +0 -0
  19. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/search/kernels.py +0 -0
  20. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/search/results.py +0 -0
  21. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/tuning/cost_ratio.py +0 -0
  22. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/tuning/ral.py +0 -0
  23. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/tuning/sensitivity.py +0 -0
  24. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization/tuning/tau.py +0 -0
  25. {eb_optimization-0.1.1 → eb_optimization-0.2.0}/src/eb_optimization.egg-info/dependency_links.txt +0 -0
  26. {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.1.1
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
+ [![CI](https://github.com/Economistician/eb-optimization/actions/workflows/ci.yml/badge.svg)](https://github.com/Economistician/eb-optimization/actions/workflows/ci.yml)
41
+ ![License: BSD-3-Clause](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)
42
+ ![Python Versions](https://img.shields.io/pypi/pyversions/eb-optimization)
43
+ ![PyPI](https://img.shields.io/pypi/v/eb-optimization)
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
+ [![CI](https://github.com/Economistician/eb-optimization/actions/workflows/ci.yml/badge.svg)](https://github.com/Economistician/eb-optimization/actions/workflows/ci.yml)
4
+ ![License: BSD-3-Clause](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)
5
+ ![Python Versions](https://img.shields.io/pypi/pyversions/eb-optimization)
6
+ ![PyPI](https://img.shields.io/pypi/v/eb-optimization)
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.1.1"
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
- # Start with the global uplift applied to the forecast column
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
- # Apply the segment-level uplift (if available) to the forecast
104
- uplifted_forecast = adjusted_forecast * uplift_df["uplift"].fillna(1.0) # Default to 1.0 if no uplift
105
- return uplifted_forecast
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
- adjusted_forecast = self.adjust_forecast(df_copy, forecast_col)
128
- df_copy["readiness_forecast"] = adjusted_forecast
129
- return df_copy
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)
@@ -21,7 +21,12 @@ Key rules
21
21
  - Pure, deterministic search utilities
22
22
  """
23
23
 
24
+ from . import grid
25
+ from . import kernels
26
+ from . import results
27
+
24
28
  __all__ = [
25
29
  "grid",
26
30
  "kernels",
31
+ "results",
27
32
  ]
@@ -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.1.1
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
+ [![CI](https://github.com/Economistician/eb-optimization/actions/workflows/ci.yml/badge.svg)](https://github.com/Economistician/eb-optimization/actions/workflows/ci.yml)
41
+ ![License: BSD-3-Clause](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)
42
+ ![Python Versions](https://img.shields.io/pypi/pyversions/eb-optimization)
43
+ ![PyPI](https://img.shields.io/pypi/v/eb-optimization)
44
+
38
45
  Decision and policy layer for the Electric Barometer ecosystem, responsible for tuning, calibration, and governed parameter selection.
39
46
 
40
47
  ---
@@ -20,4 +20,5 @@ src/eb_optimization/tuning/__init__.py
20
20
  src/eb_optimization/tuning/cost_ratio.py
21
21
  src/eb_optimization/tuning/ral.py
22
22
  src/eb_optimization/tuning/sensitivity.py
23
- src/eb_optimization/tuning/tau.py
23
+ src/eb_optimization/tuning/tau.py
24
+ tests/test_public_api.py
@@ -4,6 +4,7 @@ pandas>=2.0
4
4
  [dev]
5
5
  pytest>=8.0
6
6
  pytest-cov>=5.0
7
+ eb-optimization[eb]
7
8
 
8
9
  [eb]
9
10
  eb-metrics<0.3,>=0.2
@@ -14,3 +15,4 @@ eb-evaluation<0.3,>=0.2
14
15
  [test]
15
16
  pytest>=8.0
16
17
  scikit-learn>=1.3
18
+ eb-optimization[eb]
@@ -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