初始提交:飞球 ETL 系统全量代码
This commit is contained in:
3688
docs/index/DWS指数.md
Normal file
3688
docs/index/DWS指数.md
Normal file
File diff suppressed because it is too large
Load Diff
88
docs/index/cfg_index_parameters.csv
Normal file
88
docs/index/cfg_index_parameters.csv
Normal file
@@ -0,0 +1,88 @@
|
||||
param_id,index_type,param_name,param_value,description,effective_from,effective_to,created_at,updated_at
|
||||
15,INTIMACY,amount_base,500.000000,amount compression base,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
26,INTIMACY,burst_gamma,0.600000,burst gamma,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
29,INTIMACY,ewma_alpha,0.200000,EWMA alpha,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
18,INTIMACY,halflife_last,10.000000,last-contact half-life (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
21,INTIMACY,halflife_long,30.000000,long-term burst half-life (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
19,INTIMACY,halflife_recharge,21.000000,recharge half-life (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
17,INTIMACY,halflife_session,14.000000,session half-life (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
20,INTIMACY,halflife_short,7.000000,short-term burst half-life (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
16,INTIMACY,incentive_weight,1.500000,incentive multiplier,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
12,INTIMACY,lookback_days,60.000000,lookback window (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
27,INTIMACY,percentile_lower,5.000000,lower percentile,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
28,INTIMACY,percentile_upper,95.000000,upper percentile,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
14,INTIMACY,recharge_attribute_hours,1.000000,recharge attribution window (hours),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
13,INTIMACY,session_merge_hours,4.000000,session merge gap (hours),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
25,INTIMACY,weight_duration,0.500000,duration weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
22,INTIMACY,weight_frequency,2.000000,frequency weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
23,INTIMACY,weight_recency,1.500000,recency weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
24,INTIMACY,weight_recharge,2.000000,recharge weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
75,NCI,active_new_penalty,0.200000,active-new suppression multiplier,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
74,NCI,active_new_recency_days,7.000000,active-new recency window (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
73,NCI,active_new_visit_threshold_14d,2.000000,active-new threshold in 14d visits,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
77,NCI,amount_base_M0,300.000000,spend log base M0,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
78,NCI,balance_base_B0,500.000000,balance log base B0,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
62,NCI,compression_mode,0.000000,compression mode,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
85,NCI,enable_stop_high_balance_exception,0.000000,enable high-balance STOP exception,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
61,NCI,ewma_alpha,0.200000,EWMA alpha,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
76,NCI,h_recharge,7.000000,recharge decay half-life (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
86,NCI,high_balance_threshold,1000.000000,high-balance threshold,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
57,NCI,lookback_days_recency,60.000000,recency lookback window (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
65,NCI,new_days_threshold,30.000000,new member days threshold,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
67,NCI,new_recharge_max_visits,10.000000,max visits for new-recharge grouping,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
64,NCI,new_visit_threshold,2.000000,new member visit threshold,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
68,NCI,no_touch_days_new,3.000000,no-touch threshold (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
59,NCI,percentile_lower,5.000000,lower percentile,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
60,NCI,percentile_upper,95.000000,upper percentile,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
66,NCI,recharge_recent_days,14.000000,recent recharge window (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
71,NCI,salvage_end,60.000000,salvage decay end day,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
70,NCI,salvage_start,30.000000,salvage decay start day,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
69,NCI,t2_target_days,7.000000,second-visit target window (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
63,NCI,use_smoothing,1.000000,enable smoothing,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
80,NCI,value_w_bal,0.800000,value weight for balance,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
79,NCI,value_w_spend,1.000000,value weight for spend,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
58,NCI,visit_lookback_days,180.000000,visit history lookback (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
82,NCI,w_need,1.600000,need weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
83,NCI,w_re,0.800000,recharge pressure weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
84,NCI,w_value,1.000000,value weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
81,NCI,w_welcome,1.000000,welcome-stage weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
72,NCI,welcome_window_days,3.000000,welcome outreach window for first touch (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
11,RECALL,ewma_alpha,0.200000,EWMA alpha,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
3,RECALL,halflife_new,7.000000,new member half-life (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
4,RECALL,halflife_recharge,10.000000,recharge half-life (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
1,RECALL,lookback_days,60.000000,recall lookback window (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
9,RECALL,percentile_lower,5.000000,lower percentile,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
10,RECALL,percentile_upper,95.000000,upper percentile,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
2,RECALL,sigma_min,2.000000,minimum sigma for volatility,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
8,RECALL,weight_hot,1.000000,hotness weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
6,RECALL,weight_new,1.000000,new member weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
5,RECALL,weight_overdue,3.000000,overdue weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
7,RECALL,weight_recharge,1.000000,recharge weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
47,WBI,amount_base_M0,300.000000,spend log base M0,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
48,WBI,balance_base_B0,500.000000,balance log base B0,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
35,WBI,compression_mode,0.000000,compression mode,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
55,WBI,enable_stop_high_balance_exception,0.000000,enable high-balance STOP exception,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
34,WBI,ewma_alpha,0.200000,EWMA alpha,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
46,WBI,h_recharge,7.000000,recharge decay half-life (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
56,WBI,high_balance_threshold,1000.000000,high-balance threshold,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
30,WBI,lookback_days_recency,60.000000,recency lookback window (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
38,WBI,new_days_threshold,30.000000,new member days threshold,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
40,WBI,new_recharge_max_visits,10.000000,max visits for new-recharge grouping,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
37,WBI,new_visit_threshold,2.000000,new member visit threshold,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
45,WBI,overdue_alpha,2.000000,overdue fallback alpha,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
88,WBI,overdue_weight_blend_min_samples,8.000000,minimum samples to fully trust weighted overdue CDF,2026-02-07,,2026-02-07 18:06:47.706821+08:00,2026-02-07 18:06:47.706821+08:00
|
||||
87,WBI,overdue_weight_halflife_days,30.000000,overdue weighted-CDF interval half-life (days),2026-02-07,,2026-02-07 18:06:47.706821+08:00,2026-02-07 18:06:47.706821+08:00
|
||||
32,WBI,percentile_lower,5.000000,lower percentile,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
33,WBI,percentile_upper,95.000000,upper percentile,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
42,WBI,recency_gate_days,14.000000,recency suppression gate center (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
43,WBI,recency_gate_slope_days,3.000000,recency suppression slope (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
41,WBI,recency_hard_floor_days,14.000000,hard floor for winback recency (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
39,WBI,recharge_recent_days,14.000000,recent recharge window (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
36,WBI,use_smoothing,1.000000,enable smoothing,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
50,WBI,value_w_bal,1.000000,value weight for balance,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
49,WBI,value_w_spend,1.000000,value weight for spend,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
31,WBI,visit_lookback_days,180.000000,visit history lookback (days),2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
52,WBI,w_drop,1.000000,drop weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
51,WBI,w_over,2.000000,overdue weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
53,WBI,w_re,0.400000,recharge pressure weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
54,WBI,w_value,1.200000,value weight,2026-02-06,,2026-02-06 23:14:39.707810+08:00,2026-02-06 23:14:39.707810+08:00
|
||||
|
392
docs/index/index_algorithm_cn.md
Normal file
392
docs/index/index_algorithm_cn.md
Normal file
@@ -0,0 +1,392 @@
|
||||
# 指数算法说明(代码对齐版)
|
||||
|
||||
本文根据当前代码实现整理,包含老客挽回指数(WBI)、新客转化指数(NCI)与关系指数(RS/OS/MS/ML)的计算流程、参数含义、归一化逻辑与用途说明。
|
||||
如需业务版本(非代码版)说明,请另行补充。
|
||||
|
||||
## 0. 版本更新(2026-02-08)
|
||||
|
||||
1. 关系指数从旧 `INTIMACY` 切换为单任务 `RelationIndexTask`,统一产出 `RS/OS/MS/ML`。
|
||||
2. `ML` 口径调整为人工台账唯一真源(`dws_ml_manual_order_alloc`)。
|
||||
3. `dwd_recharge_order` 的 last-touch 仅保留备用路径,默认关闭(`ML.source_mode=0`)。
|
||||
4. `BaseIndexTask` 已支持按 `index_type` 隔离参数缓存与分位平滑历史,避免单任务串参。
|
||||
|
||||
## 1. 通用约定
|
||||
|
||||
1) **时间口径**
|
||||
- 以 `datetime.now(self.tz)` 为"当前时间"基准。
|
||||
- 窗口仅回溯 **近 60 天**(`lookback_days`)。
|
||||
|
||||
2) **天数截断**
|
||||
- 所有"天数差"在参与衰减或间隔计算时,都会被截断到 `<= lookback_days`(默认 60 天)。
|
||||
|
||||
3) **半衰期衰减**
|
||||
```
|
||||
decay(d; h) = exp(-ln(2) * d / h)
|
||||
```
|
||||
- `d` 为距今天数,`h` 为半衰期(天)。
|
||||
- `d=0` 时权重 1.0,`d=h` 时权重 0.5。
|
||||
|
||||
4) **0–10 映射(Raw → Display)**
|
||||
- 取全体 Raw 分数,计算 `P5/P95`。
|
||||
- 对 Raw 进行 **Winsorize** 截断到 `[P5, P95]`。
|
||||
- 可选压缩:`none / log1p / asinh`。
|
||||
- MinMax 映射到 `[0, 10]`。
|
||||
- 若范围过小(分母 < 1e-6),直接返回 5.0。
|
||||
- 最终展示分数保留两位小数。
|
||||
|
||||
5) **分位点平滑(可选)**
|
||||
- 若 `use_smoothing=1` 且存在历史分位点:
|
||||
`Q_t = (1-α) * Q_{t-1} + α * Q_now`
|
||||
- `α` 来自参数 `ewma_alpha`(默认 0.2)。
|
||||
|
||||
> 以上逻辑由 `BaseIndexTask` 提供。
|
||||
|
||||
---
|
||||
|
||||
## 2. 老客挽回指数(WBI)
|
||||
|
||||
### 2.0 作用/业务场景
|
||||
|
||||
- 识别需要重点“唤回”的老客,并给出可排序的优先级分数。
|
||||
- 综合超期、降频、充值未回访与价值信号,衡量“召回紧迫度 + 价值潜力”。
|
||||
- 结果通常用于运营触达/回访任务优先级与名单筛选。
|
||||
|
||||
### 2.1 数据来源与口径
|
||||
|
||||
- **到店记录**:`billiards_dwd.dwd_settlement_head`
|
||||
条件:`site_id`、`member_id > 0`、`settle_type=1`
|
||||
或 `settle_type=3` 且关联 `dwd_assistant_service_log` 中 **附加课/奖励课(BONUS)**。
|
||||
使用 `pay_time` 作为到店/服务结束时间(按天去重)。
|
||||
- **充值记录**:`billiards_dwd.dwd_recharge_order`
|
||||
条件:`site_id`、`member_id > 0`、`settle_type=5`,取最近充值时间(回溯 60 天)。
|
||||
- **会员档案**:`billiards_dwd.dim_member.create_time`
|
||||
- **储值卡余额**:`billiards_dwd.dim_member_card_account.balance`
|
||||
口径:现金储值卡 `card_type_id=2793249295533893`。
|
||||
|
||||
> 计算窗口:到店历史取近 180 天;recency 按 60 天封顶。
|
||||
|
||||
### 2.2 特征与分流
|
||||
|
||||
- `t_v = min(lookback_days_recency, days_since_last_visit)`
|
||||
- `t_r = min(lookback_days_recency, days_since_last_recharge)`
|
||||
- `t_a = min(t_v, t_r)`
|
||||
- `visits_14d / visits_60d / visits_total(近 180 天)`
|
||||
- `spend_30d / spend_180d`:按 `pay_amount`(实付)汇总
|
||||
- 到店间隔:按天计算并封顶到 `lookback_days_recency`;同时记录间隔的“距今年龄”用于加权 CDF
|
||||
- `recharge_unconsumed`:最近一次充值晚于最近一次到店(或无到店)时为 1
|
||||
|
||||
**分流规则:**
|
||||
- STOP:`t_a >= lookback_days_recency`(默认不写入;高余额例外可选)
|
||||
- STOP_HIGH_BALANCE:当 `enable_stop_high_balance_exception=1` 且 `sv_balance >= high_balance_threshold` 时,仍进入 WBI 计算
|
||||
- NEW:`visits_total <= new_visit_threshold`
|
||||
或 `days_since_first_visit <= new_days_threshold`
|
||||
或 `recharge_unconsumed=1` 且 `days_since_last_recharge <= recharge_recent_days`
|
||||
- OLD:非 STOP 且非 NEW
|
||||
|
||||
### 2.3 分项得分
|
||||
|
||||
**Overdue(个人周期超期分)**
|
||||
基于加权经验 CDF:
|
||||
```
|
||||
p = weighted_cdf(intervals, t_v, halflife_days, blend_min_samples)
|
||||
overdue = p ^ alpha
|
||||
```
|
||||
- 加权 CDF 使用半衰期对历史间隔加权,近期间隔权重更高
|
||||
- 若无历史间隔数据,`p = 0.5`
|
||||
- 同时计算理想回访间隔(加权中位数),用于推算理想下次到店日期
|
||||
|
||||
**Drop(近期降频)**
|
||||
```
|
||||
expected14 = visits_60d * 14/60
|
||||
drop = clip((expected14 - visits_14d) / (expected14 + 1), 0, 1)
|
||||
```
|
||||
|
||||
**Recharge(充值未回访压力)**
|
||||
```
|
||||
recharge = decay(t_r; h_recharge) if recharge_unconsumed=1 else 0
|
||||
```
|
||||
|
||||
**Value(价值)**
|
||||
```
|
||||
S_spend = ln(1 + spend_180d / M0)
|
||||
S_bal = ln(1 + sv_balance / B0)
|
||||
value = w_spend * S_spend + w_bal * S_bal
|
||||
```
|
||||
|
||||
### 2.4 Raw Score
|
||||
|
||||
```
|
||||
WBI_raw = w_over * overdue
|
||||
+ w_drop * drop
|
||||
+ w_re * recharge
|
||||
+ w_value * value
|
||||
```
|
||||
|
||||
**Recency suppression(近访抑制):**
|
||||
```
|
||||
suppression = sigmoid((t_v - recency_gate_days) / recency_gate_slope_days)
|
||||
WBI_raw = WBI_raw * suppression
|
||||
```
|
||||
- Hard floor(硬门槛):
|
||||
```
|
||||
if t_v < recency_hard_floor_days: suppression = 0
|
||||
```
|
||||
- 默认:`recency_gate_days=14`,`recency_gate_slope_days=3`
|
||||
- 默认:`recency_hard_floor_days=14`
|
||||
- 当 `recency_gate_slope_days <= 0` 时,退化为硬门槛:`t_v < recency_gate_days => suppression=0`
|
||||
- 限制在 0 以上
|
||||
|
||||
### 2.5 输出表
|
||||
|
||||
`billiards_dws.dws_member_winback_index`
|
||||
|
||||
### 2.6 WBI 默认参数
|
||||
|
||||
| 参数 | 默认值 | 含义 |
|
||||
|---|---:|---|
|
||||
| `lookback_days_recency` | 60 | recency 窗口(天) |
|
||||
| `visit_lookback_days` | 180 | 到店历史窗口(天) |
|
||||
| `overdue_alpha` | 2.0 | 超期分幂次 |
|
||||
| `overdue_weight_halflife_days` | 30 | 加权 CDF 半衰期 |
|
||||
| `overdue_weight_blend_min_samples` | 8 | 加权/等权混合最小样本 |
|
||||
| `h_recharge` | 7 | 充值衰减半衰期 |
|
||||
| `amount_base_M0` | 300 | 消费压缩基数 |
|
||||
| `balance_base_B0` | 500 | 余额压缩基数 |
|
||||
| `w_over` | 2.0 | 超期分权重 |
|
||||
| `w_drop` | 1.0 | 降频分权重 |
|
||||
| `w_re` | 0.4 | 充值分权重 |
|
||||
| `w_value` | 1.2 | 价值分权重 |
|
||||
| `recency_gate_days` | 14 | 近访抑制门槛 |
|
||||
| `recency_gate_slope_days` | 3 | 近访抑制斜率 |
|
||||
| `recency_hard_floor_days` | 14 | 硬门槛天数 |
|
||||
| `new_visit_threshold` | 2 | 新客到店次数阈值 |
|
||||
| `new_days_threshold` | 30 | 新客建档天数阈值 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 新客转化指数(NCI)
|
||||
|
||||
### 3.0 作用/业务场景
|
||||
|
||||
- 识别新客的“欢迎建联”与“转化召回”优先级。
|
||||
- 兼顾首访后快速触达与二访转化窗口,避免对近期活跃新客过度打扰。
|
||||
- 结果通常用于新客欢迎、转化跟进与触达节奏排序。
|
||||
|
||||
### 3.1 数据来源与口径
|
||||
|
||||
- 使用 `MemberIndexBaseTask` 的共享口径,与 WBI 完全一致(到店/充值/会员档案/余额、`t_v/t_r/t_a`、`visits_*`、`spend_*`、`recharge_unconsumed` 等)。
|
||||
- 适用对象:仅 NEW 分群(分流规则见 2.2)。
|
||||
|
||||
### 3.2 关键分项
|
||||
|
||||
**Need(转化紧迫度)**
|
||||
```
|
||||
t2_max = 2 * t2_target_days
|
||||
Need = clip((t_v - no_touch_days_new) / (t2_max - no_touch_days_new), 0, 1)
|
||||
```
|
||||
|
||||
**Salvage(可救度)**
|
||||
```
|
||||
if t_a <= salvage_start: 1
|
||||
elif t_a >= salvage_end: 0
|
||||
else: (salvage_end - t_a) / (salvage_end - salvage_start)
|
||||
```
|
||||
|
||||
**Recharge(充值未回访压力)** 同 WBI
|
||||
**Value(价值)** 同 WBI(权重可不同)
|
||||
|
||||
### 3.3 Raw Score(含欢迎建联与活跃抑制)
|
||||
|
||||
新增逻辑:
|
||||
- `Welcome`:仅首访/单访新客在 `welcome_window_days` 内触发,越接近当天分越高。
|
||||
- `active_multiplier`:若新客近14天来店次数较高且最近仍活跃,则用 `active_new_penalty` 抑制转化召回分。
|
||||
- `touch_multiplier`:`t_v` 未达到 `no_touch_days_new` 前,`Recharge/Value` 贡献按比例衰减,减少"刚来过就高分"。
|
||||
|
||||
```
|
||||
NCI_raw = w_welcome * Welcome
|
||||
+ active_multiplier * (
|
||||
w_need * (Need * Salvage)
|
||||
+ w_re * Recharge * touch_multiplier
|
||||
+ w_value * Value * touch_multiplier
|
||||
)
|
||||
```
|
||||
|
||||
NCI 额外提供三个维度的展示分:`display_score`(总分)、`display_score_welcome`(欢迎分)、`display_score_convert`(转化分)。
|
||||
|
||||
### 3.4 输出表
|
||||
|
||||
`billiards_dws.dws_member_newconv_index`
|
||||
|
||||
### 3.5 NCI 默认参数
|
||||
|
||||
| 参数 | 默认值 | 含义 |
|
||||
|---|---:|---|
|
||||
| `no_touch_days_new` | 3 | 免打扰天数 |
|
||||
| `t2_target_days` | 7 | 目标回访天数 |
|
||||
| `salvage_start` | 30 | 可救度开始衰减天数 |
|
||||
| `salvage_end` | 60 | 可救度归零天数 |
|
||||
| `welcome_window_days` | 3 | 欢迎窗口(天) |
|
||||
| `active_new_visit_threshold_14d` | 2 | 活跃抑制到店阈值 |
|
||||
| `active_new_recency_days` | 7 | 活跃抑制近期天数 |
|
||||
| `active_new_penalty` | 0.2 | 活跃抑制系数 |
|
||||
| `w_welcome` | 1.0 | 欢迎分权重 |
|
||||
| `w_need` | 1.6 | 紧迫度权重 |
|
||||
| `w_re` | 0.8 | 充值分权重 |
|
||||
| `w_value` | 1.0 | 价值分权重 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 亲密指数(INTIMACY)
|
||||
|
||||
### 4.0 作用/业务场景
|
||||
|
||||
- 衡量客户与助教的关系强度与“近期温度”。
|
||||
- 用于助教约课精力分配、客户-助教匹配与成功率预估等排序参考。
|
||||
- 结果以 0–10 展示分提供横向比较。
|
||||
|
||||
### 4.1 数据来源与口径
|
||||
|
||||
- **服务记录**:`billiards_dwd.dwd_assistant_service_log`
|
||||
条件:`site_id`、`tenant_member_id > 0`、`is_delete = 0`、`user_id > 0`
|
||||
时间口径:`last_use_time` 在近 `lookback_days` 天内
|
||||
- **助教维度**:`billiards_dwd.dim_assistant`
|
||||
通过 `user_id` 关联获取 `assistant_id`(`scd2_is_current=1`)
|
||||
- **充值记录**:`billiards_dwd.dwd_recharge_order`
|
||||
条件:`settle_type = 5` 且 `pay_time >= now - lookback_days`
|
||||
- 计算粒度为 `(member_id, assistant_id)`
|
||||
|
||||
### 4.2 会话合并
|
||||
|
||||
以 `(member_id, assistant_id)` 分组,按 `start_use_time` 排序:
|
||||
- **间隔 ≤ session_merge_hours**(默认 4 小时)视为同一会话
|
||||
- 合并后:
|
||||
- `session_end` 取最大结束时间
|
||||
- `duration` 累加
|
||||
- `course_weight` 取最大值(附加课权重更高)
|
||||
- `is_incentive` 取 OR
|
||||
- 课型权重:
|
||||
- `BONUS`:`incentive_weight`(默认 1.5)
|
||||
- 其他:权重 1.0
|
||||
|
||||
### 4.3 归因充值
|
||||
|
||||
从 `dwd_recharge_order` 取近 `lookback_days` 天充值记录(`settle_type=5`):
|
||||
- 若充值发生在某会话结束后的 **recharge_attribute_hours**(默认 1 小时)内,归因为该助教
|
||||
- 单笔充值在该 `(member_id, assistant_id)` 对内只计一次
|
||||
|
||||
### 4.4 分项得分
|
||||
|
||||
所有 `days_ago` 均截断到 `<= lookback_days`。
|
||||
|
||||
**F:频次强度**
|
||||
```
|
||||
F = Σ( τ_i * decay(days_ago_i; h_sess) )
|
||||
```
|
||||
|
||||
**R:最近温度**
|
||||
```
|
||||
R = decay(min(d_last, lookback_days); h_last)
|
||||
```
|
||||
|
||||
**M:归因充值强度**
|
||||
```
|
||||
M = Σ( ln(1 + amt/A0) * decay(min(days_ago, lookback_days); h_pay) )
|
||||
```
|
||||
|
||||
**D:时长贡献**
|
||||
```
|
||||
D = Σ( sqrt(dur_hours) * τ_i * decay(days_ago_i; h_sess) )
|
||||
```
|
||||
|
||||
**burst:频率激增放大**
|
||||
```
|
||||
F_short = Σ( τ_i * decay(days_ago_i; h_short) )
|
||||
F_long = Σ( τ_i * decay(days_ago_i; h_long) )
|
||||
ratio = F_short / (F_long + 1e-6)
|
||||
burst = max(0, ln(1 + (ratio - 1)))
|
||||
mult = 1 + γ * burst
|
||||
```
|
||||
|
||||
### 4.5 Raw Score 与 Display Score
|
||||
|
||||
```
|
||||
INTIMACY_raw = (w_F*F + w_R*R + w_M*M + w_D*D) * mult
|
||||
```
|
||||
|
||||
Display Score 使用 `BaseIndexTask` 的分位截断 + 压缩 + MinMax 映射到 0–10,并可选 EWMA 平滑(见第 1/5 节通用说明)。
|
||||
|
||||
### 4.6 输出字段
|
||||
|
||||
写入表:`billiards_dws.dws_member_assistant_intimacy`,主要字段:
|
||||
- 会话统计:`session_count`、`total_duration_minutes`、`basic_session_count`、`incentive_session_count`
|
||||
- 最近与充值:`days_since_last_session`、`attributed_recharge_count`、`attributed_recharge_amount`
|
||||
- 分项得分:`score_frequency`、`score_recency`、`score_recharge`、`score_duration`、`burst_multiplier`
|
||||
- 汇总:`raw_score`、`display_score`
|
||||
|
||||
### 4.7 INTIMACY 默认参数
|
||||
|
||||
| 参数 | 默认值 | 含义 |
|
||||
|---|---:|---|
|
||||
| `lookback_days` | 60 | 回看窗口(天) |
|
||||
| `session_merge_hours` | 4 | 会话合并间隔(小时) |
|
||||
| `recharge_attribute_hours` | 1 | 充值归因窗口(小时) |
|
||||
| `amount_base` | 500 | 充值强度压缩基数 |
|
||||
| `incentive_weight` | 1.5 | 附加课权重 |
|
||||
| `halflife_session` | 14 | 会话衰减半衰期 |
|
||||
| `halflife_last` | 10 | 最近服务衰减半衰期 |
|
||||
| `halflife_recharge` | 21 | 充值衰减半衰期 |
|
||||
| `halflife_short` | 7 | 短期频次半衰期 |
|
||||
| `halflife_long` | 30 | 长期频次半衰期 |
|
||||
| `weight_frequency` | 2.0 | F 权重 |
|
||||
| `weight_recency` | 1.5 | R 权重 |
|
||||
| `weight_recharge` | 2.0 | M 权重 |
|
||||
| `weight_duration` | 0.5 | D 权重 |
|
||||
| `burst_gamma` | 0.6 | 激增放大系数 |
|
||||
| `percentile_lower` | 5 | 下分位(P5) |
|
||||
| `percentile_upper` | 95 | 上分位(P95) |
|
||||
| `compression_mode` | 1 | 压缩方式(1=log1p) |
|
||||
| `use_smoothing` | 1 | 是否启用 EWMA |
|
||||
| `ewma_alpha` | 0.2 | 分位平滑系数 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 映射与参数配置
|
||||
|
||||
### 5.1 映射流程
|
||||
|
||||
1) 计算 Raw Score
|
||||
2) 计算 P5/P95
|
||||
3) Winsorize 截断
|
||||
4) 可选压缩(`none/log1p/asinh`)
|
||||
5) MinMax → `[0, 10]`
|
||||
6) 可选 EWMA 平滑(`use_smoothing` + `ewma_alpha`)
|
||||
|
||||
### 5.2 参数来源
|
||||
|
||||
参数来自 `billiards_dws.cfg_index_parameters`,按 `index_type` 加载,默认值见代码:
|
||||
- **WBI 关键参数**:`lookback_days_recency`、`overdue_alpha`、`overdue_weight_halflife_days`、`h_recharge`、`w_over/w_drop/w_re/w_value`
|
||||
- **NCI 关键参数**:`no_touch_days_new`、`t2_target_days`、`salvage_start/end`、`w_welcome/w_need/w_re/w_value`
|
||||
- **INTIMACY 关键参数**:`halflife_session/last/recharge/short/long`、`amount_base`、`incentive_weight`、`weight_*`、`burst_gamma`
|
||||
- **通用参数**:`percentile_lower/upper`、`compression_mode`、`use_smoothing`、`ewma_alpha`
|
||||
|
||||
`compression_mode` 取值:
|
||||
- `0`:不压缩
|
||||
- `1`:log1p
|
||||
- `2`:asinh
|
||||
|
||||
### 5.3 参数优先级
|
||||
|
||||
- 先用代码默认参数(`DEFAULT_PARAMS`)
|
||||
- 再用数据库参数覆盖(`cfg_index_parameters`,取 `effective_from <= CURRENT_DATE` 且未过期,同名参数取最近生效的一条)
|
||||
- GUI/环境变量可通过 `run.index_lookback_days` 覆盖 recency 窗口
|
||||
|
||||
即:**GUI/环境变量 > DB > 代码默认值**。
|
||||
|
||||
---
|
||||
|
||||
## 6. 运行与覆盖策略
|
||||
|
||||
- WBI/NCI:默认"每 2 小时"计算(由任务描述定义)
|
||||
- INTIMACY:默认"每 4 小时"计算(由任务描述定义)
|
||||
- 写入方式:对本次参与计算的实体进行 **delete-before-insert** 覆盖写入
|
||||
(不在窗口内的实体不会被重算)
|
||||
328
docs/index/index_tables.md
Normal file
328
docs/index/index_tables.md
Normal file
@@ -0,0 +1,328 @@
|
||||
# Index Tables
|
||||
|
||||
Generated at: 2026-02-06 23:15:35
|
||||
|
||||
## 1) WBI
|
||||
|
||||
| member_name | wbi | raw_score | t_v | visits_14d | sv_balance |
|
||||
|---|---:|---:|---:|---:|---:|
|
||||
| 清 | 10.00 | 5.026516 | 31.00 | 0 | 1944.76 |
|
||||
| 陈德韩 | 10.00 | 5.762521 | 46.00 | 0 | 20.11 |
|
||||
| 林总 | 10.00 | 5.783089 | 23.00 | 0 | 15617.70 |
|
||||
| 刘哥 | 10.00 | 5.159391 | 48.00 | 0 | 371.51 |
|
||||
| T | 9.38 | 4.712542 | 48.00 | 0 | 0.00 |
|
||||
| 昌哥 | 8.75 | 4.395994 | 30.00 | 0 | 2374.99 |
|
||||
| 林先生 | 8.74 | 4.391232 | 39.00 | 0 | 0.00 |
|
||||
| 王先生 | 7.83 | 3.933276 | 32.00 | 0 | 0.00 |
|
||||
| 黄先生 | 7.55 | 3.792699 | 28.00 | 0 | 0.00 |
|
||||
| 桂先生 | 7.04 | 3.540387 | 51.00 | 0 | 0.00 |
|
||||
| 孟紫龙 | 6.94 | 3.486349 | 40.00 | 0 | 0.00 |
|
||||
| 候 | 6.41 | 3.220067 | 50.00 | 0 | 0.00 |
|
||||
| 周先生 | 6.39 | 3.214255 | 17.00 | 0 | 0.00 |
|
||||
| 郑先生 | 6.18 | 3.108184 | 56.00 | 0 | 0.00 |
|
||||
| 小熊 | 5.99 | 3.010369 | 20.00 | 0 | 0.00 |
|
||||
| 阿亮 | 5.76 | 2.893061 | 27.00 | 0 | 612.33 |
|
||||
| 胡总 | 5.74 | 2.884418 | 40.00 | 0 | 0.00 |
|
||||
| 张先生 | 5.42 | 2.724779 | 49.00 | 0 | 0.00 |
|
||||
| 游 | 4.91 | 2.466520 | 55.00 | 0 | 0.00 |
|
||||
| 方先生 | 4.80 | 2.411724 | 47.00 | 0 | 0.00 |
|
||||
| 罗先生 | 4.66 | 2.342436 | 26.00 | 0 | 46.67 |
|
||||
| 李先生 | 4.45 | 2.236351 | 36.00 | 0 | 417.63 |
|
||||
| 孙启明 | 4.36 | 2.189163 | 48.00 | 0 | 0.00 |
|
||||
| 黄国磊 | 4.36 | 2.189715 | 56.00 | 0 | 0.22 |
|
||||
| 李 | 4.35 | 2.188996 | 42.00 | 0 | 0.00 |
|
||||
| 老宋 | 4.34 | 2.179315 | 41.00 | 0 | 2126.14 |
|
||||
| 张丹逸 | 3.57 | 1.796883 | 26.00 | 0 | 0.00 |
|
||||
| 黄先生 | 3.28 | 1.647760 | 51.00 | 0 | 4.01 |
|
||||
| 林先生 | 3.02 | 1.516311 | 19.00 | 0 | 1.58 |
|
||||
| 罗超 | 2.34 | 1.176384 | 18.00 | 0 | 0.00 |
|
||||
| 卢广贤 | 2.06 | 1.033531 | 20.00 | 0 | 0.00 |
|
||||
| 陈 | 1.37 | 0.688561 | 35.00 | 0 | 0.00 |
|
||||
| 陈先生 | 1.07 | 0.537345 | 29.00 | 0 | 170.32 |
|
||||
| 魏先生 | 0.85 | 0.427303 | 28.00 | 0 | 84.51 |
|
||||
| 刘女士 | 0.38 | 0.188721 | 32.00 | 0 | 0.00 |
|
||||
| 陈淑涛 | 0.00 | 0.000000 | 5.00 | 1 | 0.00 |
|
||||
| 肖先生 | 0.00 | 0.000000 | 10.00 | 1 | 0.00 |
|
||||
| 李先生 | 0.00 | 0.000000 | 11.00 | 1 | 2433.01 |
|
||||
| 林先生 | 0.00 | 0.000000 | 6.00 | 1 | 0.00 |
|
||||
| 陈小姐 | 0.00 | 0.000000 | 8.00 | 1 | 511.97 |
|
||||
| 周周 | 0.00 | 0.000000 | 10.00 | 1 | 31.06 |
|
||||
| 曾先生 | 0.00 | 0.000000 | 11.00 | 1 | 303.19 |
|
||||
| 明哥 | 0.00 | 0.000000 | 7.00 | 3 | 559.16 |
|
||||
| 唐先生 | 0.00 | 0.000000 | 12.00 | 1 | 0.00 |
|
||||
| 曾巧明 | 0.00 | 0.000000 | 7.00 | 3 | 0.00 |
|
||||
| 黄生 | 0.00 | 0.000000 | 2.00 | 5 | 0.00 |
|
||||
| 叶先生 | 0.00 | 0.000000 | 12.00 | 1 | 0.00 |
|
||||
| 谢俊 | 0.00 | 0.000000 | 2.00 | 5 | 0.00 |
|
||||
| 吴生 | 0.00 | 0.000000 | 7.00 | 2 | 3680.65 |
|
||||
| 艾宇民 | 0.00 | 0.000000 | 2.00 | 4 | 0.00 |
|
||||
| 潘先生 | 0.00 | 0.000000 | 10.00 | 1 | 0.00 |
|
||||
| 林志铭 | 0.00 | 0.000000 | 13.00 | 1 | 795.66 |
|
||||
| 王龙 | 0.00 | 0.000000 | 13.00 | 1 | 0.00 |
|
||||
| 陈腾鑫 | 0.00 | 0.000000 | 9.00 | 2 | 0.00 |
|
||||
| 蔡总 | 0.00 | 0.000000 | 6.00 | 2 | 2016.18 |
|
||||
| 小燕 | 0.00 | 0.000000 | 1.00 | 9 | 768.66 |
|
||||
| 张先生 | 0.00 | 0.000000 | 3.00 | 7 | 920.18 |
|
||||
| 葛先生 | 0.00 | 0.000000 | 1.00 | 14 | 3675.52 |
|
||||
| 李先生 | 0.00 | 0.000000 | 4.00 | 1 | 0.00 |
|
||||
| 轩哥 | 0.00 | 0.000000 | 3.00 | 6 | 4197.91 |
|
||||
| 陈先生 | 0.00 | 0.000000 | 7.00 | 2 | 903.82 |
|
||||
| 范先生 | 0.00 | 0.000000 | 4.00 | 2 | 0.00 |
|
||||
| 常总 | 0.00 | 0.000000 | 2.00 | 3 | 1678.15 |
|
||||
| 梅 | 0.00 | 0.000000 | 3.00 | 2 | 2050.00 |
|
||||
| 江先生 | 0.00 | 0.000000 | 6.00 | 1 | 589.66 |
|
||||
| 曾丹烨 | 0.00 | 0.000000 | 2.00 | 7 | 3535.39 |
|
||||
| 罗先生 | 0.00 | 0.000000 | 4.00 | 4 | 0.00 |
|
||||
| 胡先生 | 0.00 | 0.000000 | 4.00 | 3 | 0.00 |
|
||||
| 柳先生 | 0.00 | 0.000000 | 5.00 | 1 | 163.02 |
|
||||
| 陈泽斌 | 0.00 | 0.000000 | 5.00 | 1 | 0.00 |
|
||||
|
||||
Total rows: 70
|
||||
|
||||
## 2) NCI
|
||||
|
||||
| member_name | nci | welcome | convert | raw_total | raw_welcome | raw_convert | t_v | visits_14d |
|
||||
|---|---:|---:|---:|---:|---:|---:|---:|---:|
|
||||
| 章先生 | 10.00 | 0.00 | 10.00 | 3.034138 | 0.000000 | 3.034138 | 20.00 | 0 |
|
||||
| 吴先生 | 8.39 | 0.00 | 8.39 | 2.555549 | 0.000000 | 2.555549 | 60.00 | 0 |
|
||||
| 孙总 | 8.02 | 0.00 | 8.02 | 2.445496 | 0.000000 | 2.445496 | 11.00 | 3 |
|
||||
| 黄先生 | 7.06 | 0.00 | 7.06 | 2.157709 | 0.000000 | 2.157709 | 20.00 | 0 |
|
||||
| 王 | 6.51 | 0.00 | 6.51 | 1.995293 | 0.000000 | 1.995293 | 33.00 | 0 |
|
||||
| 枫先生 | 6.33 | 0.00 | 6.33 | 1.941223 | 0.000000 | 1.941223 | 28.00 | 0 |
|
||||
| 张无忌 | 5.98 | 0.00 | 5.98 | 1.836389 | 0.000000 | 1.836389 | 20.00 | 0 |
|
||||
| 董贝 | 5.06 | 0.00 | 5.06 | 1.562468 | 0.000000 | 1.562468 | 12.00 | 1 |
|
||||
| 彭先生 | 4.83 | 0.00 | 4.83 | 1.493333 | 0.000000 | 1.493333 | 32.00 | 0 |
|
||||
| 孙先生 | 4.15 | 0.00 | 4.15 | 1.291974 | 0.000000 | 1.291974 | 55.00 | 0 |
|
||||
| 李先生 | 3.80 | 0.00 | 3.80 | 1.186517 | 0.000000 | 1.186517 | 10.00 | 1 |
|
||||
| 潘先生 | 3.38 | 0.00 | 3.38 | 1.062671 | 0.000000 | 1.062671 | 55.00 | 0 |
|
||||
| 王先生 | 3.22 | 0.00 | 3.22 | 1.013333 | 0.000000 | 1.013333 | 41.00 | 0 |
|
||||
| 袁 | 2.86 | 0.00 | 2.86 | 0.907769 | 0.000000 | 0.907769 | 4.00 | 1 |
|
||||
| 陈先生 | 1.96 | 0.00 | 1.96 | 0.640000 | 0.000000 | 0.640000 | 48.00 | 0 |
|
||||
| 公孙先生 | 0.94 | 0.00 | 0.94 | 0.333754 | 0.000000 | 0.333754 | 5.00 | 2 |
|
||||
| 胡先生 | 0.00 | 0.00 | 0.00 | 0.054797 | 0.000000 | 0.054797 | 2.00 | 8 |
|
||||
|
||||
Total rows: 17
|
||||
|
||||
## 3) Intimacy
|
||||
|
||||
| assistant | member | intimacy | sessions | recharge_amount |
|
||||
|---|---|---:|---:|---:|
|
||||
| 小燕 | 葛先生 | 10.00 | 50 | 43000.00 |
|
||||
| 七七 | 轩哥 | 10.00 | 41 | 23000.00 |
|
||||
| 佳怡 | 罗先生 | 10.00 | 39 | 20000.00 |
|
||||
| 璇子 | 轩哥 | 10.00 | 20 | 18000.00 |
|
||||
| 阿清 | 张先生 | 10.00 | 18 | 0.00 |
|
||||
| 小燕 | 小燕 | 10.00 | 17 | 0.00 |
|
||||
| 璇子 | 江先生 | 10.00 | 14 | 6000.00 |
|
||||
| 千千 | 张先生 | 10.00 | 12 | 0.00 |
|
||||
| 婉婉 | 吴先生 | 10.00 | 10 | 0.00 |
|
||||
| 千千 | 梅 | 10.00 | 10 | 3000.00 |
|
||||
| 球球 | 罗先生 | 10.00 | 6 | 9000.00 |
|
||||
| 周周 | 周周 | 9.93 | 16 | 7000.00 |
|
||||
| 佳怡 | 陈先生 | 9.82 | 5 | 3000.00 |
|
||||
| 涛涛 | 轩哥 | 9.70 | 8 | 5000.00 |
|
||||
| 年糕 | 葛先生 | 9.62 | 8 | 0.00 |
|
||||
| 涛涛 | 蔡总 | 9.57 | 11 | 25000.00 |
|
||||
| 阿清 | 胡先生 | 9.48 | 5 | 3000.00 |
|
||||
| 佳怡 | 陈腾鑫 | 9.38 | 7 | 4000.00 |
|
||||
| 小柔 | 蔡总 | 9.03 | 8 | 33000.00 |
|
||||
| 年糕 | 常总 | 8.47 | 5 | 0.00 |
|
||||
| 小侯 | 张先生 | 8.21 | 15 | 0.00 |
|
||||
| 阿清 | 葛先生 | 8.20 | 7 | 10000.00 |
|
||||
| 佳怡 | 小熊 | 8.12 | 5 | 7000.00 |
|
||||
| 周周 | 罗先生 | 8.07 | 4 | 6000.00 |
|
||||
| 阿清 | 孙总 | 8.04 | 4 | 0.00 |
|
||||
| 阿清 | 梅 | 7.96 | 4 | 3000.00 |
|
||||
| 千千 | 周先生 | 7.87 | 12 | 1000.00 |
|
||||
| 球球 | 周周 | 7.84 | 9 | 4000.00 |
|
||||
| 球球 | 轩哥 | 7.75 | 5 | 0.00 |
|
||||
| 小柔 | 轩哥 | 7.75 | 5 | 0.00 |
|
||||
| 小侯 | 李先生 | 7.42 | 11 | 6000.00 |
|
||||
| 小柔 | 明哥 | 7.36 | 6 | 3000.00 |
|
||||
| 乔西 | 陈先生 | 7.34 | 1 | 3000.00 |
|
||||
| 婉婉 | 明哥 | 7.29 | 4 | 3000.00 |
|
||||
| 璇子 | 蔡总 | 7.25 | 8 | 25000.00 |
|
||||
| 七七 | 蔡总 | 7.08 | 8 | 25000.00 |
|
||||
| 七七 | 胡先生 | 7.00 | 2 | 3000.00 |
|
||||
| 千千 | 孙总 | 6.97 | 3 | 0.00 |
|
||||
| 佳怡 | 胡先生 | 6.89 | 1 | 3000.00 |
|
||||
| 千千 | 小熊 | 6.87 | 4 | 3000.00 |
|
||||
| 阿清 | 小燕 | 6.87 | 2 | 0.00 |
|
||||
| 周周 | 常总 | 6.63 | 4 | 0.00 |
|
||||
| 涛涛 | 小燕 | 6.44 | 2 | 0.00 |
|
||||
| 阿清 | 轩哥 | 6.39 | 2 | 0.00 |
|
||||
| 年糕 | 叶先生 | 6.39 | 1 | 3000.00 |
|
||||
| 球球 | 张先生 | 6.28 | 5 | 0.00 |
|
||||
| 周周 | 张先生 | 6.21 | 5 | 0.00 |
|
||||
| 球球 | 小熊 | 5.97 | 3 | 4000.00 |
|
||||
| 乔西 | 罗先生 | 5.97 | 1 | 3000.00 |
|
||||
| 小侯 | 胡先生 | 5.96 | 2 | 3000.00 |
|
||||
| 球球 | 胡先生 | 5.68 | 1 | 0.00 |
|
||||
| 球球 | 孙总 | 5.63 | 2 | 0.00 |
|
||||
| 璇子 | 孙总 | 5.55 | 2 | 0.00 |
|
||||
| 千千 | 胡先生 | 5.30 | 2 | 0.00 |
|
||||
| 婉婉 | 章先生 | 5.22 | 1 | 3000.00 |
|
||||
| 婉婉 | 公孙先生 | 5.17 | 1 | 3000.00 |
|
||||
| 菲菲 | 陈腾鑫 | 5.15 | 1 | 1000.00 |
|
||||
| 千千 | 小燕 | 5.15 | 1 | 0.00 |
|
||||
| 千千 | 公孙先生 | 5.14 | 1 | 0.00 |
|
||||
| 阿清 | 清 | 5.11 | 6 | 3000.00 |
|
||||
| 苏苏 | 蔡总 | 5.01 | 3 | 10000.00 |
|
||||
| 周周 | 林先生 | 4.98 | 1 | 0.00 |
|
||||
| 球球 | 江先生 | 4.84 | 1 | 0.00 |
|
||||
| 七七 | 小燕 | 4.84 | 1 | 0.00 |
|
||||
| 凤梨 | 葛先生 | 4.79 | 2 | 0.00 |
|
||||
| 佳怡 | 轩哥 | 4.78 | 2 | 0.00 |
|
||||
| 年糕 | 小燕 | 4.70 | 1 | 0.00 |
|
||||
| 涛涛 | 罗先生 | 4.67 | 4 | 0.00 |
|
||||
| 年糕 | 轩哥 | 4.62 | 2 | 0.00 |
|
||||
| 婉婉 | 孙总 | 4.60 | 2 | 0.00 |
|
||||
| 佳怡 | 周周 | 4.55 | 3 | 8000.00 |
|
||||
| yy | 公孙先生 | 4.47 | 1 | 0.00 |
|
||||
| 周周 | 林先生 | 4.36 | 1 | 1000.00 |
|
||||
| 年糕 | 王 | 4.30 | 2 | 3000.00 |
|
||||
| 七七 | 江先生 | 4.17 | 2 | 0.00 |
|
||||
| 周周 | 轩哥 | 4.16 | 4 | 0.00 |
|
||||
| 七七 | 孙总 | 4.14 | 1 | 0.00 |
|
||||
| 年糕 | 李先生 | 4.08 | 1 | 0.00 |
|
||||
| 涛涛 | 叶先生 | 4.02 | 1 | 0.00 |
|
||||
| 婉婉 | 叶先生 | 4.02 | 1 | 0.00 |
|
||||
| yy | 叶先生 | 4.01 | 1 | 0.00 |
|
||||
| 凤梨 | 叶先生 | 4.01 | 1 | 0.00 |
|
||||
| 小侯 | 葛先生 | 3.98 | 2 | 0.00 |
|
||||
| 佳怡 | 林志铭 | 3.95 | 1 | 0.00 |
|
||||
| 千千 | 黄先生 | 3.90 | 4 | 1000.00 |
|
||||
| 婉婉 | 葛先生 | 3.89 | 2 | 0.00 |
|
||||
| 苏苏 | 罗先生 | 3.86 | 3 | 3000.00 |
|
||||
| 苏苏 | 黄先生 | 3.83 | 8 | 0.00 |
|
||||
| 周周 | 小熊 | 3.81 | 2 | 0.00 |
|
||||
| 涛涛 | 孙总 | 3.68 | 1 | 0.00 |
|
||||
| 年糕 | 胡先生 | 3.67 | 1 | 1000.00 |
|
||||
| 吱吱 | 李先生 | 3.67 | 1 | 0.00 |
|
||||
| 周周 | 葛先生 | 3.66 | 1 | 0.00 |
|
||||
| 婉婉 | 王 | 3.62 | 1 | 3000.00 |
|
||||
| 婉婉 | 轩哥 | 3.56 | 1 | 0.00 |
|
||||
| 千千 | 蔡总 | 3.56 | 1 | 0.00 |
|
||||
| 吱吱 | 葛先生 | 3.50 | 1 | 0.00 |
|
||||
| 阿清 | 陈腾鑫 | 3.47 | 3 | 1000.00 |
|
||||
| 璇子 | 罗先生 | 3.43 | 3 | 5000.00 |
|
||||
| 乔西 | 蔡总 | 3.35 | 1 | 13000.00 |
|
||||
| yy | 张先生 | 3.34 | 1 | 0.00 |
|
||||
| yy | 葛先生 | 3.28 | 1 | 0.00 |
|
||||
| Amy | 轩哥 | 3.19 | 1 | 3000.00 |
|
||||
| 乔西 | 葛先生 | 3.09 | 2 | 0.00 |
|
||||
| 周周 | 江先生 | 3.07 | 1 | 0.00 |
|
||||
| 年糕 | 范先生 | 2.98 | 1 | 1000.00 |
|
||||
| yy | 林志铭 | 2.98 | 1 | 0.00 |
|
||||
| 阿清 | 黄先生 | 2.95 | 3 | 0.00 |
|
||||
| 年糕 | 罗超 | 2.93 | 1 | 0.00 |
|
||||
| 年糕 | 艾宇民 | 2.92 | 1 | 0.00 |
|
||||
| 七七 | 张先生 | 2.89 | 2 | 0.00 |
|
||||
| 凤梨 | 林先生 | 2.88 | 1 | 0.00 |
|
||||
| 七七 | 罗超 | 2.87 | 1 | 0.00 |
|
||||
| 璇子 | 张先生 | 2.87 | 1 | 0.00 |
|
||||
| 球球 | 常总 | 2.83 | 2 | 0.00 |
|
||||
| 乔西 | 轩哥 | 2.77 | 2 | 0.00 |
|
||||
| yy | 孙总 | 2.77 | 1 | 0.00 |
|
||||
| 年糕 | 小熊 | 2.72 | 1 | 0.00 |
|
||||
| 七七 | 葛先生 | 2.71 | 1 | 0.00 |
|
||||
| 千千 | 李先生 | 2.62 | 1 | 0.00 |
|
||||
| 七七 | 罗先生 | 2.62 | 1 | 5000.00 |
|
||||
| 小琳 | 轩哥 | 2.52 | 1 | 0.00 |
|
||||
| 年糕 | 胡总 | 2.48 | 2 | 1000.00 |
|
||||
| 苏苏 | 柳先生 | 2.42 | 2 | 0.00 |
|
||||
| 涛涛 | 葛先生 | 2.39 | 1 | 10000.00 |
|
||||
| 小侯 | 轩哥 | 2.38 | 2 | 0.00 |
|
||||
| 千千 | 葛先生 | 2.37 | 2 | 0.00 |
|
||||
| 七七 | 林总 | 2.35 | 1 | 0.00 |
|
||||
| 乔西 | 小熊 | 2.34 | 1 | 0.00 |
|
||||
| 小琳 | 林总 | 2.26 | 1 | 0.00 |
|
||||
| 璇子 | 周周 | 2.19 | 1 | 0.00 |
|
||||
| 阿清 | 王先生 | 2.17 | 2 | 0.00 |
|
||||
| 阿清 | 罗先生 | 2.15 | 1 | 0.00 |
|
||||
| 瑶瑶 | 蔡总 | 2.12 | 1 | 10000.00 |
|
||||
| 小柳 | 轩哥 | 2.12 | 1 | 0.00 |
|
||||
| 小琳 | 陈腾鑫 | 2.11 | 1 | 0.00 |
|
||||
| 千千 | 轩哥 | 2.00 | 1 | 0.00 |
|
||||
| 年糕 | 罗先生 | 1.95 | 1 | 0.00 |
|
||||
| 乔西 | 陈德韩 | 1.87 | 2 | 539.00 |
|
||||
| 千千 | 陈先生 | 1.83 | 1 | 0.00 |
|
||||
| 阿清 | 枫先生 | 1.79 | 1 | 0.00 |
|
||||
| 千千 | 枫先生 | 1.79 | 1 | 0.00 |
|
||||
| 乔西 | 张无忌 | 1.74 | 1 | 0.00 |
|
||||
| 千千 | 范先生 | 1.71 | 1 | 0.00 |
|
||||
| 周周 | T | 1.61 | 3 | 0.00 |
|
||||
| 婉婉 | 江先生 | 1.61 | 1 | 3000.00 |
|
||||
| 涛涛 | 胡总 | 1.60 | 1 | 1000.00 |
|
||||
| 苏苏 | 周周 | 1.59 | 1 | 0.00 |
|
||||
| 小侯 | 周先生 | 1.54 | 2 | 0.00 |
|
||||
| 小侯 | 梅 | 1.54 | 1 | 0.00 |
|
||||
| 苏苏 | 林先生 | 1.43 | 2 | 0.00 |
|
||||
| 小侯 | 清 | 1.43 | 1 | 3000.00 |
|
||||
| 千千 | 清 | 1.43 | 1 | 3000.00 |
|
||||
| 小侯 | 彭先生 | 1.35 | 1 | 0.00 |
|
||||
| 千千 | 林总 | 1.21 | 1 | 0.00 |
|
||||
| 佳怡 | 彭先生 | 1.15 | 1 | 0.00 |
|
||||
| 婉婉 | 周先生 | 1.13 | 1 | 0.00 |
|
||||
| 苏苏 | 周先生 | 1.07 | 1 | 0.00 |
|
||||
| 周周 | 昌哥 | 1.04 | 1 | 0.00 |
|
||||
| 球球 | 蔡总 | 1.01 | 1 | 0.00 |
|
||||
| 苏苏 | 张先生 | 1.00 | 2 | 0.00 |
|
||||
| 苏苏 | 李先生 | 0.98 | 1 | 0.00 |
|
||||
| 小敌 | 李先生 | 0.95 | 1 | 0.00 |
|
||||
| 婉婉 | 刘哥 | 0.93 | 2 | 0.00 |
|
||||
| 球球 | T | 0.87 | 2 | 0.00 |
|
||||
| 布丁 | 张先生 | 0.85 | 1 | 0.00 |
|
||||
| 周周 | 林总 | 0.85 | 1 | 0.00 |
|
||||
| 嘉嘉 | 轩哥 | 0.82 | 1 | 0.00 |
|
||||
| 小柔 | 葛先生 | 0.81 | 1 | 0.00 |
|
||||
| 乔西 | 张先生 | 0.80 | 2 | 0.00 |
|
||||
| 球球 | 候 | 0.76 | 2 | 0.00 |
|
||||
| 小侯 | T | 0.73 | 2 | 0.00 |
|
||||
| 嘉嘉 | 罗先生 | 0.73 | 1 | 0.00 |
|
||||
| 小侯 | 黄先生 | 0.73 | 1 | 0.00 |
|
||||
| 小敌 | 林先生 | 0.71 | 1 | 0.00 |
|
||||
| 球球 | 葛先生 | 0.70 | 2 | 0.00 |
|
||||
| 乔西 | T | 0.69 | 2 | 0.00 |
|
||||
| 球球 | 老宋 | 0.66 | 1 | 0.00 |
|
||||
| 乔西 | 林先生 | 0.60 | 1 | 0.00 |
|
||||
| 佳怡 | T | 0.56 | 2 | 0.00 |
|
||||
| 小怡 | 张先生 | 0.56 | 1 | 0.00 |
|
||||
| 年糕 | 张先生 | 0.53 | 1 | 0.00 |
|
||||
| 阿清 | 李先生 | 0.49 | 1 | 0.00 |
|
||||
| 球球 | 黄先生 | 0.47 | 1 | 0.00 |
|
||||
| 球球 | 林总 | 0.45 | 1 | 0.00 |
|
||||
| 小敌 | 郑先生 | 0.41 | 2 | 0.00 |
|
||||
| 小侯 | 艾宇民 | 0.41 | 1 | 0.00 |
|
||||
| 婉婉 | 常总 | 0.41 | 1 | 0.00 |
|
||||
| 小怡 | 周先生 | 0.40 | 1 | 0.00 |
|
||||
| 千千 | 罗先生 | 0.39 | 1 | 0.00 |
|
||||
| 球球 | 小燕 | 0.35 | 1 | 0.00 |
|
||||
| 年糕 | 周先生 | 0.34 | 1 | 0.00 |
|
||||
| 小燕 | 罗先生 | 0.32 | 1 | 0.00 |
|
||||
| 小敌 | 刘哥 | 0.30 | 1 | 0.00 |
|
||||
| 小柔 | 孟紫龙 | 0.27 | 1 | 0.00 |
|
||||
| 阿清 | 候 | 0.25 | 1 | 0.00 |
|
||||
| 乔西 | 候 | 0.22 | 1 | 0.00 |
|
||||
| 小敌 | 张先生 | 0.19 | 1 | 0.00 |
|
||||
| 千千 | T | 0.19 | 1 | 0.00 |
|
||||
| 苏苏 | 葛先生 | 0.11 | 1 | 0.00 |
|
||||
| 小侯 | 候 | 0.10 | 1 | 0.00 |
|
||||
| 苏苏 | T | 0.09 | 1 | 0.00 |
|
||||
| 小侯 | 陈腾鑫 | 0.06 | 1 | 0.00 |
|
||||
| 涛涛 | 候 | 0.04 | 1 | 0.00 |
|
||||
| 阿清 | 常总 | 0.03 | 1 | 0.00 |
|
||||
| 苏苏 | 候 | 0.03 | 1 | 0.00 |
|
||||
| 球球 | 李先生 | 0.01 | 1 | 0.00 |
|
||||
| 周周 | 明哥 | 0.00 | 1 | 0.00 |
|
||||
| 梦梦 | 葛先生 | 0.00 | 1 | 0.00 |
|
||||
| 七七 | 林先生 | 0.00 | 1 | 0.00 |
|
||||
| 璇子 | 林先生 | 0.00 | 1 | 0.00 |
|
||||
| 婉婉 | 候 | 0.00 | 1 | 0.00 |
|
||||
| 小柔 | T | 0.00 | 1 | 0.00 |
|
||||
| 年糕 | 潘先生 | 0.00 | 1 | 0.00 |
|
||||
| 涛涛 | 张先生 | 0.00 | 1 | 0.00 |
|
||||
| Amy | 明哥 | 0.00 | 1 | 0.00 |
|
||||
| 年糕 | 明哥 | 0.00 | 1 | 0.00 |
|
||||
|
||||
Total rows: 217
|
||||
297
docs/index/intimacy_index_code_translation.md
Normal file
297
docs/index/intimacy_index_code_translation.md
Normal file
@@ -0,0 +1,297 @@
|
||||
# 亲密指数计算说明(代码翻译版)
|
||||
|
||||
## 1. 目的
|
||||
|
||||
本文档不是“业务口头定义”,而是**按当前代码真实实现**翻译出来的计算逻辑,便于你做以下事情:
|
||||
|
||||
- 跟业务同学对齐“现在系统到底怎么算的”
|
||||
- 排查为什么某个客户-助教分数高/低
|
||||
- 做参数调优前的影响评估
|
||||
|
||||
---
|
||||
|
||||
## 2. 代码入口与依赖
|
||||
|
||||
- 任务主类:`etl_billiards/tasks/dws/index/intimacy_index_task.py`
|
||||
- 指数基类(衰减、分位、映射、平滑):`etl_billiards/tasks/dws/index/base_index_task.py`
|
||||
- 课型映射(BASE/BONUS):`etl_billiards/tasks/dws/base_dws_task.py`
|
||||
- 参数表:`billiards_dws.cfg_index_parameters`
|
||||
- 结果表:`billiards_dws.dws_member_assistant_intimacy`
|
||||
- 分位历史表:`billiards_dws.dws_index_percentile_history`
|
||||
|
||||
执行主流程函数:`IntimacyIndexTask.execute()`
|
||||
|
||||
---
|
||||
|
||||
## 3. 总流程(按代码执行顺序)
|
||||
|
||||
1. 读取门店、租户、参数
|
||||
2. 抽取助教服务记录(近 `lookback_days`)
|
||||
3. 按 `(member_id, assistant_id)` 分组并做“会话合并”
|
||||
4. 做充值归因(服务结束后 `recharge_attribute_hours` 内充值)
|
||||
5. 计算分项分数 `F/R/M/D` 和激增放大 `mult`
|
||||
6. 合成 `raw_score`
|
||||
7. 把 `raw_score` 映射到 `display_score`(0-10)
|
||||
8. 保存分位历史(支持 EWMA 平滑)
|
||||
9. 删除旧记录并写入新记录
|
||||
|
||||
---
|
||||
|
||||
## 4. 数据抽取口径
|
||||
|
||||
### 4.1 服务记录(`_extract_service_records`)
|
||||
|
||||
来源表:`billiards_dwd.dwd_assistant_service_log`,并 `JOIN billiards_dwd.dim_assistant` 获取 `assistant_id`。
|
||||
|
||||
过滤条件:
|
||||
|
||||
- `site_id = 当前门店`
|
||||
- `tenant_member_id > 0`(排除散客)
|
||||
- `is_delete = 0`
|
||||
- `user_id > 0`
|
||||
- `last_use_time` 在 `[now - lookback_days, now)` 内
|
||||
- `dim_assistant.scd2_is_current = 1`
|
||||
|
||||
输出核心字段:
|
||||
|
||||
- `member_id`
|
||||
- `assistant_id`
|
||||
- `assistant_user_id`
|
||||
- `start_time`
|
||||
- `end_time`(对应 `last_use_time`)
|
||||
- `duration_minutes`(`income_seconds / 60`)
|
||||
- `skill_id`
|
||||
|
||||
---
|
||||
|
||||
## 5. 会话合并逻辑(`_group_and_merge_sessions`)
|
||||
|
||||
先按 `(member_id, assistant_id)` 分组,再对每组按 `start_time` 排序后做合并。
|
||||
|
||||
### 5.1 合并规则
|
||||
|
||||
- 相邻两条服务若满足:`next.start_time - current.session_end <= session_merge_hours`(默认 4 小时)
|
||||
- 则视为同一次会话,执行:
|
||||
- `session_end = max(end_time)`
|
||||
- `total_duration_minutes += 当前时长`
|
||||
- `course_weight = max(历史权重, 当前权重)`
|
||||
- `is_incentive = 历史 or 当前`
|
||||
|
||||
### 5.2 课型与权重
|
||||
|
||||
通过 `get_course_type(skill_id)` 决定课型:
|
||||
|
||||
- `BONUS`:权重 `incentive_weight`(默认 1.5)
|
||||
- 其他:权重 1.0
|
||||
|
||||
`get_course_type` 依赖 `cfg_skill_type`。若未命中映射,默认 `BASE`(权重 1.0)。
|
||||
|
||||
### 5.3 会话级统计
|
||||
|
||||
每个客户-助教对会得到:
|
||||
|
||||
- `session_count`
|
||||
- `total_duration_minutes`
|
||||
- `basic_session_count`
|
||||
- `incentive_session_count`
|
||||
- `days_since_last_session`
|
||||
|
||||
---
|
||||
|
||||
## 6. 充值归因逻辑(`_extract_attributed_recharges`)
|
||||
|
||||
来源表:`billiards_dwd.dwd_recharge_order`
|
||||
|
||||
查询条件:
|
||||
|
||||
- `site_id = 当前门店`
|
||||
- `member_id IN 本轮出现的会员`
|
||||
- `settle_type = 5`(充值订单)
|
||||
- `pay_time >= now - lookback_days`
|
||||
|
||||
归因条件(对每笔充值):
|
||||
|
||||
- 找到该会员对应的会话
|
||||
- 若 `session_end <= pay_time` 且 `pay_time - session_end <= recharge_attribute_hours`(默认 1 小时)
|
||||
- 则记为该助教贡献:
|
||||
- `attributed_recharge_count += 1`
|
||||
- `attributed_recharge_amount += pay_amount`
|
||||
- 记录一条 `AttributedRecharge`
|
||||
|
||||
---
|
||||
|
||||
## 7. 分数计算(`_calculate_component_scores`)
|
||||
|
||||
## 7.1 时间衰减函数
|
||||
|
||||
来自 `BaseIndexTask.decay(days, halflife)`:
|
||||
|
||||
`decay(d, h) = exp(-ln(2) * d / h)`
|
||||
|
||||
含义:`d = h` 时权重衰减到 0.5。
|
||||
|
||||
### 7.2 分项定义
|
||||
|
||||
设:
|
||||
|
||||
- `w_i` = 会话权重(1.0 或 1.5)
|
||||
- `d_i` = 会话距今天数(按 `session_end`)
|
||||
- `A0` = `amount_base`(默认 500)
|
||||
|
||||
#### F:频次强度
|
||||
|
||||
`F = sum( w_i * decay(d_i, halflife_session) )`
|
||||
|
||||
#### R:最近温度
|
||||
|
||||
`R = decay(days_since_last_session, halflife_last)`,无最近会话则 0
|
||||
|
||||
#### M:归因充值强度
|
||||
|
||||
对每笔归因充值 `r`:
|
||||
|
||||
`M += ln(1 + pay_amount_r / A0) * decay(days_ago_r, halflife_recharge)`
|
||||
|
||||
#### D:时长贡献
|
||||
|
||||
`D = sum( sqrt(duration_hours_i) * w_i * decay(d_i, halflife_session) )`
|
||||
|
||||
其中 `duration_hours_i = total_duration_minutes_i / 60`
|
||||
|
||||
#### burst 与 mult:激增放大
|
||||
|
||||
先算:
|
||||
|
||||
- `F_short = sum( w_i * decay(d_i, halflife_short) )`
|
||||
- `F_long = sum( w_i * decay(d_i, halflife_long) )`
|
||||
|
||||
再算:
|
||||
|
||||
- `ratio = F_short / (F_long + 1e-6)`
|
||||
- `burst = ln(1 + (ratio - 1))` 当 `ratio > 1`,否则 `0`
|
||||
- `mult = 1 + burst_gamma * burst`
|
||||
|
||||
---
|
||||
|
||||
## 8. Raw Score 合成
|
||||
|
||||
`raw_score = (weight_frequency * F + weight_recency * R + weight_recharge * M + weight_duration * D) * mult`
|
||||
|
||||
默认权重(代码默认值):
|
||||
|
||||
- `weight_frequency = 2.0`
|
||||
- `weight_recency = 1.5`
|
||||
- `weight_recharge = 2.0`
|
||||
- `weight_duration = 0.5`
|
||||
- `burst_gamma = 0.6`
|
||||
|
||||
---
|
||||
|
||||
## 9. Display Score(0-10)映射
|
||||
|
||||
由 `BaseIndexTask.batch_normalize_to_display` 完成。
|
||||
|
||||
1. 收集全体 `raw_score`
|
||||
2. 计算分位点 `q_l/q_u`(默认 P5/P95)
|
||||
3. 可选 EWMA 平滑分位点(`use_smoothing=1` 时)
|
||||
4. Winsorize:`clipped = min(max(raw, q_l), q_u)`
|
||||
5. 可选压缩(`compression_mode`):
|
||||
- `0 -> none`
|
||||
- `1 -> log1p`
|
||||
- `2 -> asinh`
|
||||
6. MinMax 映射到 `[0,10]`
|
||||
7. 四舍五入到 2 位小数
|
||||
|
||||
特殊情况:
|
||||
|
||||
- 若 `max_val - min_val < 1e-6`,直接返回 5.0(避免分母接近 0)
|
||||
|
||||
EWMA 公式:
|
||||
|
||||
`Q_t = (1 - alpha) * Q_{t-1} + alpha * Q_now`,默认 `alpha=0.2`
|
||||
|
||||
---
|
||||
|
||||
## 10. 参数加载优先级
|
||||
|
||||
函数:`_load_params()`
|
||||
|
||||
- 先用代码默认参数(`DEFAULT_PARAMS`)
|
||||
- 再用数据库参数覆盖(`cfg_index_parameters`)
|
||||
|
||||
数据库参数加载规则(`load_index_parameters`):
|
||||
|
||||
- 只取 `effective_from <= CURRENT_DATE` 且 `effective_to` 未过期
|
||||
- 按 `effective_from DESC` 排序
|
||||
- 同名参数取第一条
|
||||
|
||||
即:**DB > 代码默认值**。
|
||||
|
||||
---
|
||||
|
||||
## 11. 持久化逻辑
|
||||
|
||||
函数:`_save_intimacy_data`
|
||||
|
||||
1. 先删除当前门店下本轮 `(member_id, assistant_id)` 对应旧记录
|
||||
2. 再逐条插入新结果
|
||||
3. 插入字段包含:
|
||||
- 输入特征(会话数、时长、归因充值等)
|
||||
- 分项得分(F/R/M/D、burst)
|
||||
- `raw_score/display_score`
|
||||
- 时间戳(`calc_time/created_at/updated_at`)
|
||||
|
||||
唯一键:`(site_id, member_id, assistant_id)`。
|
||||
|
||||
---
|
||||
|
||||
## 12. 默认参数清单(代码 + 种子一致)
|
||||
|
||||
| 参数 | 默认值 | 含义 |
|
||||
|---|---:|---|
|
||||
| `lookback_days` | 60 | 回看窗口(天) |
|
||||
| `session_merge_hours` | 4 | 会话合并间隔(小时) |
|
||||
| `recharge_attribute_hours` | 1 | 充值归因窗口(小时) |
|
||||
| `amount_base` | 500 | 充值强度压缩基数 |
|
||||
| `incentive_weight` | 1.5 | 附加课权重 |
|
||||
| `halflife_session` | 14 | 会话衰减半衰期 |
|
||||
| `halflife_last` | 10 | 最近服务衰减半衰期 |
|
||||
| `halflife_recharge` | 21 | 充值衰减半衰期 |
|
||||
| `halflife_short` | 7 | 短期频次半衰期 |
|
||||
| `halflife_long` | 30 | 长期频次半衰期 |
|
||||
| `weight_frequency` | 2.0 | F 权重 |
|
||||
| `weight_recency` | 1.5 | R 权重 |
|
||||
| `weight_recharge` | 2.0 | M 权重 |
|
||||
| `weight_duration` | 0.5 | D 权重 |
|
||||
| `burst_gamma` | 0.6 | 激增放大系数 |
|
||||
| `percentile_lower` | 5 | 下分位(P5) |
|
||||
| `percentile_upper` | 95 | 上分位(P95) |
|
||||
| `ewma_alpha` | 0.2 | 分位平滑系数 |
|
||||
| `compression_mode` | 1 | 压缩方式(1=log1p) |
|
||||
| `use_smoothing` | 1 | 是否启用 EWMA |
|
||||
|
||||
---
|
||||
|
||||
## 13. 代码语义下的关键注意点(非常重要)
|
||||
|
||||
以下不是业务理想设计,而是“按当前实现”的真实行为:
|
||||
|
||||
1. 课型映射依赖 `cfg_skill_type`
|
||||
- 若 `skill_id` 未映射,默认按 `BASE` 处理(不会给 1.5 权重)。
|
||||
|
||||
2. 会话合并后权重取 `max`
|
||||
- 同一合并会话里如果出现过 `BONUS`,整个会话的 `course_weight` 可能被抬到 1.5。
|
||||
|
||||
3. 充值归因“注释意图”与“实际循环”可能有偏差
|
||||
- 代码注释写“1 笔充值只归因 1 个助教”,
|
||||
- 但 `break` 只跳出“会话循环”,不会跳出“pair 循环”,在特定时序下同一笔充值可能落到多个助教对上。
|
||||
|
||||
4. Display Score 是相对分
|
||||
- 同一人不同批次跑数,若整体分布变化,即使 raw 接近,display 也可能变化(因分位映射)。
|
||||
|
||||
---
|
||||
|
||||
## 14. 一句话总结
|
||||
|
||||
当前亲密指数本质上是:**“近期加权服务频次 + 最近接触 + 归因充值 + 服务时长”** 的加权和,再乘上**短期活跃激增放大因子**,最后经分位截断与归一化映射到 0-10。
|
||||
|
||||
Reference in New Issue
Block a user