跳转至

分客群分析实施计划

状态:待实施。本文描述已确定的设计目标、实施顺序和验收要求,不代表当前版本已支持这些参数。

制定日期: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 的候选平方项,模型分交叉还涉及两轴格子。

  1. 先投影特征批和必要角色列,再转换和物化。shared 模式复用本批分箱结果,All 与客群尽量共享基础聚合;不通过复制一份 All 人口再 concat 所有客群实现多层统计。
  2. per_segment 允许独立拟合,但默认顺序或有界调度,不同时常驻多个完整宽表、全部 WOE 表和密集矩阵,不叠加客群外层并行与 n_jobs=-1。
  3. 每个 scope 完成后释放拟合/计算缓存,保留固定规则、必要小统计表和状态;不缓存原始 benchmark 来方便后续报告生成。
  4. 沿用真实 lazy 路径、列批控制和分块相关性。不能为了分客群退回全宽 eager、完整 IPC BytesIO hash、全量 Python 行循环或报告先全转 JSON。
  5. 计算、显示、查询预算分开。高基数客群应提前报告规模和要求显式缩小;不能用绘图页长掩盖计算成本,也不能静默跳过客群、减行或减特征。
  6. 容量验收测量完整公开调用链中真实对象共存,不仅将每个阶段单独放入新进程;All 与客群报告保存、规则持有和相关性报告均计入实际峰值。
  7. 小型规模回归覆盖 1/3/较多客群、均衡/极不均衡人口、列批 1/16/100、线程 1/4、类别 Join、长特征名与多 chunk。普通 CI 不加庞大的完整 benchmark。
  8. 独立 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. 相关文档

这些链接描述当前已有能力;本文新增参数与行为在完成实施前仍属于计划。