分客群分析实施计划¶
状态:待实施。本文描述已确定的设计目标、实施顺序和验收要求,不代表当前版本已支持这些参数。
制定日期:2026-10-28。源码基线:
05b212e9b720e9ec6e9af0bec050e2be2685dc36。实施前重新核对工作树、最新源码和 CI;保留用户已有修改。
1. 目标与交付批次¶
传入一份完整 DataFrame,在原有业务分组或时间粒度之外增加独立的客群列。一次分析同时提供 All 整体及各客群的结果,例如 All、seg1、seg2、seg3 分别在 Train/Val/Test 或各月份的分布、质量和风险表现。
项目定位继续为:面向人和 AI Agent 的高性能信贷风控工具箱。客群信息需要进入结构化结果、原生图、交付文件和证据引用,人工和 Agent 使用同一份统计。
| 批次 | 覆盖范围 | 完成条件 |
|---|---|---|
| 第一批,优先 | 风险画像、数据画像、统计特征筛选、报告全链路 | 共享/独立分箱、独立筛选、查询、原生图、HTML/Excel、保存恢复全部贯通 |
| 第二批 | 模型分交叉 | 保留现有分组与独立时间轴,新增客群、按客群固定分段及策略回放 |
| 第三批 | 规则评估、缺失异常诊断 | 固定规则和缺失异常均可按客群与原切片分析,保持各自的统计语义 |
允许按下文里程碑拆分提交和 PR;第一批验收后再推进第二、三批。每一批都交付可用的完整链路,不只添加签名或演示图。
本计划不扩展通用多维 Cube、自动发现客群、客群模型训练或通用 Agent 调度平台。每次调用先支持一个 segment_col。Linear/Importance Selector 的独立客群筛选暂不纳入此次实现。
Monitoring、Modeling(包括 Pipeline)、Scoring 暂停新功能迭代,只做本次上游变化所需的直接适配。上游不为这三个模块保留旧字段、转发壳或双轨计算;核心公共 API 与已保存报告仍需评估兼容性。
2. 当前代码事实与实施入口¶
以下为基线代码情况,实施时应再次核对;路径用于定位,不要求按目录机械拆出同名新模块。
| 位置 | 当前行为 | 本次需要处理 |
|---|---|---|
analysis/_risk_profile.py、analysis/evaluator.py |
profile_risk() 与 evaluate() 共用风险画像链路;group_col 优先于时间分组 |
新增客群维度并贯通规则、聚合和运行结果 |
analysis/_raw_ks.py、analysis/_evaluation/ |
特征、目标、分组及分箱组成现有计算粒度 | 加入客群身份,防止 raw/binned KS、基准、日期范围跨客群连接 |
analysis/profiler.py、analysis/_profiling/ |
数据质量、连续统计、PSI 及状态;PSI 内部拟合分箱 | 客群统计与客群 PSI,保留未计算状态 |
feature/selection/stats.py、selection/base.py |
整体漏斗与一个特征名单;最终会剪枝分箱规则 | 各客群独立漏斗、名单、规则与相关性证据,处理规则剪枝顺序 |
reporting/_query.py、_metadata.py、_semantics.py |
公共表查询、业务解释及证据 | 客群目录、粒度、过滤、引用和单位说明 |
reporting/_artifact.py、_serialization.py |
.marsreport 保存统计表与元数据,恢复为查询快照 |
保存作用域与规则身份,兼容已有分析文件,不恢复任意 estimator |
reporting/binning_report.py、profile_report.py 及展示 adapter |
原生图、Notebook、HTML 和 Excel | 复用已有展示,按客群筛选、按需绘制和导出 |
analysis/score_cross.py、相关 view/HTML/表达式模块 |
已有独立 group × period,两轴分段固定复用 | 再增加客群维度;独立分段的定义、求值及回放一致 |
rule/evaluator.py、workflow.py、analysis.py |
固定 RuleSet 评估、挖掘与高级分析;规则有自己的粒度和分母 | 增加客群评估与证据,不自动变成分客群挖掘 |
analysis/missing_shift.py 与共享缺失统计 |
按期扫描缺失异常,内部 segment 表示时间变化区间 | 先按业务客群分开统计、检测及汇总,避免术语混用 |
底层 Binner 继续负责对给定样本拟合和按既定规则转换,不承担业务客群调度。共享人口、身份与验证 helper 按现有依赖方向复用;不让 compute 依赖报告,也不让数据画像成为底层缺失算子的依赖。
3. 统一参数与默认行为¶
3.1 参数职责¶
| 参数 | 位置与取值 | 职责 |
|---|---|---|
segment_col |
分析/评估/扫描的运行方法,以及 StatsSelector 的 fit();默认 None |
指定当前输入中的客群列 |
binning_scope |
有分箱拟合职责的入口;"shared" 或 "per_segment",默认 "shared" |
决定规则在整体还是各客群拟合 |
selection_scope |
StatsSelector 构造策略;"global" 或 "per_segment",默认 "global" |
决定只执行整体筛选,还是同时执行各客群独立筛选 |
构造函数保存稳定策略,运行方法接收数据和本次上下文。profile_risk() 等便捷函数显式传递这些参数,避免只在高层接收而底层忽略。
数据画像的 binning_scope 用于 PSI 的内部规则拟合;均值、缺失率等统计不受其影响。未请求任何适用指标却传入非默认分箱模式时明确报错,不静默忽略。规则评估和缺失异常诊断不增加无效的 binning_scope 或 selection_scope。
未传 segment_col 时维持现有结果、默认返回、表结构、数值、排序与导出;使用需要客群的非默认模式时入口报错。segment_col 自动从默认特征集中排除;不允许同时把它显式声明为待分析特征或目标,也不允许与分组、日期、权重、金额角色重叠。
原有分组行为保持:风险画像和数据画像中,提供 group_col 时仍优先按该列组织趋势;time_col 继续提供日期信息。新增客群不改变其优先级,也不擅自引入额外时间分组轴。
3.2 风险画像的两种分箱模式¶
| 分析范围 | shared 的拟合人口 |
per_segment 的拟合人口 |
|---|---|---|
| All | 既定整体拟合人口 | 既定整体拟合人口 |
| seg1 | 复用整体规则 | 既定拟合人口中的 seg1 |
| seg2 | 复用整体规则 | 既定拟合人口中的 seg2 |
| seg3 | 复用整体规则 | 既定拟合人口中的 seg3 |
既定拟合人口沿用当前契约:有 benchmark_df 时使用该基准;没有时沿用现有入口的拟合规则。不会仅凭 dataset_flag 或名称推断 Train,更不会自动改写调用方标签。文档推荐显式传入开发样本作为 benchmark。
同一客群的所有评估分组和月份都使用该客群固定规则,不按月、验证集或不同评估目标重新拟合。shared 共享切点、类别定义及拟合所得映射;各客群的质量、表现、金额与稳定性统计仍在各自人口内计算。表内按客群计算的统计 WOE 与 estimator 用于转换的已学 WOE 映射须在目录中说明,不能混用或由生成报告覆盖已学映射。
MarsRiskProfile.binner 保留为整体分箱器;新增按客群可取的规则索引及各客群状态。独立规则通过既有正式分箱规则格式及必要索引保存,不使用 pickle。显式传入整体 binner 只适用于共享规则;独立模式使用明确的客群规则集合,冲突配置和缺失规则不能静默回退整体或重新拟合。
3.3 StatsSelector 的合法组合¶
selection_scope |
binning_scope |
行为 |
|---|---|---|
global |
shared |
保留整体筛选;若传客群列,只登记角色,不自动生成客群筛选或报告 |
per_segment |
shared |
All 与各客群独立筛选,共享各阶段的固定分箱规则 |
per_segment |
per_segment |
All 与各客群分别拟合、分别筛选 |
global |
per_segment |
入口报错;本期不定义多客群证据合成单一名单的规则 |
selected_features_ 和默认 transform() 始终表示整体结果。新增 selected_features_by_segment_ 或等价的明确客群结果索引,保存客群原始类型和值,避免字符串键碰撞。独立模式也要保留 All 结果。并集、交集和任一客群通过即保留不自动执行;若用户自行合并,文档说明其业务含义。
3.4 拟议用法¶
下列代码只说明目标 API,不加入当前版本的可执行示例。实施时补齐真实签名、验证和 snippets 后再成为用户指南。
risk = profile_risk(
df,
target="TARGET",
features=fcols,
segment_col="customer_segment",
group_col="dataset_flag",
time_col="APPLY_DATE",
benchmark_df=train_df,
binning_scope="per_segment",
method="cart",
n_bins=10,
)
selector = MarsStatsSelector(
selection_scope="per_segment",
binning_scope="per_segment",
batch_size=16,
n_jobs=1,
)
selector.fit(
df,
target="TARGET",
features=fcols,
segment_col="customer_segment",
group_col="dataset_flag",
benchmark_df=train_df,
)
4. 所有批次共用的业务契约¶
4.1 All、客群与 Total¶
All 表示未限制客群的完整输入人口;Total 表示某个分析范围内跨全部原分组的汇总。All 单独从原始人口聚合,不能平均客群指标。各客群 Total 也不能平均各月份的 KS、IV、AUC、PSI 或坏率。
新增客群目录表,拟名 scopes:保存 scope_id、整体/客群类型、客群列、原始 dtype 与编码值、展示名、排序和计算状态。业务事实表以 scope_id 连接目录,避免每个箱或每对特征都重复长客群文本。最终字段定义在 P00 冻结。
整体身份不能借用普通字符串或 null。真实客群值 "All"、"Total"、"Missing"、"null"、空字符串、null 和数值类别须可区分;不因展示转字符串丢失身份。标量类型复用现有受限编码;不支持的混合对象/嵌套类型在入口拒绝。null/NaN 按既有缺失语义归为缺失客群,字符串 "NaN" 不自动归缺失;缺失客群保留,不丢弃其样本,无穷数值客群拒绝。scope ID 依据客群列、类型和值确定,不依赖显示名或样本行顺序,保存恢复后不变。
按实际出现的客群计算,展示顺序稳定并记录。某客群某月不存在样本时,不补造风险为零的统计;展示为无数据,若视图补齐空格子则人数为 0、其余指标按语义为 null,并保留状态。
4.2 拟合规则、PSI 与 RC 参考分别记录¶
- All 的 PSI expected distribution 来自整体 benchmark;seg1 来自 benchmark 的 seg1。分箱模式不改变此人口匹配。
- 按客群匹配基准时,
benchmark_df必须有客群列且类型可对应;缺列或歧义类型在入口报错。 - 基准中缺少某客群、没有有效样本或有效权重为零时,记录该项不可计算原因,不使用整体分布代替。
- 无显式 benchmark 时,先依现有分组排序契约选定整体参考组,再将同一组应用于各客群;该客群在参考组没有样本时记录缺参考,不擅自改用自己的下一期。分箱拟合人口与 PSI 参考人口仍分别记录。
- RC 的
total使用当前 scope 的 Total,benchmark使用对应客群基准,first_group使用上文选定的同一整体首组在当前 scope 的样本;缺该组时记录不可计算,不跳到该客群的下一期。实际参考组、日期和人口进入报告。不得把整体坏率/分布意外连接到某个客群。 - 特征上线时间参考保留现有显式 benchmark 优先级;新增客群时按当前 scope 识别和记录日期。样本不足应明确状态,不能直接复用整体上线日。
4.3 标签、权重、金额与异常状态¶
分布、缺失、PSI 使用各 scope 的适用完整人口;标签指标只用该 scope、该 target 的已观察样本。标签仍为合法二分类或缺失,不能将 -1 当成未表现直接计算。权重、金额有效性、分母和单位沿用各模块现有定义。
整体输入结构非法、非法标签或非法权重等契约错误应报错。某个客群统计不足则记录局部状态,其他合法客群继续计算。监督拟合只有一个类别、客群为空、算法拟合失败、规则缺失、未计算及成功但统计未定义必须区分;不能填 0/1 或继承上一次运行结果。
不得将失败客群自动切换为无监督算法、整体分箱或另一个目标。保留现有整体无标签入口的合法行为时,报告必须记录实际生效算法。评估期单类别的处理按具体指标定义:可定义的分布/坏率仍计算,不能将所有风险指标统一填值或整个客群无条件报废。
多目标继续遵循当前能力边界:首目标负责拟合,同一 scope 内其他目标复用规则并各自处理未表现人口;当前趋势表只覆盖首目标。此次不顺带改成全部目标自动拥有趋势表。
4.4 重复运行与复用¶
重复 fit()、失败后再拟合、不同客群集合和不同特征集合之间,所有客群结果与缓存必须正确重建。不得读到上一次存在、这一次已消失的客群规则。固定规则评估和规则恢复禁止重新拟合;当前未见过的客群不能自动拿整体规则顶替,除非调用方明确选择共享模式。
5. 第一批:四个核心部分的实施里程碑¶
P00:冻结契约与独立参考¶
- [ ] 固定参数合法组合、scope 目录、各表粒度、默认行为、局部失败策略和规则产物职责。
- [ ] 核对全部 public 调用方、测试与旧快照;保存未分客群路径的实际数值、schema、排序和导出参考。
- [ ] 构造三个客群、多个分组、数值与类别特征的确定性小数据,包含方向相反、客群内有效但整体弱、跨客群分布差异的特征。
- [ ] 用明确人口和固定规则手工计算计数/分母,并以逐客群公开调用建立独立参考;共享模式必须传同一套固定规则,不能逐客群重新 fit 后假称等价。
- [ ] 无 benchmark 的独立参考显式固定整体首组或直接核验 expected counts;不能直接以各客群公开调用自动选出的自身首期作为同口径参考。
- [ ] 将规则拟合人口、评估人口、PSI expected 人口和 RC 参考分别写进测试及报告设计。
完成条件:开发者仅凭契约和参考即可解释每个 scope 的来源、规则、指标与失败状态。
P01:客群身份与报告底座¶
- [ ] 复用现有转换与投影,建立轻量客群解析/基准匹配,不复制全宽表、不保存原始人口。
- [ ] 为开启客群的报告增加 scopes 目录和事实表 scope 键;未开启时保持原 schema。
- [ ] 汇总、趋势、明细、按日缺失、日期范围、计算状态、相关关系及筛选决策都明确 scope 粒度。
- [ ] 元数据连接保持 feature 身份且防止多对多扩行;绘图和宽表透视不把 scope/客群列当成数值指标或时间组。
- [ ] 通用查询继续对命名表执行过滤/排序/投影/分页。开启客群的完整表可包含多个 scope;跨 scope 结果必须携带身份,并在目录说明。绘图和默认人工摘要展示 All。
- [ ] 提供统一的客群选择解析:
segments选择具体业务值,include_all单独控制整体;完整表可通过目录中的scope_id精确过滤。未知值、非法类型、空选择与缺失客群的语义有测试,不使用字符串哨兵。 - [ ] 人工摘要、HTML、Excel 和专用查询默认或显式补入的 scope 条件必须进入有效查询及 evidence reference;不要只在展示层隐藏其他客群。
- [ ]
.marsreport保存目录、实际参数、单位、状态、日期和规则身份,复用 manifest+Parquet 与受限 codec。当前基础 format_version 为 1;只有格式实际不兼容时才升级,区分文件格式与新增语义版本,并提供旧文件恢复策略。 - [ ] ReportSnapshot 保留查询、展示、导出与既有领域回放能力边界,不因保存客群报告而恢复 estimator、原始宽表或任意新计算。
完成条件:小型客群报告能保存,并在无原数据的新进程恢复后精确查询、分页、导出和重放同一证据。
P02:风险画像与分箱规则¶
- [ ]
profile_risk()和MarsBinEvaluator.evaluate()全链路支持 segment;多目标入口、raw KS 和固定 binner 入口不遗漏。 - [ ] 实现 shared/per_segment 两模式;All 独立规则保留,客群规则有明确归属、参数和失败状态。
- [ ] shared 每批尽量只转换一次,按 scope/group/bin 聚合;per_segment 复用底层分箱,按客群有界拟合与评估。
- [ ] PSI、RC、单调性、坏率/金额坏率及其分母在当前 scope 内计算;固定分箱跨时间复用。
- [ ] raw KS、binned KS、summary/trend 替换及所有 join/pivot 键加入 scope 和现有目标、特征、分组身份。raw 结果继续保留;Excel 中最终 KS 使用当前 scope 的既定 binned KS 合同,不跨客群取 max。
- [ ] 各客群及各 group 的日期范围从当前适用人口聚合,不能拿整体日期替代;不依赖字符串组名猜日期。
- [ ] 覆盖类别 Join、多 chunk、旧/新 Polars、多线程 streaming 的行数和顺序;标签在过滤/Join 前绑定,临时列名避让用户字段。
- [ ] 规则保存/恢复验证客群索引、切点、已学映射、未知值处理和显式复用不重拟合;报告快照与规则产物分开验证。
完成条件:All 与三个客群两种模式均与独立参考一致;未传 segment 的结果与基线一致。
P03:数据画像¶
- [ ]
profile_stats()与MarsDataProfiler.generate_profile()同步支持客群,不通过调用高层画像来替代底层共享统计。 - [ ] overview、DQ、stats、PSI、schema/unseen 和状态表保留对应 scope;dtype 始终描述原始特征类型,不因客群子样本变空而变成推断类型。
- [ ] PSI 实现 shared/per_segment 内部规则拟合;均值等无分箱指标数值不随 binning_scope 改变。
- [ ] schema 检查区分输入原始 schema 与人口统计;空客群不伪造 schema 漂移。unseen 按对应客群基准判断,保留其既有缺失/特殊值口径。
- [ ] 仅 DQ、混合指标、空当前人口、无参考和缺客群参考均保留正确目录与 typed null/计算状态;不要重现纯 null 占位表的多 chunk 形状假设。
- [ ] Notebook、趋势表及 HTML 沿用真实单位、原值排序和缺失样式,客群选择与来源/特征检索取交集。
完成条件:各统计和 PSI 与独立参考一致,客群筛选前后身份、dtype 和状态明确,保存恢复不依赖 profiler。
P04:统计特征筛选¶
- [ ] 按合法参数组合实现,整体默认路径保持现有行为。per_segment 为 All 与每个客群建立独立漏斗、阈值决策、名单、规则和相关性状态。
- [ ] 每个客群从声明的原始候选集开始;不能先用整体质量、IV 或 PSI 淘汰后才切客群。白/黑名单及来源配置在每个 scope 保留实际执行原因。
- [ ] shared 模式按阶段覆盖所有 scope 所需候选并集,在整体拟合人口上拟合该阶段共同规则,再于各 scope 内评估;不能先剪到整体最终名单。当前最终
_stage3_binner.prune()的执行时机和归属必须重做审查。 - [ ] 规则源不可被某个客群的 WOE 更新、剪枝或报告生成污染;per_segment 各自拥有拟合状态。共享规则的已学映射和当前客群统计的区别进入相关性参数与证据。
- [ ] 质量、粗筛、精筛、PSI/RC 和相关性均执行当前 scope 的实际口径。相关性使用该 scope 的完整适用人口和完整剩余候选,继续采用既定 WOE 表示、阈值、并列和白名单优先级。
- [ ] 每个 scope 的相关性计算和报告复用同一矩阵/事件,保留全局两两关系,不把特征批次改为互不相干的筛选池。
- [ ]
get_report()、漏斗摘要、get_binning_report()、get_correlation_report()支持明确客群选择。重新生成分箱报告仍按现有合同显式重传必要 benchmark,不缓存原始宽表取巧。 - [ ]
get_correlation_matrix()、get_related_features()及矩阵展示每次解析明确的单一 scope,默认 All;同名特征在不同客群的系数不能混成一张矩阵。保存后专用查询遵守相同规则。 - [ ]
selected_features_及默认 transform 为 All。显式选择客群时,只转换属于该客群的行,返回其名单且保持原行相对顺序;keep_target与外部 y 按同一行身份对齐。fit_transform()采用同一选择规则。 - [ ] 未选择客群时不自动按行路由不同名单;不同列数的结果不自动拼接、取并集或补零。失败客群与合法空名单可区分,后续 transform 有明确错误或空结果合同。
- [ ] 重复 fit、失败重试、消失/新增客群、set_output、保存规则和重新生成报告均有行为测试。
完成条件:三种合法配置的整体名单、各客群名单、淘汰原因、相关事件和固定规则均可复核;无跨 scope 过滤与状态污染。
P05:人和 Agent 的完整消费验收¶
- [ ]
build_risk_trend_figures()、plot_risk_trends()、图片保存和 HTML fragment 使用相同客群选择逻辑。 - [ ] 保留既有原生图字体、字重、线宽、颜色、布局、DPI 和高清导出;只增加必要客群说明及正确日期。每个 feature/target/scope 单独生成图,现有
include_total仍控制该 scope 的 Total。 - [ ] 默认展示 All;指定
segments和include_all可展示整体与若干客群。max_plots约束实际生成图总数,不能乘上客群数后无界生成;计算与展示范围分开,省略有说明。 - [ ] HTML 的客群、特征、来源、目标和原分组选择作用于同一事实范围,搜索、原值排序、分页、旧锚点、懒加载及空结果均可用。
- [ ] 原生 Excel 保留既有 22 列模板及透视引用。第一批一次明确选择一个 scope 导出,默认整体;客群身份放说明/附页,不向固定模板中硬插列。一次请求多个 scope 时明确拒绝,文档提供逐客群导出独立工作簿的用法,不能悄悄只导出第一个。通用快照 Excel 可用带 scope 的长表附页。
- [ ] 两种 Excel 引擎均核对值、类型、单位、原文字符串、透视源区域、活动页和 raw/binned KS;无标签客群不被格式化为零。所有导出不得修改源报告或规则。
- [ ] AI 上下文先按 scope 过滤/投影/分页,再序列化。scope 目录也受最终字符预算约束;缺少名称/口径时保持未知,预算省略后可继续查询。
- [ ] 保存 → 新进程加载 → 客群查询/分页 → 展示与导出 → reference 重放;禁止读取原始宽表或 fit。涉及专用绘图方法时验证通用快照的实际 adapter,不把快照假装成原生报告子类。
- [ ] 更新受影响 API docstring、用户指南、共享 snippets、FAQ、稳定性说明和 Unreleased。尚未实施的批次仍只在计划中描述,不写进已发布能力表。
完成条件:用户可从同一份报告查看 All 与 seg2;Agent 可准确取 seg2 的指定特征/分组,并在恢复后重放同一数值证据。
6. 第二批:模型分交叉¶
P06:客群 × 原分组 × 时间,以及独立分段¶
- [ ] 保留现有
group_col与独立 period 的合同;已有 group 用作客群的调用不改变结果。segment_col用于需要额外保留样本集/业务分组的场景。 - [ ] 支持 shared/per_segment 两轴分箱。shared 的整体固定定义跨所有客群复用;per_segment 为 All 和每个客群分别固定两轴定义,跨评估目标和周期不重拟合。
- [ ] 定义 scope、group、period、target、score axis、bin 的完整身份;实际格子数包含新维度,更新
max_scopes的实际规模检查,不静默裁剪客群或抽样。 - [ ] 既有
cutpoints/bin_definitions明确对应整体共享定义;与独立拟合冲突时拒绝。若提供客群固定定义,使用明确索引,不在不同 scope 下覆盖同一个定义。 - [ ] 边际从当前 scope 的计数、权重、金额重新汇总;不同 target 的人数不相加,置信区间、低样本状态、方向和 invalid/missing 语义不变。
- [ ]
get_score_bin_definitions()、矩阵展示、策略条件、策略求值与保存后回放均绑定 scope 与规则 ID。不能把 seg1 的箱号/切点用于 seg2,独立箱格不宣称天然可横向比较。 - [ ] Excel/HTML/AI 查询复用第一批客群目录与选择,真实浏览器验证切点精度、bad rate 文案、筛选及空组合。
- [ ] 保存后回放只使用已保存聚合证据支持的能力,不宣称能增加未计算维度或访问原样本。
完成条件:shared 和 per_segment 的格子、边际及策略指标与独立参考一致;旧 group × period 示例和规则定义回放保持通过。
7. 第三批:规则评估与缺失异常诊断¶
P07:规则评估¶
- [ ]
MarsRuleEvaluator.evaluate()增加 segment,固定 RuleSet 在 All/各客群 × 原分组或时间切片上评估。customer_col继续只表示去重客户 ID。 - [ ]
mine_rules()及结果高级分析按实际调用链转交客群上下文,特征推断排除客群列;此次不自动为每个客群重新生成候选、挖掘或筛选部署规则。 - [ ] 保留 dataset/rule_id/target/slice/group/审计轮次的原粒度,并增加 scope。规则 sample_count 与覆盖等分母继续使用当前目标已表现人口,不照抄模型分交叉的同名字段。
- [ ] 整体发现/验证资格不因添加客群评估自动改变。候选审计、独立验证、production 资格与无部署资格的报告快照边界不变。
- [ ]
compute_statistics=True时明确校正家族:默认每个 scope 沿用原检验家族;报告说明这不是全部客群联合 FDR 保证。All 的结果不因增加展示客群而改变。 - [ ] 规则特征桥接、业务来源筛选、组合/增益分析、报告保存和分页均带客群条件;固定规则使用独立逐客群评估作为数值参考。
完成条件:同一 RuleSet 的整体、客群、切片及各 target 分母准确,审计和生产资格不被客群报告混淆。
P08:缺失异常诊断¶
- [ ]
MarsMissingShiftScanner.scan()增加 segment,先形成 scope × feature × period 的缺失计数和分母,再在各 scope 内检测。 - [ ] 内部
segment_shift继续表示时间变化区间,不重命名为业务客群,不复用其字段承载segment_col。 - [ ] 窗口通过缺失数和人数加总计算率,低样本断点、变点、边界和孤立点均限制在当前 scope;不跨客群拼接时间序列,不补造缺失日期。
- [ ] 明确客群 benchmark 匹配:原 benchmark 无需日期列的合同保留,但新增 segment 时必须可识别对应客群;缺基准或低样本按状态处理,不取整体基准代替。
- [ ] 每个 scope 沿用原候选集合内的 BH 校正与已有检测算法,元数据记录检验家族;All 的结果不随其他客群数量变化。不承诺跨全部客群联合 FDR。
- [ ] 数据源汇总、异常窗口、趋势、说明和导出都保留 scope;不因异常检测自动删除特征或阻断业务。
- [ ] 当前
MarsMissingShiftResult尚未接入公共 Report 契约;增加明确的to_report()或等价 adapter,复用目录、查询、分页、AI context 与.marsreport。保存后新进程验证客群过滤、状态、趋势和证据引用,不恢复扫描器或重新检测。 - [ ] 使用逐客群独立扫描与手工窗口计数验证变化点、异常类型、p 值/校正结果、低样本断点和基准状态。
完成条件:能定位仅发生于某客群的质量变化,整体和各客群证据均可查询,保留原缺失语义与异常算法。
8. 性能与内存要求¶
客群会增加统计和报告规模,不能承诺增加维度没有成本。结果规模通常随特征 × 客群 × 分组 × 箱数增长;完整相关性还有各 scope 的候选平方项,模型分交叉还涉及两轴格子。
- 先投影特征批和必要角色列,再转换和物化。shared 模式复用本批分箱结果,All 与客群尽量共享基础聚合;不通过复制一份 All 人口再 concat 所有客群实现多层统计。
- per_segment 允许独立拟合,但默认顺序或有界调度,不同时常驻多个完整宽表、全部 WOE 表和密集矩阵,不叠加客群外层并行与
n_jobs=-1。 - 每个 scope 完成后释放拟合/计算缓存,保留固定规则、必要小统计表和状态;不缓存原始 benchmark 来方便后续报告生成。
- 沿用真实 lazy 路径、列批控制和分块相关性。不能为了分客群退回全宽 eager、完整 IPC BytesIO hash、全量 Python 行循环或报告先全转 JSON。
- 计算、显示、查询预算分开。高基数客群应提前报告规模和要求显式缩小;不能用绘图页长掩盖计算成本,也不能静默跳过客群、减行或减特征。
- 容量验收测量完整公开调用链中真实对象共存,不仅将每个阶段单独放入新进程;All 与客群报告保存、规则持有和相关性报告均计入实际峰值。
- 小型规模回归覆盖 1/3/较多客群、均衡/极不均衡人口、列批 1/16/100、线程 1/4、类别 Join、长特征名与多 chunk。普通 CI 不加庞大的完整 benchmark。
- 独立 benchmark 记录 Python/依赖、CPU/内存、行列、客群数、分组数、标签人口、实际候选漏斗、时间与峰值 RSS。跨实现对照继续验证同一输入身份、实际工作和完整数值语义,线程池枚举顺序不作为资源差异。
不得用抽样、改变阈值、只保留相关性局部块、隐藏失败阶段或要求用户先全宽 rechunk 来获得通过。真实大数据在用户授权和可用环境中运行;未运行就记录为未验证。
9. 验收矩阵¶
| 方面 | 必测情况 | 通过标准 |
|---|---|---|
| 原行为 | 未传 segment、现有历史快照及默认导出 | schema、单位、顺序、指标及调用语义保持一致 |
| 身份 | 三客群、null、真实 All/Total/Missing、数值/字符串、客群顺序变化 | 无碰撞、无丢样本、查询与恢复身份一致 |
| 人口 | 完整人口、未表现、单类别、零权重、空分组、基准缺客群 | 分母准确,局部状态明确,非法输入仍拒绝 |
| 拟合 | shared/per_segment、固定规则、缺规则、监督拟合失败 | 拟合次数及人口准确,不跨期 fit、不自动回退 |
| 多目标 | 主标签缺表现、辅助标签、不同表现覆盖率 | 固定主目标规则,按目标排除未表现,趋势边界明确 |
| 数值 | 计数、坏率、金额、IV/KS/AUC、PSI/RC | 与手工计数及独立参考一致;浮点容差不改变业务判定 |
| 筛选 | 整体弱但客群强、客群名单不同、白黑名单、跨批相关 | 各 scope 从原候选开始;名单、事件、顺序准确,无提前剪枝 |
| 原生图 | All/单客群/多客群、Total 开关、三种风险曲线、PNG/SVG | 曲线和统计等于报告,日期准确,原字体及布局保留 |
| 查询/Agent | scope+feature+source+target+group 交集、零行、小预算、下一页 | 过滤先于转换,最终预算和 reference 可重放 |
| 保存/规则 | 新进程、无原表、历史快照、独立规则产物 | 不重新 fit,报告与 estimator 能力边界准确 |
| Excel/HTML | 两引擎、22 列模板、透视、中文搜索、客群切换、离线页面 | 实际值/类型/格式正确,无串客群、外部依赖或 JS 错误 |
| 后端/执行 | Pandas/Polars、原始 dtype、长名称、多 chunk、现代多线程 streaming | 数值、行数、行序和标签绑定一致 |
| 重复运行 | 成功后失败、失败后成功、客群/特征变化 | 无旧状态、旧规则或旧名单泄漏 |
| 资源 | 客群数、行列规模和候选漏斗变化 | 全链路可测、有界中间对象、结果不减人口 |
Python 3.8–3.12 与 Pandas 2/3 的实际组合以当前 CI 和 constraints 为准,必须覆盖旧 Polars 1.8.2 及当前现代 Polars 的相关行为。现代 streaming 测试在首次 import 前设置线程数,并输出子进程实际版本,避免 PYTHONPATH 重设后误测旧版。
受影响质量门包括 Ruff、Mypy、public/private docstring、定向回归、基础 CI、文档共享示例与严格 MkDocs。真实浏览器检查客群交互、手机宽度与离线恢复报告;Excel 在可用环境实际打开/刷新/重算。缺失环境、未实测平台和未运行的大规模测试单独列出,不能计为通过。
10. 提交顺序与交付记录¶
| 顺序 | 建议变更单元 | 前置条件 |
|---|---|---|
| 1 | P00 契约、参考数据与 P01 报告底座 | 无 |
| 2 | P02 风险画像与规则产物 | scope 身份和持久契约已确定 |
| 3 | P03 数据画像 | 共用 scope/基准解析可复用 |
| 4 | P04 独立统计筛选 | 两种风险评估模式已验证 |
| 5 | P05 全链路展示/导出及第一批文档验收 | 四个核心部分形成完整结果 |
| 6 | P06 模型分交叉 | 第一批验收通过 |
| 7 | P07 规则评估 | 第一批报告契约稳定 |
| 8 | P08 缺失异常诊断 | 第一批报告契约稳定 |
每个变更单元记录实际修改、签名和迁移、验证命令、环境、通过/失败/未运行、资源测量限制及剩余事项。第一批中间提交可以用于开发审查,但对外宣称支持分客群分析须完成 P01–P05 的完整消费链路。
本计划的勾选只随真实实施与证据更新。无额外授权不发布新版本、不修改包版本,不把计划示例当成当前已可执行的 API。实现中的合理内部调整可以自行完成;若改变本计划的拟合人口、指标口径、名单含义、规则复用或持久化能力,应先在变更说明中明确影响并更新计划,不能只为测试通过调整。
11. 相关文档¶
这些链接描述当前已有能力;本文新增参数与行为在完成实施前仍属于计划。