从指标生成标签的SQL/Python代码示例
以下是 从指标生成标签的 SQL 与 Python 实用代码示例,覆盖金融、电商、互联网等典型场景,包含 规则法(Rule-based) 和 模型法(Model-based) 两种主流方式。
一、SQL 示例(适用于数仓/BI系统)
场景1:电商用户价值分层(RFM 模型简化版)
指标:最近购买距今天数(Recency)、30天购买次数(Frequency)标签:user_value_level(高价值 / 中价值 / 低价值 / 流失)
-- 假设有一张用户行为汇总表 user_behavior_aggSELECT user_id, recency_days, purchase_freq_30d, CASE WHEN recency_days <= 7 AND purchase_freq_30d >= 3 THEN '高价值' WHEN recency_days <= 30 AND purchase_freq_30d >= 1 THEN '中价值' WHEN recency_days <= 90 THEN '低价值' ELSE '流失' END AS user_value_levelFROM user_behavior_agg;
场景2:金融客户风险标签
指标:近6个月逾期次数、负债收入比(DTI)标签:risk_level(低 / 中 / 高)
SELECT cust_id, overdue_count_6m, dti_ratio, CASE WHEN overdue_count_6m = 0 AND dti_ratio < 0.4 THEN '低风险' WHEN overdue_count_6m <= 2 AND dti_ratio < 0.7 THEN '中风险' ELSE '高风险' END AS risk_levelFROM customer_risk_metrics;
场景3:动态活跃度标签(按周更新)
-- 每周一凌晨跑批,生成本周用户活跃标签INSERT INTO user_active_tag (user_id, active_tag, update_date)SELECT user_id, CASE WHEN login_days_7d >= 5 THEN '重度活跃' WHEN login_days_7d >= 2 THEN '中度活跃' ELSE '低活跃' END AS active_tag, CURRENT_DATE() AS update_dateFROM ( SELECT user_id, COUNT(DISTINCT login_date) AS login_days_7d FROM user_login_log WHERE login_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) GROUP BY user_id) t;
二、Python 示例(适用于建模/自动化标签系统)
环境依赖
import pandas as pdimport numpy as npfrom sklearn.cluster import KMeans
示例1:规则法生成标签(类似SQL逻辑)
# 假设 df 是包含用户指标的DataFramedf = pd.read_csv("user_metrics.csv") # 含字段: user_id, recency, frequency, monetarydef assign_value_tag(row): if row['recency'] <= 7 and row['frequency'] >= 3: return '高价值' elif row['recency'] <= 30 and row['frequency'] >= 1: return '中价值' elif row['recency'] <= 90: return '低价值' else: return '流失'df['user_value_tag'] = df.apply(assign_value_tag, axis=1)# 保存标签结果df[['user_id', 'user_value_tag']].to_csv("user_tags.csv", index=False)
示例2:聚类法生成用户分群标签(无监督)
# 标准化指标(KMeans对量纲敏感)from sklearn.preprocessing import StandardScalermetrics = df[['recency', 'frequency', 'monetary']]scaler = StandardScaler()metrics_scaled = scaler.fit_transform(metrics)# K-Means 聚类(假设分4类)kmeans = KMeans(n_clusters=4, random_state=42)df['cluster_id'] = kmeans.fit_predict(metrics_scaled)# 为聚类结果赋予业务含义cluster_summary = df.groupby('cluster_id')[['recency', 'frequency', 'monetary']].mean()print(cluster_summary)# 手动映射标签(根据均值解释)cluster_label_map = {0: '高价值', 1: '价格敏感', 2: '新客', 3: '流失风险'}df['behavior_tag'] = df['cluster_id'].map(cluster_label_map)df[['user_id', 'behavior_tag']].to_csv("behavior_tags.csv", index=False)
示例3:用分类模型预测“流失标签”(监督学习)
from sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import train_test_split# 假设已有历史数据:features + 是否流失(is_churn)data = pd.read_csv("churn_data.csv")X = data[['login_days_7d', 'avg_session_time', 'support_tickets']]y = data['is_churn'] # 0=未流失, 1=流失# 训练模型X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)model = RandomForestClassifier()model.fit(X_train, y_train)# 对新用户打流失风险标签new_users = pd.read_csv("new_user_metrics.csv")new_users['churn_prob'] = model.predict_proba(new_users[X.columns])[:, 1]new_users['churn_risk_tag'] = np.where(new_users['churn_prob'] > 0.7, '高流失风险', '正常')new_users[['user_id', 'churn_risk_tag']].to_csv("churn_risk_tags.csv", index=False)
三、关键工程实践建议
| |
|---|
| 标签版本管理 | 在标签表中增加 tag_version, effective_date 字段 |
| 性能优化 | SQL 中避免全表扫描;Python 中用 vectorized operations 替代 apply |
| 可解释性 | 规则标签需记录逻辑;模型标签需提供 SHAP/LIME 解释 |
| 调度更新 | 通过 Airflow / DolphinScheduler 每日/每周自动运行标签生成任务 |
| 监控漂移 | 监控标签分布变化(如 PSI),防止业务突变导致标签失效 |
四、输出表示例(标签表结构)
✅ 最佳实践:标签应作为独立数据资产管理,而非临时计算字段。
💡 总结:
- • 简单场景 → 用 SQL 规则(快、透明、易维护)
- • 复杂模式 → 用 Python 模型(精准、可扩展)
免责声明:
本公众号所发布的内容仅为个人学习、研究与交流之用,不构成任何形式的学术、投资、医疗或其他专业建议。文中所涉及的观点、方法和资料均基于公开信息与个人理解,可能存在不完整或偏差之处。读者在参考时请自行甄别和验证,由此产生的任何后果,作者不承担责任(部分内容由AI生成,请注意甄别)。
版权声明:
除特别注明外,本公众号原创内容版权均归作者所有。未经授权,任何机构或个人不得以任何形式转载、引用或用于商业用途。若需转载或引用,请联系作者并注明出处。部分内容如引用自公开资料或网络资源,版权归原作者所有,如有侵权请联系删除。