ins-pricing 0.1.11__py3-none-any.whl → 0.2.0__py3-none-any.whl
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.
- ins_pricing/README.md +9 -6
- ins_pricing/__init__.py +3 -11
- ins_pricing/cli/BayesOpt_entry.py +24 -0
- ins_pricing/{modelling → cli}/BayesOpt_incremental.py +197 -64
- ins_pricing/cli/Explain_Run.py +25 -0
- ins_pricing/{modelling → cli}/Explain_entry.py +169 -124
- ins_pricing/cli/Pricing_Run.py +25 -0
- ins_pricing/cli/__init__.py +1 -0
- ins_pricing/cli/bayesopt_entry_runner.py +1312 -0
- ins_pricing/cli/utils/__init__.py +1 -0
- ins_pricing/cli/utils/cli_common.py +320 -0
- ins_pricing/cli/utils/cli_config.py +375 -0
- ins_pricing/{modelling → cli/utils}/notebook_utils.py +74 -19
- {ins_pricing_gemini/modelling → ins_pricing/cli}/watchdog_run.py +2 -2
- ins_pricing/{modelling → docs/modelling}/BayesOpt_USAGE.md +69 -49
- ins_pricing/docs/modelling/README.md +34 -0
- ins_pricing/modelling/__init__.py +57 -6
- ins_pricing/modelling/core/__init__.py +1 -0
- ins_pricing/modelling/{bayesopt → core/bayesopt}/config_preprocess.py +64 -1
- ins_pricing/modelling/{bayesopt → core/bayesopt}/core.py +150 -810
- ins_pricing/modelling/core/bayesopt/model_explain_mixin.py +296 -0
- ins_pricing/modelling/core/bayesopt/model_plotting_mixin.py +548 -0
- ins_pricing/modelling/core/bayesopt/models/__init__.py +27 -0
- ins_pricing/modelling/core/bayesopt/models/model_ft_components.py +316 -0
- ins_pricing/modelling/core/bayesopt/models/model_ft_trainer.py +808 -0
- ins_pricing/modelling/core/bayesopt/models/model_gnn.py +675 -0
- ins_pricing/modelling/core/bayesopt/models/model_resn.py +435 -0
- ins_pricing/modelling/core/bayesopt/trainers/__init__.py +19 -0
- ins_pricing/modelling/core/bayesopt/trainers/trainer_base.py +1020 -0
- ins_pricing/modelling/core/bayesopt/trainers/trainer_ft.py +787 -0
- ins_pricing/modelling/core/bayesopt/trainers/trainer_glm.py +195 -0
- ins_pricing/modelling/core/bayesopt/trainers/trainer_gnn.py +312 -0
- ins_pricing/modelling/core/bayesopt/trainers/trainer_resn.py +261 -0
- ins_pricing/modelling/core/bayesopt/trainers/trainer_xgb.py +348 -0
- ins_pricing/modelling/{bayesopt → core/bayesopt}/utils.py +2 -2
- ins_pricing/modelling/core/evaluation.py +115 -0
- ins_pricing/production/__init__.py +4 -0
- ins_pricing/production/preprocess.py +71 -0
- ins_pricing/setup.py +10 -5
- {ins_pricing_gemini/modelling/tests → ins_pricing/tests/modelling}/test_plotting.py +2 -2
- {ins_pricing-0.1.11.dist-info → ins_pricing-0.2.0.dist-info}/METADATA +4 -4
- ins_pricing-0.2.0.dist-info/RECORD +125 -0
- {ins_pricing-0.1.11.dist-info → ins_pricing-0.2.0.dist-info}/top_level.txt +0 -1
- ins_pricing/modelling/BayesOpt_entry.py +0 -633
- ins_pricing/modelling/Explain_Run.py +0 -36
- ins_pricing/modelling/Pricing_Run.py +0 -36
- ins_pricing/modelling/README.md +0 -33
- ins_pricing/modelling/bayesopt/models.py +0 -2196
- ins_pricing/modelling/bayesopt/trainers.py +0 -2446
- ins_pricing/modelling/cli_common.py +0 -136
- ins_pricing/modelling/tests/test_plotting.py +0 -63
- ins_pricing/modelling/watchdog_run.py +0 -211
- ins_pricing-0.1.11.dist-info/RECORD +0 -169
- ins_pricing_gemini/__init__.py +0 -23
- ins_pricing_gemini/governance/__init__.py +0 -20
- ins_pricing_gemini/governance/approval.py +0 -93
- ins_pricing_gemini/governance/audit.py +0 -37
- ins_pricing_gemini/governance/registry.py +0 -99
- ins_pricing_gemini/governance/release.py +0 -159
- ins_pricing_gemini/modelling/Explain_Run.py +0 -36
- ins_pricing_gemini/modelling/Pricing_Run.py +0 -36
- ins_pricing_gemini/modelling/__init__.py +0 -151
- ins_pricing_gemini/modelling/cli_common.py +0 -141
- ins_pricing_gemini/modelling/config.py +0 -249
- ins_pricing_gemini/modelling/config_preprocess.py +0 -254
- ins_pricing_gemini/modelling/core.py +0 -741
- ins_pricing_gemini/modelling/data_container.py +0 -42
- ins_pricing_gemini/modelling/explain/__init__.py +0 -55
- ins_pricing_gemini/modelling/explain/gradients.py +0 -334
- ins_pricing_gemini/modelling/explain/metrics.py +0 -176
- ins_pricing_gemini/modelling/explain/permutation.py +0 -155
- ins_pricing_gemini/modelling/explain/shap_utils.py +0 -146
- ins_pricing_gemini/modelling/features.py +0 -215
- ins_pricing_gemini/modelling/model_manager.py +0 -148
- ins_pricing_gemini/modelling/model_plotting.py +0 -463
- ins_pricing_gemini/modelling/models.py +0 -2203
- ins_pricing_gemini/modelling/notebook_utils.py +0 -294
- ins_pricing_gemini/modelling/plotting/__init__.py +0 -45
- ins_pricing_gemini/modelling/plotting/common.py +0 -63
- ins_pricing_gemini/modelling/plotting/curves.py +0 -572
- ins_pricing_gemini/modelling/plotting/diagnostics.py +0 -139
- ins_pricing_gemini/modelling/plotting/geo.py +0 -362
- ins_pricing_gemini/modelling/plotting/importance.py +0 -121
- ins_pricing_gemini/modelling/run_logging.py +0 -133
- ins_pricing_gemini/modelling/tests/conftest.py +0 -8
- ins_pricing_gemini/modelling/tests/test_cross_val_generic.py +0 -66
- ins_pricing_gemini/modelling/tests/test_distributed_utils.py +0 -18
- ins_pricing_gemini/modelling/tests/test_explain.py +0 -56
- ins_pricing_gemini/modelling/tests/test_geo_tokens_split.py +0 -49
- ins_pricing_gemini/modelling/tests/test_graph_cache.py +0 -33
- ins_pricing_gemini/modelling/tests/test_plotting_library.py +0 -150
- ins_pricing_gemini/modelling/tests/test_preprocessor.py +0 -48
- ins_pricing_gemini/modelling/trainers.py +0 -2447
- ins_pricing_gemini/modelling/utils.py +0 -1020
- ins_pricing_gemini/pricing/__init__.py +0 -27
- ins_pricing_gemini/pricing/calibration.py +0 -39
- ins_pricing_gemini/pricing/data_quality.py +0 -117
- ins_pricing_gemini/pricing/exposure.py +0 -85
- ins_pricing_gemini/pricing/factors.py +0 -91
- ins_pricing_gemini/pricing/monitoring.py +0 -99
- ins_pricing_gemini/pricing/rate_table.py +0 -78
- ins_pricing_gemini/production/__init__.py +0 -21
- ins_pricing_gemini/production/drift.py +0 -30
- ins_pricing_gemini/production/monitoring.py +0 -143
- ins_pricing_gemini/production/scoring.py +0 -40
- ins_pricing_gemini/reporting/__init__.py +0 -11
- ins_pricing_gemini/reporting/report_builder.py +0 -72
- ins_pricing_gemini/reporting/scheduler.py +0 -45
- ins_pricing_gemini/scripts/BayesOpt_incremental.py +0 -722
- ins_pricing_gemini/scripts/Explain_entry.py +0 -545
- ins_pricing_gemini/scripts/__init__.py +0 -1
- ins_pricing_gemini/scripts/train.py +0 -568
- ins_pricing_gemini/setup.py +0 -55
- ins_pricing_gemini/smoke_test.py +0 -28
- /ins_pricing/{modelling → cli/utils}/run_logging.py +0 -0
- /ins_pricing/modelling/{BayesOpt.py → core/BayesOpt.py} +0 -0
- /ins_pricing/modelling/{bayesopt → core/bayesopt}/__init__.py +0 -0
- /ins_pricing/{modelling/tests → tests/modelling}/conftest.py +0 -0
- /ins_pricing/{modelling/tests → tests/modelling}/test_cross_val_generic.py +0 -0
- /ins_pricing/{modelling/tests → tests/modelling}/test_distributed_utils.py +0 -0
- /ins_pricing/{modelling/tests → tests/modelling}/test_explain.py +0 -0
- /ins_pricing/{modelling/tests → tests/modelling}/test_geo_tokens_split.py +0 -0
- /ins_pricing/{modelling/tests → tests/modelling}/test_graph_cache.py +0 -0
- /ins_pricing/{modelling/tests → tests/modelling}/test_plotting_library.py +0 -0
- /ins_pricing/{modelling/tests → tests/modelling}/test_preprocessor.py +0 -0
- {ins_pricing-0.1.11.dist-info → ins_pricing-0.2.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Callable, Dict, Optional
|
|
5
|
+
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
8
|
+
from ...production.monitoring import (
|
|
9
|
+
classification_metrics,
|
|
10
|
+
regression_metrics,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class CalibrationResult:
|
|
16
|
+
method: str
|
|
17
|
+
calibrator: Any
|
|
18
|
+
|
|
19
|
+
def predict(self, scores: np.ndarray) -> np.ndarray:
|
|
20
|
+
if self.method == "sigmoid":
|
|
21
|
+
return self.calibrator.predict_proba(scores.reshape(-1, 1))[:, 1]
|
|
22
|
+
return self.calibrator.transform(scores)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def select_threshold(
|
|
26
|
+
y_true: np.ndarray,
|
|
27
|
+
y_pred: np.ndarray,
|
|
28
|
+
*,
|
|
29
|
+
metric: str = "f1",
|
|
30
|
+
min_positive_rate: Optional[float] = None,
|
|
31
|
+
grid: int = 99,
|
|
32
|
+
) -> Dict[str, float]:
|
|
33
|
+
y_true = np.asarray(y_true, dtype=float).reshape(-1)
|
|
34
|
+
y_pred = np.asarray(y_pred, dtype=float).reshape(-1)
|
|
35
|
+
thresholds = np.linspace(0.01, 0.99, max(2, int(grid)))
|
|
36
|
+
best = {"threshold": 0.5, "score": -1.0}
|
|
37
|
+
for thr in thresholds:
|
|
38
|
+
pred_label = (y_pred >= thr).astype(float)
|
|
39
|
+
pos_rate = float(np.mean(pred_label))
|
|
40
|
+
if min_positive_rate is not None and pos_rate < float(min_positive_rate):
|
|
41
|
+
continue
|
|
42
|
+
metrics = classification_metrics(y_true, y_pred, threshold=float(thr))
|
|
43
|
+
precision = metrics.get("precision", 0.0)
|
|
44
|
+
recall = metrics.get("recall", 0.0)
|
|
45
|
+
f1 = 0.0 if (precision + recall) == 0 else 2 * precision * recall / (precision + recall)
|
|
46
|
+
score = f1 if metric == "f1" else metrics.get(metric, f1)
|
|
47
|
+
if score > best["score"]:
|
|
48
|
+
best = {"threshold": float(thr), "score": float(score)}
|
|
49
|
+
return best
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def calibrate_predictions(
|
|
53
|
+
y_true: np.ndarray,
|
|
54
|
+
y_pred: np.ndarray,
|
|
55
|
+
*,
|
|
56
|
+
method: str = "sigmoid",
|
|
57
|
+
) -> CalibrationResult:
|
|
58
|
+
from sklearn.isotonic import IsotonicRegression
|
|
59
|
+
from sklearn.linear_model import LogisticRegression
|
|
60
|
+
|
|
61
|
+
y_true = np.asarray(y_true, dtype=float).reshape(-1)
|
|
62
|
+
y_pred = np.asarray(y_pred, dtype=float).reshape(-1)
|
|
63
|
+
method = str(method or "sigmoid").strip().lower()
|
|
64
|
+
if method in {"platt", "sigmoid", "logistic"}:
|
|
65
|
+
model = LogisticRegression(max_iter=200)
|
|
66
|
+
model.fit(y_pred.reshape(-1, 1), y_true)
|
|
67
|
+
return CalibrationResult(method="sigmoid", calibrator=model)
|
|
68
|
+
if method in {"isotonic"}:
|
|
69
|
+
model = IsotonicRegression(out_of_bounds="clip")
|
|
70
|
+
model.fit(y_pred, y_true)
|
|
71
|
+
return CalibrationResult(method="isotonic", calibrator=model)
|
|
72
|
+
raise ValueError(f"Unsupported calibration method: {method}")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def bootstrap_ci(
|
|
76
|
+
metric_fn: Callable[[np.ndarray, np.ndarray, Optional[np.ndarray]], float],
|
|
77
|
+
y_true: np.ndarray,
|
|
78
|
+
y_pred: np.ndarray,
|
|
79
|
+
*,
|
|
80
|
+
weight: Optional[np.ndarray] = None,
|
|
81
|
+
n_samples: int = 200,
|
|
82
|
+
ci: float = 0.95,
|
|
83
|
+
seed: Optional[int] = None,
|
|
84
|
+
) -> Dict[str, float]:
|
|
85
|
+
rng = np.random.default_rng(seed)
|
|
86
|
+
y_true = np.asarray(y_true).reshape(-1)
|
|
87
|
+
y_pred = np.asarray(y_pred).reshape(-1)
|
|
88
|
+
if weight is not None:
|
|
89
|
+
weight = np.asarray(weight).reshape(-1)
|
|
90
|
+
n = len(y_true)
|
|
91
|
+
stats = []
|
|
92
|
+
for _ in range(max(1, int(n_samples))):
|
|
93
|
+
idx = rng.integers(0, n, size=n)
|
|
94
|
+
y_t = y_true[idx]
|
|
95
|
+
y_p = y_pred[idx]
|
|
96
|
+
w_t = weight[idx] if weight is not None else None
|
|
97
|
+
stats.append(float(metric_fn(y_t, y_p, w_t)))
|
|
98
|
+
stats = np.asarray(stats, dtype=float)
|
|
99
|
+
alpha = (1.0 - float(ci)) / 2.0
|
|
100
|
+
low = float(np.quantile(stats, alpha))
|
|
101
|
+
high = float(np.quantile(stats, 1.0 - alpha))
|
|
102
|
+
return {"mean": float(np.mean(stats)), "low": low, "high": high}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def metrics_report(
|
|
106
|
+
y_true: np.ndarray,
|
|
107
|
+
y_pred: np.ndarray,
|
|
108
|
+
*,
|
|
109
|
+
task_type: str,
|
|
110
|
+
weight: Optional[np.ndarray] = None,
|
|
111
|
+
threshold: float = 0.5,
|
|
112
|
+
) -> Dict[str, float]:
|
|
113
|
+
if str(task_type) == "classification":
|
|
114
|
+
return classification_metrics(y_true, y_pred, threshold=threshold)
|
|
115
|
+
return regression_metrics(y_true, y_pred, weight=weight)
|
|
@@ -9,6 +9,7 @@ from .monitoring import (
|
|
|
9
9
|
regression_metrics,
|
|
10
10
|
)
|
|
11
11
|
from .scoring import batch_score
|
|
12
|
+
from .preprocess import apply_preprocess_artifacts, load_preprocess_artifacts, prepare_raw_features
|
|
12
13
|
|
|
13
14
|
__all__ = [
|
|
14
15
|
"psi_report",
|
|
@@ -18,4 +19,7 @@ __all__ = [
|
|
|
18
19
|
"metrics_report",
|
|
19
20
|
"regression_metrics",
|
|
20
21
|
"batch_score",
|
|
22
|
+
"apply_preprocess_artifacts",
|
|
23
|
+
"load_preprocess_artifacts",
|
|
24
|
+
"prepare_raw_features",
|
|
21
25
|
]
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Any, Dict
|
|
6
|
+
|
|
7
|
+
import pandas as pd
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def load_preprocess_artifacts(path: str | Path) -> Dict[str, Any]:
|
|
11
|
+
artifact_path = Path(path)
|
|
12
|
+
payload = json.loads(artifact_path.read_text(encoding="utf-8", errors="replace"))
|
|
13
|
+
if not isinstance(payload, dict):
|
|
14
|
+
raise ValueError(f"Invalid preprocess artifact: {artifact_path}")
|
|
15
|
+
return payload
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def prepare_raw_features(df: pd.DataFrame, artifacts: Dict[str, Any]) -> pd.DataFrame:
|
|
19
|
+
factor_nmes = list(artifacts.get("factor_nmes") or [])
|
|
20
|
+
cate_list = list(artifacts.get("cate_list") or [])
|
|
21
|
+
num_features = set(artifacts.get("num_features") or [])
|
|
22
|
+
cat_categories = artifacts.get("cat_categories") or {}
|
|
23
|
+
|
|
24
|
+
work = df.copy()
|
|
25
|
+
for col in factor_nmes:
|
|
26
|
+
if col not in work.columns:
|
|
27
|
+
work[col] = pd.NA
|
|
28
|
+
|
|
29
|
+
for col in factor_nmes:
|
|
30
|
+
if col in num_features:
|
|
31
|
+
work[col] = pd.to_numeric(work[col], errors="coerce").fillna(0)
|
|
32
|
+
else:
|
|
33
|
+
series = work[col].astype("object").fillna("<NA>")
|
|
34
|
+
cats = cat_categories.get(col)
|
|
35
|
+
if isinstance(cats, list) and cats:
|
|
36
|
+
series = pd.Categorical(series, categories=cats)
|
|
37
|
+
work[col] = series
|
|
38
|
+
|
|
39
|
+
if factor_nmes:
|
|
40
|
+
work = work[factor_nmes]
|
|
41
|
+
return work
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def apply_preprocess_artifacts(df: pd.DataFrame, artifacts: Dict[str, Any]) -> pd.DataFrame:
|
|
45
|
+
cate_list = list(artifacts.get("cate_list") or [])
|
|
46
|
+
num_features = list(artifacts.get("num_features") or [])
|
|
47
|
+
var_nmes = list(artifacts.get("var_nmes") or [])
|
|
48
|
+
numeric_scalers = artifacts.get("numeric_scalers") or {}
|
|
49
|
+
drop_first = bool(artifacts.get("drop_first", True))
|
|
50
|
+
|
|
51
|
+
work = prepare_raw_features(df, artifacts)
|
|
52
|
+
oht = pd.get_dummies(
|
|
53
|
+
work,
|
|
54
|
+
columns=cate_list,
|
|
55
|
+
drop_first=drop_first,
|
|
56
|
+
dtype="int8",
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
for col in num_features:
|
|
60
|
+
if col not in oht.columns:
|
|
61
|
+
continue
|
|
62
|
+
stats = numeric_scalers.get(col) or {}
|
|
63
|
+
mean = float(stats.get("mean", 0.0))
|
|
64
|
+
scale = float(stats.get("scale", 1.0))
|
|
65
|
+
if scale == 0.0:
|
|
66
|
+
scale = 1.0
|
|
67
|
+
oht[col] = (oht[col] - mean) / scale
|
|
68
|
+
|
|
69
|
+
if var_nmes:
|
|
70
|
+
oht = oht.reindex(columns=var_nmes, fill_value=0)
|
|
71
|
+
return oht
|
ins_pricing/setup.py
CHANGED
|
@@ -2,8 +2,14 @@ from setuptools import setup, find_packages
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
def _discover_packages() -> list[str]:
|
|
5
|
-
root_packages = [
|
|
6
|
-
|
|
5
|
+
root_packages = [
|
|
6
|
+
"cli",
|
|
7
|
+
"modelling",
|
|
8
|
+
"pricing",
|
|
9
|
+
"production",
|
|
10
|
+
"governance",
|
|
11
|
+
"reporting",
|
|
12
|
+
]
|
|
7
13
|
packages = ["ins_pricing"]
|
|
8
14
|
for root in root_packages:
|
|
9
15
|
found = find_packages(where=".", include=[root, f"{root}.*"])
|
|
@@ -14,7 +20,7 @@ def _discover_packages() -> list[str]:
|
|
|
14
20
|
|
|
15
21
|
setup(
|
|
16
22
|
name="Ins-Pricing",
|
|
17
|
-
version="0.
|
|
23
|
+
version="0.2.0",
|
|
18
24
|
description="Reusable modelling, pricing, governance, and reporting utilities.",
|
|
19
25
|
author="meishi125478",
|
|
20
26
|
license="Proprietary",
|
|
@@ -69,6 +75,5 @@ setup(
|
|
|
69
75
|
},
|
|
70
76
|
include_package_data=True,
|
|
71
77
|
package_data={"ins_pricing": ["**/*.json", "**/*.md"]},
|
|
72
|
-
exclude_package_data={"ins_pricing": [
|
|
73
|
-
"modelling/demo/*", "modelling/demo/**/*"]},
|
|
78
|
+
exclude_package_data={"ins_pricing": ["examples/*", "examples/**/*"]},
|
|
74
79
|
)
|
|
@@ -56,8 +56,8 @@ def test_plotting_outputs(tmp_path, monkeypatch):
|
|
|
56
56
|
model.plot_lift("Xgboost", "pred_xgb", n_bins=5)
|
|
57
57
|
model.plot_dlift(["xgb", "resn"], n_bins=5)
|
|
58
58
|
|
|
59
|
-
lift_path = tmp_path / "plot" / "01_demo_Xgboost_lift.png"
|
|
60
|
-
dlift_path = tmp_path / "plot" / "02_demo_dlift_xgb_vs_resn.png"
|
|
59
|
+
lift_path = tmp_path / "plot" / "demo" / "lift" / "01_demo_Xgboost_lift.png"
|
|
60
|
+
dlift_path = tmp_path / "plot" / "demo" / "double_lift" / "02_demo_dlift_xgb_vs_resn.png"
|
|
61
61
|
|
|
62
62
|
assert lift_path.exists()
|
|
63
63
|
assert dlift_path.exists()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ins_pricing
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Reusable modelling, pricing, governance, and reporting utilities.
|
|
5
5
|
Author: meishi125478
|
|
6
6
|
License: Proprietary
|
|
@@ -64,7 +64,7 @@ This repository contains risk modeling and optimization notebooks, scripts, and
|
|
|
64
64
|
- `ins_pricing/`: reusable training framework and CLI tools (BayesOpt subpackage)
|
|
65
65
|
- `user_packages legacy/`: historical snapshot
|
|
66
66
|
|
|
67
|
-
Note: `ins_pricing/modelling/
|
|
67
|
+
Note: `ins_pricing/modelling/examples/` is kept in the repo only and is not shipped in the PyPI package.
|
|
68
68
|
|
|
69
69
|
## Quickstart
|
|
70
70
|
|
|
@@ -84,8 +84,8 @@ jupyter lab
|
|
|
84
84
|
|
|
85
85
|
## BayesOpt entry points
|
|
86
86
|
|
|
87
|
-
- CLI batch training: `python ins_pricing/modelling/BayesOpt_entry.py --config-json <path>`
|
|
88
|
-
- Incremental training: `python ins_pricing/modelling/BayesOpt_incremental.py --config-json <path>`
|
|
87
|
+
- CLI batch training: `python ins_pricing/modelling/cli/BayesOpt_entry.py --config-json <path>`
|
|
88
|
+
- Incremental training: `python ins_pricing/modelling/cli/BayesOpt_incremental.py --config-json <path>`
|
|
89
89
|
- Python API: `from ins_pricing.modelling import BayesOptModel`
|
|
90
90
|
|
|
91
91
|
## Tests
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
ins_pricing/README.md,sha256=pMOO1cU06oBfvm5d8gvAsQsJr9bfb6AKdpXlrx0AAxw,2727
|
|
2
|
+
ins_pricing/__init__.py,sha256=46j1wCdLVrgrofeBwKl-3NXTxzjbTv-w3KjW-dyKGiY,2622
|
|
3
|
+
ins_pricing/setup.py,sha256=3bVzoJNkDzEfAn_g74gsDfe6c6DceamO9U-EaLiBmyY,2054
|
|
4
|
+
ins_pricing/cli/BayesOpt_entry.py,sha256=X3AiNQQh5ARcjVMM2vOKWPYPDIId40n_RPZA76pTGl4,558
|
|
5
|
+
ins_pricing/cli/BayesOpt_incremental.py,sha256=_Klr5vvNoq_TbgwrH_T3f0a6cHmA9iVJMViiji6ahJY,35927
|
|
6
|
+
ins_pricing/cli/Explain_Run.py,sha256=gEPQjqHiXyXlCTKjUzwSvbAn5_h74ABgb_sEGs-YHVE,664
|
|
7
|
+
ins_pricing/cli/Explain_entry.py,sha256=PP6j4uQspmettCk21lhh9L9jurDwZfWXGxS2EBUZpMs,23191
|
|
8
|
+
ins_pricing/cli/Pricing_Run.py,sha256=qZribQ_ku4NK4oIvlrLJdM-jyyKtIUoCbbvo8Wh_RQ4,711
|
|
9
|
+
ins_pricing/cli/__init__.py,sha256=F296f1J_tBPv33lDJQ6LaN_CPwMJTMtOuTsMof0dr2o,50
|
|
10
|
+
ins_pricing/cli/bayesopt_entry_runner.py,sha256=GIbvR-793BMfDXDQztfHZnHS7r01XZTh76lVtfrB1H4,51586
|
|
11
|
+
ins_pricing/cli/watchdog_run.py,sha256=ehUkN9VqsQkxc6YC_WLanU6Pu-ers-nvPEtCaJ9UsgY,6188
|
|
12
|
+
ins_pricing/cli/utils/__init__.py,sha256=u3kt1B27OiuOEgw6PQN-fNs9vNiAjdPyybsRQsZkM_I,54
|
|
13
|
+
ins_pricing/cli/utils/cli_common.py,sha256=mA5UysII-xTzh-3u5N3CV4M6nF0I6MfKioG4AvLaQO8,10170
|
|
14
|
+
ins_pricing/cli/utils/cli_config.py,sha256=TC8fR1XdQIbaojbeac7dESj7TmCKSfpZTbLvJrkJLEY,13247
|
|
15
|
+
ins_pricing/cli/utils/notebook_utils.py,sha256=qffnR84JVDjcsesWjGwnmJ4gyNhW0WhROnvISnWTT1s,11987
|
|
16
|
+
ins_pricing/cli/utils/run_logging.py,sha256=V3Wh2EV6c1Mo0QTvfe4hl2J4LOR6bdQsT210o__YBWk,3677
|
|
17
|
+
ins_pricing/docs/modelling/BayesOpt_USAGE.md,sha256=kPhaIhRSS4SkbIYjaJ1f3dVfXWqNIWKi0BgUU5QQEqc,40560
|
|
18
|
+
ins_pricing/docs/modelling/README.md,sha256=2a7m1dBnacxBKjEV9k16Qj9IPstlwwuis1QxdsMrFmA,1976
|
|
19
|
+
ins_pricing/governance/README.md,sha256=XnXLS5RPzWhEiicJ3WtGmpN935jppHhPftA9Lo2DPnQ,511
|
|
20
|
+
ins_pricing/governance/__init__.py,sha256=d8tiDhOvHvAvgSohY1xv0vuEeHj8Gl1apQtw7ryEKM0,517
|
|
21
|
+
ins_pricing/governance/approval.py,sha256=cjJQjU1ziR-d-9wVSXyMyX6S5zijJqDWERZNxjqGAUE,2879
|
|
22
|
+
ins_pricing/governance/audit.py,sha256=f0aw-LaOxH5NGzxwczeLrGMJcxO-JDRn99BpI55KRn4,1040
|
|
23
|
+
ins_pricing/governance/registry.py,sha256=2uxQL6qMGY5IYWJti9MpaV_auvL--piJaasFrX20ghk,3139
|
|
24
|
+
ins_pricing/governance/release.py,sha256=ltyFIdeKbwj9fnEDxcQCURaQ5Zc_j0mqXFPNunmX_NQ,4743
|
|
25
|
+
ins_pricing/modelling/__init__.py,sha256=0tiXRE3rAwSxHT0dSaosWf_vGd7FpRA_kHW6dclr4PA,2710
|
|
26
|
+
ins_pricing/modelling/core/BayesOpt.py,sha256=i2tB3c6EeucjKAsHyicGDNU7DVVCTihg-TgSoM1y18E,3332
|
|
27
|
+
ins_pricing/modelling/core/__init__.py,sha256=bF5OWfK_mfg5P2oz2jid3MGi9uA13fpqKK-DbPkuci0,54
|
|
28
|
+
ins_pricing/modelling/core/evaluation.py,sha256=wEMWdzs12vPnDo5t183ORMDA6APuc5g6g9Uyfd6GVi8,3905
|
|
29
|
+
ins_pricing/modelling/core/bayesopt/__init__.py,sha256=5WGZeQI9B1P9OXQUgq7XogcjAbv2oXnp076bW16e_ss,1955
|
|
30
|
+
ins_pricing/modelling/core/bayesopt/config_preprocess.py,sha256=3p2dMSYfTRbm0Qa7PDCVje_cYsfsIDunNEI10kfaPOE,14755
|
|
31
|
+
ins_pricing/modelling/core/bayesopt/core.py,sha256=wzTkenn9XpSIc-hdyRYcgMcXU8dGyUzF0ae9xzunTO0,40894
|
|
32
|
+
ins_pricing/modelling/core/bayesopt/model_explain_mixin.py,sha256=jCk1zPpwgwBBCndaq-A0_cQnc4RHueh2p5cAuE9ArTo,11620
|
|
33
|
+
ins_pricing/modelling/core/bayesopt/model_plotting_mixin.py,sha256=lD0rUvWV4eWatmTzMrmAUm2Flj8uAOa3R9S2JyYV94k,21807
|
|
34
|
+
ins_pricing/modelling/core/bayesopt/utils.py,sha256=GLXDPUndyvqxQRJHpkvc2ZtUlQcewZ2FXO799HDDWPA,41817
|
|
35
|
+
ins_pricing/modelling/core/bayesopt/models/__init__.py,sha256=vFFCkGnO6rm50TbxR6QekKKQjq-NW4UFwog6fng8-p8,700
|
|
36
|
+
ins_pricing/modelling/core/bayesopt/models/model_ft_components.py,sha256=0I0NiDf1D3cOhTRQwatsNTw9Julmxv5v3HZV8fTrvcQ,10989
|
|
37
|
+
ins_pricing/modelling/core/bayesopt/models/model_ft_trainer.py,sha256=VQ3Xe3O5Crqq_5qD2on3lPNxtlBNIAvbNjIcYPikbJo,35835
|
|
38
|
+
ins_pricing/modelling/core/bayesopt/models/model_gnn.py,sha256=l_oIgLeTJndfYR8lpZbqUq0MKH6wReE2z1B8n1E0P8k,28095
|
|
39
|
+
ins_pricing/modelling/core/bayesopt/models/model_resn.py,sha256=iHfL0rmMOM3XfzZF5f03xZ8MLX7aKXcGNPsXqNxXDBI,16959
|
|
40
|
+
ins_pricing/modelling/core/bayesopt/trainers/__init__.py,sha256=ODYKjT-v4IDxu4ohGLCXY8r1-pMME9LAaNx6pmj5_38,481
|
|
41
|
+
ins_pricing/modelling/core/bayesopt/trainers/trainer_base.py,sha256=9oh7xDCXQ3PcHQYnEO0J9pwNV3gqmQtVpv6ugS8JAKU,43676
|
|
42
|
+
ins_pricing/modelling/core/bayesopt/trainers/trainer_ft.py,sha256=jkafhvfEqIV_PYJ90e8kkOXVGvFpCKS0CRSKLvQ_elQ,34730
|
|
43
|
+
ins_pricing/modelling/core/bayesopt/trainers/trainer_glm.py,sha256=wVU6F2Ubyu3IxP6K-epjkUTGOE8gKPCdpVxGW-JP9rM,7806
|
|
44
|
+
ins_pricing/modelling/core/bayesopt/trainers/trainer_gnn.py,sha256=Tq-jBMC3boPS7_O6YIl3NxYW86Cs5aczy80QudjwOh4,12750
|
|
45
|
+
ins_pricing/modelling/core/bayesopt/trainers/trainer_resn.py,sha256=17d3cGZFcSjV7zv2AI213Aq5RIpilIqePN1KHVHhcz4,10860
|
|
46
|
+
ins_pricing/modelling/core/bayesopt/trainers/trainer_xgb.py,sha256=Ha3PtkB7AedlnRwWEfIBTEAPO69LY5lnjUrdGNL-yas,13783
|
|
47
|
+
ins_pricing/modelling/explain/__init__.py,sha256=CPoGzGu8TTO3FOXjxoXC13VkuIDCf3YTH6L3BqJq3Ok,1171
|
|
48
|
+
ins_pricing/modelling/explain/gradients.py,sha256=9TqCws_p49nFxVMcjVxe4KCZ7frezeL0uV_LCdoM5yo,11088
|
|
49
|
+
ins_pricing/modelling/explain/metrics.py,sha256=K_xOY7ZrHWhbJ79RNB7eXN3VXeTe8vq68ZLH2BlZufA,5389
|
|
50
|
+
ins_pricing/modelling/explain/permutation.py,sha256=YErQQtCbYzv3AbaWgOb3vvrUBRgjA-_iTZrJPBFGnxU,5616
|
|
51
|
+
ins_pricing/modelling/explain/shap_utils.py,sha256=IkijzxBeawyDIXiVxUUkvcC0MrHnttSKsMYOjM-wt-k,4353
|
|
52
|
+
ins_pricing/modelling/plotting/__init__.py,sha256=BBQKcE7IYUYObFrjpSnfNS6rmzc80Lae7oEqxKz-vEk,1058
|
|
53
|
+
ins_pricing/modelling/plotting/common.py,sha256=_kFq7JMA0LnKIp4bqAFvr-24VaHjj9pegDMm1qP9_7Y,1439
|
|
54
|
+
ins_pricing/modelling/plotting/curves.py,sha256=hGjpuALDwO0wDyWkIsBHZ4rqDGwPnkNdDZCIdgLW4II,18419
|
|
55
|
+
ins_pricing/modelling/plotting/diagnostics.py,sha256=AlkBtHuezRoDgMeXm56A1bK6Kn0rWOBy4Uts_xOocrs,5164
|
|
56
|
+
ins_pricing/modelling/plotting/geo.py,sha256=sRJTYOcAphNFM-oww4qbw9MoZneBCJtur96sYuqSNkw,11009
|
|
57
|
+
ins_pricing/modelling/plotting/importance.py,sha256=xs3l9uW_rCrakoA__fanIph6DK2jN_DugsKASAzteJU,3666
|
|
58
|
+
ins_pricing/pricing/README.md,sha256=PEcyw5oDkqJHOqnNdzBdbbpZwG4SOlnhMwY-owwQ0GI,1064
|
|
59
|
+
ins_pricing/pricing/__init__.py,sha256=XFplK3zkxPyNQZJd1Gn6_VvpwHLedMqxAd_Vn9tqsTE,881
|
|
60
|
+
ins_pricing/pricing/calibration.py,sha256=9j_kDW5Fxb9weDMaaRJE0QjAhT98lL0Ifhls6VIRnY0,1158
|
|
61
|
+
ins_pricing/pricing/data_quality.py,sha256=8FecBE60cABsTZE7HETuoKCEOXIrirGAFgg5wQCZrmU,4043
|
|
62
|
+
ins_pricing/pricing/exposure.py,sha256=rw8kKZ_1QdeGTCm13ck9NXrRBPt6TunxRw2s_qkHYkg,2575
|
|
63
|
+
ins_pricing/pricing/factors.py,sha256=RqZRXvW70rKkTIOxtK4MGeyDD3PrOFJ19hVc6rLYFzQ,2937
|
|
64
|
+
ins_pricing/pricing/monitoring.py,sha256=sGkPICaBYYwZPKGJtIeg6aURGs0dLhCBNudCTFeh3R4,3271
|
|
65
|
+
ins_pricing/pricing/rate_table.py,sha256=llDW95i7gR6cCtGFwcGqgpgFvOOPCURaJWmuQw1oce8,2473
|
|
66
|
+
ins_pricing/production/__init__.py,sha256=OwYswuTwZIM7st_wWpMUtVv6csKTZnaHbO6ij5KejVs,598
|
|
67
|
+
ins_pricing/production/drift.py,sha256=PwJk6dde9AEn-59PvF62f3_b3fQk4yeG5SQCh8F-c_A,774
|
|
68
|
+
ins_pricing/production/monitoring.py,sha256=A6Hyc5WSKhFkDZOIrqmFteuDee75CdcwdTq644vrk-U,4836
|
|
69
|
+
ins_pricing/production/preprocess.py,sha256=R_QVbzjppF5XJtRJG3v3NWL0PdMS3rDn0-VETzUnkJI,2315
|
|
70
|
+
ins_pricing/production/scoring.py,sha256=yFmMmbYb7w_RC4uZOCMnAjLMRcjXQWIuT1nsfu-bwuc,1379
|
|
71
|
+
ins_pricing/reporting/README.md,sha256=kTVdB6pNewwh1HlCHrI2SzWTgprtQoQprLRQ2qLdgNA,486
|
|
72
|
+
ins_pricing/reporting/__init__.py,sha256=Se5Cdomv9_RwkIDizkw1yx4iCMcjhjTHb4pZK6K895c,242
|
|
73
|
+
ins_pricing/reporting/report_builder.py,sha256=53ZFqGUx2isAoigT5IDwvXkek67zN7-6IgKeGpJhO7c,2241
|
|
74
|
+
ins_pricing/reporting/scheduler.py,sha256=9koG_1cmWvLqrS66uzMJuAlYI2VTkynV19ssB2TtcKU,1336
|
|
75
|
+
ins_pricing/tests/modelling/conftest.py,sha256=0KUXnkTgIGEIsf0J4uzIx5Kq4JkDyFo81Mv0qvIzW9k,180
|
|
76
|
+
ins_pricing/tests/modelling/test_cross_val_generic.py,sha256=iLZOFmdyrycB15lFWoQphkFlEjzZTozQXTLVOHLw2Qg,1721
|
|
77
|
+
ins_pricing/tests/modelling/test_distributed_utils.py,sha256=9cStpDw7jPdQwmm0Po-G2tB04uzSR1CoOUZMLuB61yI,466
|
|
78
|
+
ins_pricing/tests/modelling/test_explain.py,sha256=NZqKYuL-eSf9eC5ttjcMirfOc48ORMXZQm5PjmYk4jY,1445
|
|
79
|
+
ins_pricing/tests/modelling/test_geo_tokens_split.py,sha256=Ti57IynKB0aWOosr0g2RcZlDZyZC012XZ-hm6tWXBJg,1554
|
|
80
|
+
ins_pricing/tests/modelling/test_graph_cache.py,sha256=QEI5cLLtQ9_zwRR50KqUf8qxo9Jcp1WLxIGs4dSoMNk,821
|
|
81
|
+
ins_pricing/tests/modelling/test_plotting.py,sha256=4gJax72l40fQrjyJQLOgUmaT6xn6zXpujEaFNeHVwGw,1911
|
|
82
|
+
ins_pricing/tests/modelling/test_plotting_library.py,sha256=SB5RjKTaPydK848V0xpqEaJtEWhRv6ZfnHmnnzjaPh4,4079
|
|
83
|
+
ins_pricing/tests/modelling/test_preprocessor.py,sha256=FqbKltV803Pd-ZY1xBc4XF1T-INDuUliaVcMIDPmBxI,1438
|
|
84
|
+
user_packages/__init__.py,sha256=2A4JJiIriqlBBQf-ssnV40BMEY_MW07x01v5fVZLEPI,3217
|
|
85
|
+
user_packages legacy/BayesOpt.py,sha256=T8gisEsAWDOB0Pt-fGnH1GsEyGPKBYK2cBjlGbFC6bk,240270
|
|
86
|
+
user_packages legacy/BayesOpt_entry.py,sha256=xOy8mFNk5jIrR_qTKqVV-BEt9zm9UA4lzu52Mm4E7ik,19123
|
|
87
|
+
user_packages legacy/BayesOpt_incremental.py,sha256=Br291-4UrkQ6du2MU8iEguSFJ170cNjT2Gx-gUVCQgk,26699
|
|
88
|
+
user_packages legacy/Pricing_Run.py,sha256=iRJlW0Nr7lq594x_zhzfIK3duFrn92V1Cbug7hyrB2M,1011
|
|
89
|
+
user_packages legacy/__init__.py,sha256=_fuBWcyZWl6fPOClsZH_lvDhFIOWFzvnuA8Drp05txc,370
|
|
90
|
+
user_packages legacy/cli_common.py,sha256=U5vgmoedlZiSMVGt2rDjKEl_ge6hg3EIHwnkHgV0rdk,3963
|
|
91
|
+
user_packages legacy/notebook_utils.py,sha256=Jx9271qsdMUnWi0ep1zM6PqMYVjRiQtnJJo-h-HsoM0,8483
|
|
92
|
+
user_packages legacy/watchdog_run.py,sha256=8uI0tVtU3r1bnFgED5eg-ZOBBYKV9_qCrBWlQRHSuAM,5813
|
|
93
|
+
user_packages legacy/Try/BayesOpt Legacy251213.py,sha256=YAr6bnt58mh5Z6AfXsWjL7fyANmrLbxa6V3dacGQn5o,155961
|
|
94
|
+
user_packages legacy/Try/BayesOpt Legacy251215.py,sha256=R2mjaTONhI23lP2WmKu0axoFSynh0wZMeUoycpuD_Rw,155164
|
|
95
|
+
user_packages legacy/Try/BayesOpt lagecy251201.py,sha256=Gc6guUXudWvT6GxSbLw7P6Xu2vrtzuLTne3YskQ4O5U,145225
|
|
96
|
+
user_packages legacy/Try/BayesOpt lagecy251218.py,sha256=ZY6mShf05q1Ex1lGJZwBfoegFvHrM61ZF8an2j024Kk,165573
|
|
97
|
+
user_packages legacy/Try/BayesOpt legacy.py,sha256=NM9-oGwePnOo7tn9EUZM_Hf_irK9fEe5PEfsGrG3Cw4,132232
|
|
98
|
+
user_packages legacy/Try/BayesOpt.py,sha256=JDJq3KFA_Q7G2qvI4hlXB5wXnXrL6Pr_wb7nLQhiB8c,35210
|
|
99
|
+
user_packages legacy/Try/BayesOptAll.py,sha256=EkAL57wef53DLRCKOpniB4fy4tE-I-sKz9zjt4_X_bU,60324
|
|
100
|
+
user_packages legacy/Try/BayesOptAllPlatform.py,sha256=gMlOCwhWUATyzRcuqHReX9GuF_c-s0UH5Zl3xbHOkG4,37932
|
|
101
|
+
user_packages legacy/Try/BayesOptCPUGPU.py,sha256=xZnVo7l98Z0QC3sxrbw2SYYVXwml9TCz9rmt8a3t1YQ,71388
|
|
102
|
+
user_packages legacy/Try/BayesOptSearch.py,sha256=JwnPBCzLIUFVyJWHisTTfv1VPWXgK0izzyw6jgnREgU,35260
|
|
103
|
+
user_packages legacy/Try/BayesOptSearchOrigin.py,sha256=dgEoAUhEQBaSXcf6MzIwwJ29QatQvyhGY_S3sP0w6Js,35270
|
|
104
|
+
user_packages legacy/Try/BayesOptV1.py,sha256=sBRR9DhKlMB6IGtpVcx_HXpMbaU5BlgdulV8OhI2LaI,72794
|
|
105
|
+
user_packages legacy/Try/BayesOptV10.py,sha256=rqLgRZ9dYuCuCsH4so-cwPFhCFp7iPcjVhX6kST7AG4,119129
|
|
106
|
+
user_packages legacy/Try/BayesOptV11.py,sha256=2Un-ezvXwSgsefB_2-4ZJumazyChJBAff21FJkyqe3w,120405
|
|
107
|
+
user_packages legacy/Try/BayesOptV12.py,sha256=D1k-2R-GTAdHrOpD9t7VrjSKsAKWx4rc_k_mT0a13Ls,120417
|
|
108
|
+
user_packages legacy/Try/BayesOptV2.py,sha256=RkcHVE6whi63tatiV1wRF25LYPiYll9kWUmYACuHqR0,79754
|
|
109
|
+
user_packages legacy/Try/BayesOptV3.py,sha256=1Jdyc_CyUTHKeI_3NE3tCrbWe849eToublYsaqVzXg0,83634
|
|
110
|
+
user_packages legacy/Try/BayesOptV4.py,sha256=mcp4MeouEhc85WouvvljRMH40eetlvPw0TEJQ6IMjwA,89606
|
|
111
|
+
user_packages legacy/Try/BayesOptV5.py,sha256=eU5n6m9-A5Qph86Bv42oy3IcfF6di8EaFoc9fyf5gaY,90449
|
|
112
|
+
user_packages legacy/Try/BayesOptV6.py,sha256=rwvCb_HKoXREj7kcrvS5PRzI2-WyqW2tVDiUw9alIQo,106994
|
|
113
|
+
user_packages legacy/Try/BayesOptV7.py,sha256=EncqnYSmdGjyPKuqzpBprfuliZQBMyCVanSltHm5wqc,110011
|
|
114
|
+
user_packages legacy/Try/BayesOptV8Codex.py,sha256=9q_1hkSQYXlms_wHkdePQ_EJyXTAEIHbmN6AfYK8MBE,106975
|
|
115
|
+
user_packages legacy/Try/BayesOptV8Gemini.py,sha256=zNohNNKGEGTwi5Kw-p4JiY-1cJQKGF9sIv0f_Qu0xd8,105429
|
|
116
|
+
user_packages legacy/Try/BayesOptV9.py,sha256=17iUm9ogxh2vH1rJI5UH2Czkcv1bH-Cd4uJ-devpO1c,117273
|
|
117
|
+
user_packages legacy/Try/BayesOpt_entry legacy.py,sha256=vFd8nY73HAQVGGsfyjemXsv6Vzt3vji1dHBuCSfKbI0,10163
|
|
118
|
+
user_packages legacy/Try/ModelBayesOptSearch.py,sha256=Co--dkbKxqpl-2tP9zEYmcEosYtOrAxarypNi2svVoc,16772
|
|
119
|
+
user_packages legacy/Try/ResNetBayesOptSearch.py,sha256=mp38lBs-TE3lAc8t8o4He5y1iwGIgrlPerurh_xRmqs,10942
|
|
120
|
+
user_packages legacy/Try/XgbBayesOptSearch.py,sha256=pWjlyT5FSK4zNnng0ZrpTIF5o-wBwuavxFA0LE4B4oE,5534
|
|
121
|
+
user_packages legacy/Try/xgbbayesopt.py,sha256=Vow-wrxcwozbTDPKJcl3ZzYgShd-4oks5Kzs74kXUvA,22754
|
|
122
|
+
ins_pricing-0.2.0.dist-info/METADATA,sha256=MoJ90yswRwarm1mYUUp-0u4T7OXF_csr7yi2IczJ5gU,3662
|
|
123
|
+
ins_pricing-0.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
124
|
+
ins_pricing-0.2.0.dist-info/top_level.txt,sha256=0YCsk9wIhiYvSJw2owsQhKj7PBX5nvPsqbv-CpXqJPU,47
|
|
125
|
+
ins_pricing-0.2.0.dist-info/RECORD,,
|