对dataframe的某个字段进行排名并计算分值

经常需要用到给dataframe 的某个字段进行排名并按特定规则计算分值。

def calculate_rank_score(df,str_name):
    
    df.sort_values(by=[str_name], inplace=True)

    #给字段进行排名
    df["%s_rank"%str_name] = df[str_name].rank()

    #分值计算规则
    rank_score = lambda x: ((x - np.min(x)) / (np.max(x) - np.min(x))) * 40 + 60
    
    #按照规则计算分值
    df["final_%s_rank_score"%str_name] = df[["%s"%str_name]].apply(rank_score)

    return df

### 如何使用 FineBI 生成 RFM 热力图 #### 数据准备阶段 在生成 RFM 热力图之前,需要先准备好数据集。RFM 模型基于三个核心指标:Recency(最近一次消费时间)、Frequency(消费频率)和 Monetary(消费金额)。这些数据可以从交易记录中提取计算得出[^1]。 为了生成热力图,还需要对这三个指标进行评分处理,例如将每个客户的 Recency、Frequency 和 Monetary 值划分为不同的等级(如 1 到 5 的评分),从而形成一个三维的评分体系。最终的数据应包含每位用户的唯一标识以及对应的 R/F/M 分值。 ```sql -- 示例 SQL 查询语句用于计算 RFM 分值 WITH rfm AS ( SELECT customer_id, DATEDIFF(MAX(order_date), CURRENT_DATE()) AS recency, -- 计算最近购买天数 COUNT(DISTINCT order_id) AS frequency, -- 统计订单数量 SUM(total_amount) AS monetary -- 总消费金额 FROM orders GROUP BY customer_id ), rfm_score AS ( SELECT *, NTILE(5) OVER (ORDER BY recency DESC) AS r_score, -- 对 recency 进行逆序分位排名 NTILE(5) OVER (ORDER BY frequency ASC) AS f_score, -- 对 frequency 正序分位排名 NTILE(5) OVER (ORDER BY monetary ASC) AS m_score -- 对 monetary 正序分位排名 FROM rfm ) SELECT * FROM rfm_score; ``` --- #### 创建热力图步骤 ##### 1. 导入数据源 打开 FineBI 导入已处理好的 RFM 数据集。确保数据集中至少包含以下字段: - `customer_id`:客户唯一标识符; - `r_score`:R 分值; - `f_score`:F 分值; - `m_score`:M 分值。 ##### 2. 配置图表类型 在 FineBI 中选择 **热力图** 图表类型。此图表适用于显示二维平面上的颜色强度差异,能够直观反映不同组合下的密度或权重变化[^1]。 ##### 3. 设置坐标轴映射 设置 X 轴为 F 分值 (`f_score`),Y 轴为 M 分值 (`m_score`) 或者反过来亦可。颜色深浅则由 Z 轴决定,在本案例中可以选择 R 分值 (`r_score`) 来定义单元格填充色阶。 ##### 4. 定义配色方案 调整调色板以增强视觉效果。推荐采用渐变色调比如蓝色系或者红色系来区分高低值区间。这样可以让高价值客户群更加醒目突出。 ##### 5. 添加交互功能 为了让分析更灵活有趣味性,可以启用一些高级特性如工具提示框展示具体数值详情;点击筛选特定群体等功能进一步提升用户体验。 --- #### 示例代码片段 以下是 Python 实现简单版本 RFM 打分逻辑供参考: ```python import pandas as pd data = { 'customer_id': ['C001', 'C002', 'C003'], 'recency': [5, 10, 1], 'frequency': [8, 3, 7], 'monetary': [900, 300, 800] } df = pd.DataFrame(data) # 计算分数 labels = range(1, 6) df['r_score'] = pd.qcut(df['recency'], q=5, labels=reversed(labels)) df['f_score'] = pd.qcut(df['frequency'].rank(method='first'), q=5, labels=labels) df['m_score'] = pd.qcut(df['monetary'].rank(method='first'), q=5, labels=labels) print(df[['customer_id', 'r_score', 'f_score', 'm_score']]) ``` --- #### 注意事项 当构建复杂的多维视图时,请注意保持界面简洁明了以免造成信息过载现象发生。另外由于人类大脑对于面积感知存在偏差因此尽量避免单纯依赖圆形大小传递定量信息而是更多考虑运用其他形式表达方式如长度比例等更为精确可靠方法[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值