SuperModelingFactory 0.3.2__tar.gz → 0.3.3__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 (104) hide show
  1. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/WOE_Monotone_Binner.py +71 -31
  2. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/__init__.py +1 -1
  3. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/PKG-INFO +2 -2
  4. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/README.md +1 -1
  5. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/SuperModelingFactory.egg-info/PKG-INFO +2 -2
  6. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/pyproject.toml +1 -1
  7. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/setup.py +1 -1
  8. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/ExcelMaster/ExcelFormatTool.py +0 -0
  9. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/ExcelMaster/ExcelMaster.py +0 -0
  10. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/ExcelMaster/Template.py +0 -0
  11. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/ExcelMaster/Utility.py +0 -0
  12. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/ExcelMaster/__init__.py +0 -0
  13. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/LICENSE +0 -0
  14. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/MANIFEST.in +0 -0
  15. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/Binning_Tool.py +0 -0
  16. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/Binning_Tool.pyi +0 -0
  17. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/Check_DuckDB_Compatibility.py +0 -0
  18. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/Json_Data_Converter.py +0 -0
  19. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/Model_Registry_Tool.py +0 -0
  20. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/ODPS_Tool.py +0 -0
  21. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/Parallel_Engine.py +0 -0
  22. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/Parallel_ODPS_Manager.py +0 -0
  23. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/Proc_Compare.py +0 -0
  24. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/Slope_Tool.py +0 -0
  25. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/Slope_Tool.pyi +0 -0
  26. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/XOR_Encryptor.py +0 -0
  27. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/XOR_Encryptor.pyi +0 -0
  28. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/__init__.py +0 -0
  29. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/kDataFrame.py +0 -0
  30. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/kDataFrame.pyi +0 -0
  31. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/sample_weight_utils.py +0 -0
  32. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Core/utils.py +0 -0
  33. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Eval/Evaluation_Tool.py +0 -0
  34. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Eval/Evaluation_Tool.pyi +0 -0
  35. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Eval/Model_Eval_Tool.py +0 -0
  36. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Eval/Model_Eval_Tool.pyi +0 -0
  37. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Eval/__init__.py +0 -0
  38. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Eval/evaluate_model.py +0 -0
  39. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Eval/evaluate_model.pyi +0 -0
  40. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Eval/weighted_eval_utils.py +0 -0
  41. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Explainability/Coalition_Structure.py +0 -0
  42. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Explainability/Model_Explainer.py +0 -0
  43. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Explainability/__init__.py +0 -0
  44. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Feature/Distribution_Tool.py +0 -0
  45. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Feature/Distribution_Tool.pyi +0 -0
  46. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Feature/Feature_Insights.py +0 -0
  47. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Feature/Feature_Insights.pyi +0 -0
  48. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Feature/PSI_Tool.py +0 -0
  49. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Feature/PSI_Tool.pyi +0 -0
  50. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Feature/WOE_Engine_Feature_Patch.py +0 -0
  51. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Feature/__init__.py +0 -0
  52. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Model/Backward_Tool.py +0 -0
  53. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Model/Backward_Tool.pyi +0 -0
  54. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Model/GBM_Search_Tool.py +0 -0
  55. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Model/GBM_Tool.py +0 -0
  56. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Model/GBM_Tool.pyi +0 -0
  57. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Model/LRM_Tool.py +0 -0
  58. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Model/LRM_Tool.pyi +0 -0
  59. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Model/__init__.py +0 -0
  60. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Pipeline/__init__.py +0 -0
  61. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Pipeline/_common.py +0 -0
  62. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Pipeline/credit_model.py +0 -0
  63. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Pipeline/feature_validation.py +0 -0
  64. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Pipeline/mock_sample.py +0 -0
  65. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Pipeline/reject_inference.py +0 -0
  66. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Pipeline/sample_analysis.py +0 -0
  67. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Pipeline/score_comparison.py +0 -0
  68. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Pipeline/score_consistency_uat.py +0 -0
  69. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Sample/Distribution_Adaptation.py +0 -0
  70. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Sample/Distribution_Adaptation.pyi +0 -0
  71. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Sample/Reject_Infer.py +0 -0
  72. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Sample/Reject_Infer.pyi +0 -0
  73. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Sample/Sample_Split.py +0 -0
  74. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Sample/Sample_Split.pyi +0 -0
  75. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/Sample/__init__.py +0 -0
  76. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/UAT/UAT_Consistency_Checker.py +0 -0
  77. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/UAT/__init__.py +0 -0
  78. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/WOE_Adapter.py +0 -0
  79. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/WOE_Adapter.pyi +0 -0
  80. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/WOE_Master.py +0 -0
  81. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/WOE_Master.pyi +0 -0
  82. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/WOE_Monotone_Binner.pyi +0 -0
  83. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/WOE_Plot_Tool.py +0 -0
  84. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/WOE_Plot_Tool.pyi +0 -0
  85. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/WOE_Report_Builder.py +0 -0
  86. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/WOE_Report_Builder.pyi +0 -0
  87. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/WOE_Tool.py +0 -0
  88. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/WOE_Tool.pyi +0 -0
  89. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/__init__.py +0 -0
  90. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/plot_woe_tool.py +0 -0
  91. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/WOE/plot_woe_tool.pyi +0 -0
  92. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/ref_font/KaiTi.ttf +0 -0
  93. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/ref_font/WeiRuanYaHei.ttf +0 -0
  94. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/ref_font/__init__.py +0 -0
  95. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Modeling_Tool/ref_font/simsun.ttc +0 -0
  96. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Report/Report_Tool.py +0 -0
  97. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/Report/__init__.py +0 -0
  98. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/SuperModelingFactory.egg-info/SOURCES.txt +0 -0
  99. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/SuperModelingFactory.egg-info/dependency_links.txt +0 -0
  100. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/SuperModelingFactory.egg-info/not-zip-safe +0 -0
  101. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/SuperModelingFactory.egg-info/requires.txt +0 -0
  102. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/SuperModelingFactory.egg-info/top_level.txt +0 -0
  103. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/requirements.txt +0 -0
  104. {supermodelingfactory-0.3.2 → supermodelingfactory-0.3.3}/setup.cfg +0 -0
@@ -2129,45 +2129,85 @@ class MonotoneWOEBinner:
2129
2129
  # 整箱标签也登记一次(兜底;通常不会命中真实类别)
2130
2130
  if "bin_label" in wt.columns:
2131
2131
  cat_woe_map_str.setdefault(str(r["bin_label"]), woe_v)
2132
- nan_woe = sv_woe_map.get("__nan__", feat_missing_woe)
2133
-
2134
- def _get_cat_woe(val):
2135
- if val is None or (isinstance(val, float) and math.isnan(val)):
2136
- return nan_woe
2137
- if val in cat_woe_map:
2138
- return cat_woe_map[val]
2139
- sval = str(val)
2140
- if sval in cat_woe_map_str:
2141
- return cat_woe_map_str[sval]
2142
- # 训练时未见过的新类别 → 中性 missing_woe
2143
- return feat_missing_woe
2144
-
2145
- df[woe_col] = series.apply(_get_cat_woe).astype(float)
2132
+ nan_woe = float(sv_woe_map.get("__nan__", feat_missing_woe))
2133
+ missing_mask = series.isna()
2134
+ if cat_woe_map:
2135
+ mapped = series.map(cat_woe_map)
2136
+ else:
2137
+ mapped = pd.Series(np.nan, index=series.index, dtype=float)
2138
+
2139
+ fallback_mask = mapped.isna() & ~missing_mask
2140
+ if cat_woe_map_str and fallback_mask.any():
2141
+ mapped.loc[fallback_mask] = (
2142
+ series.loc[fallback_mask].astype(str).map(cat_woe_map_str)
2143
+ )
2144
+
2145
+ out = np.full(len(series), feat_missing_woe, dtype=float)
2146
+ missing_arr = missing_mask.to_numpy()
2147
+ if missing_arr.any():
2148
+ out[missing_arr] = nan_woe
2149
+ hit_arr = mapped.notna().to_numpy() & ~missing_arr
2150
+ if hit_arr.any():
2151
+ out[hit_arr] = mapped.to_numpy(dtype=float)[hit_arr]
2152
+
2153
+ df[woe_col] = out
2146
2154
  continue
2147
2155
 
2156
+
2148
2157
  # ── 数值特征:按 edges 做 bin 查找 ──
2149
2158
  edges = [float(e) for e in vr["edges"]]
2150
2159
  wt_map = vr["woe_table"].set_index("bin")["woe"].to_dict()
2151
2160
 
2152
- # 逐元素赋 WOE
2153
- def _get_woe(val):
2154
- # NaN
2155
- if val is None or (isinstance(val, float) and math.isnan(val)):
2156
- if "__nan__" in sv_woe_map:
2157
- return sv_woe_map["__nan__"]
2158
- return feat_missing_woe
2159
- # 数值特殊值
2160
- if val in sv_woe_map:
2161
- return sv_woe_map[val]
2162
- # 普通值:做 bin 查找
2161
+ out = np.full(len(series), feat_missing_woe, dtype=float)
2162
+
2163
+ is_missing = series.isna().to_numpy()
2164
+ if is_missing.any():
2165
+ out[is_missing] = float(sv_woe_map.get("__nan__", feat_missing_woe))
2166
+
2167
+ special_mask = np.zeros(len(series), dtype=bool)
2168
+ for sv_val, sv_woe in sv_woe_map.items():
2169
+ if sv_val == "__nan__":
2170
+ continue
2171
+ try:
2172
+ mask = series.eq(sv_val).to_numpy(dtype=bool, na_value=False)
2173
+ except TypeError:
2174
+ mask = series.astype(object).eq(sv_val).to_numpy(dtype=bool, na_value=False)
2175
+ if mask.any():
2176
+ out[mask] = float(sv_woe)
2177
+ special_mask |= mask
2178
+
2179
+ normal_mask = ~(is_missing | special_mask)
2180
+ if normal_mask.any():
2163
2181
  if not edges:
2164
- return wt_map.get(0, feat_missing_woe)
2165
- import bisect
2166
- # pd.cut right=True → bin_idx = bisect_right(edges, val)
2167
- bin_idx = bisect.bisect_right(edges, val)
2168
- return wt_map.get(bin_idx, feat_missing_woe)
2182
+ out[normal_mask] = float(wt_map.get(0, feat_missing_woe))
2183
+ else:
2184
+ try:
2185
+ values_arr = series.to_numpy(dtype=float, copy=False, na_value=np.nan)
2186
+ except (TypeError, ValueError):
2187
+ values_arr = pd.to_numeric(series, errors="coerce").to_numpy(dtype=float)
2188
+ normal_values = values_arr[normal_mask]
2189
+ valid_values = ~np.isnan(normal_values)
2190
+ if valid_values.any():
2191
+ normal_pos = np.flatnonzero(normal_mask)
2192
+ valid_pos = normal_pos[valid_values]
2193
+ bin_idx = np.searchsorted(
2194
+ np.asarray(edges, dtype=float),
2195
+ normal_values[valid_values],
2196
+ side="right",
2197
+ )
2198
+ woe_values = np.full(len(edges) + 1, feat_missing_woe, dtype=float)
2199
+ for bin_key, woe_val in wt_map.items():
2200
+ try:
2201
+ bin_i = int(bin_key)
2202
+ except (TypeError, ValueError):
2203
+ continue
2204
+ if 0 <= bin_i < len(woe_values):
2205
+ woe_values[bin_i] = float(woe_val)
2206
+ out[valid_pos] = woe_values[bin_idx]
2207
+
2208
+ df[woe_col] = out.astype(float)
2209
+ continue
2169
2210
 
2170
- df[woe_col] = series.apply(_get_woe).astype(float)
2171
2211
 
2172
2212
  return df
2173
2213
 
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  __author__ = "Jingkai Sun"
4
- __version__ = "0.3.2"
4
+ __version__ = "0.3.3"
5
5
 
6
6
  # Core module - base data structures
7
7
  from .Core import (
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SuperModelingFactory
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Credit risk modeling factory: WOE binning, scorecards, LightGBM, Excel reporting.
5
5
  Home-page: https://github.com/Kyle-J-Sun/SuperModelingFactory
6
6
  Author: Kyle Sun
@@ -262,7 +262,7 @@ em.close_workbook()
262
262
 
263
263
  ## 版本
264
264
 
265
- - **Version**: 0.3.2
265
+ - **Version**: 0.3.3
266
266
  - **Author**: Jingkai Sun
267
267
 
268
268
  ## 许可证
@@ -205,7 +205,7 @@ em.close_workbook()
205
205
 
206
206
  ## 版本
207
207
 
208
- - **Version**: 0.3.2
208
+ - **Version**: 0.3.3
209
209
  - **Author**: Jingkai Sun
210
210
 
211
211
  ## 许可证
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SuperModelingFactory
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Credit risk modeling factory: WOE binning, scorecards, LightGBM, Excel reporting.
5
5
  Home-page: https://github.com/Kyle-J-Sun/SuperModelingFactory
6
6
  Author: Kyle Sun
@@ -262,7 +262,7 @@ em.close_workbook()
262
262
 
263
263
  ## 版本
264
264
 
265
- - **Version**: 0.3.2
265
+ - **Version**: 0.3.3
266
266
  - **Author**: Jingkai Sun
267
267
 
268
268
  ## 许可证
@@ -12,7 +12,7 @@ build-backend = "setuptools.build_meta"
12
12
 
13
13
  [project]
14
14
  name = "SuperModelingFactory"
15
- version = "0.3.2"
15
+ version = "0.3.3"
16
16
  description = "Credit risk modeling factory: WOE binning, scorecards, LightGBM, Excel reporting."
17
17
  readme = "README.md"
18
18
  requires-python = ">=3.10"
@@ -15,7 +15,7 @@ def _read(path: str) -> str:
15
15
 
16
16
  setup(
17
17
  name="SuperModelingFactory",
18
- version=os.environ.get("SMF_VERSION", "0.3.2"),
18
+ version=os.environ.get("SMF_VERSION", "0.3.3"),
19
19
  description="Credit risk modeling factory: WOE binning, scorecards, LightGBM, Excel reporting.",
20
20
  long_description=_read("README.md"),
21
21
  long_description_content_type="text/markdown",