题解 | #某店铺用户消费特征评分#

某店铺用户消费特征评分

https://www.nowcoder.com/practice/200c824e9ed4428491c27d65ec56067d

import pandas as pd
import numpy as np

pd.set_option("display.max_columns", None)  # 显示所有的列,而不是以……显示
pd.set_option("display.max_rows", None)  # 显示所有的行,而不是以……显示
pd.set_option("display.width", None)  # 不自动换行显示

df = pd.read_csv("sales.csv")


def sales_score(sales):
    """
    为销售数据计算评分

    Parameters:
        sales (pandas.DataFrame): 销售数据

    Returns:
        pandas.DataFrame: 包含每个观测值各项得分的数据帧
    """
    df_down = sales.quantile(0.25)
    df_mid = sales.quantile(0.5)
    df_up = sales.quantile(0.75)

    # R_Quartile: recency 数据评分
    q = pd.qcut(sales["recency"], 4, labels=False)
    R_Quartile = pd.cut(
        sales.recency,
        [np.NINF, df_down["recency"], df_mid["recency"], df_up["recency"], np.Inf],
        labels=[4, 3, 2, 1],
    ).astype("int")

    # F_Quartile: frequency 数据评分(与 recency 数据评分取反)
    F_Quartile = pd.cut(
        sales.frequency,
        [
            np.NINF,
            df_down["frequency"],
            df_mid["frequency"],
            df_up["frequency"],
            np.Inf,
        ],
        labels=[1, 2, 3, 4],
    ).astype("int")
    F_Quartile = 5 - F_Quartile

    # M_Quartile: monetary 数据评分(与 recency 数据评分取反)
    M_Quartile = pd.cut(
        sales.monetary,
        [np.NINF, df_down["monetary"], df_mid["monetary"], df_up["monetary"], np.Inf],
        labels=[1, 2, 3, 4],
    ).astype("int")
    M_Quartile = 5 - M_Quartile

    # 将三列评分添加到数据帧中
    sales["R_Quartile"] = R_Quartile
    sales["F_Quartile"] = F_Quartile
    sales["M_Quartile"] = M_Quartile

    return sales


print(sales_score(df.head()))

# 需要注意的是,由于 recency 列越小越好,而 frequency 和 monetary 列越大越好,因此我们需要对 F_Quartile 和 M_Quartile 列的评分进行取反,方式是将 5 减去对应的评分值,这样这两列也可以用与 R_Quartile 相同的方式评分(即按照列的大小,从 1 到 4 递减得到相应的分数

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务