题解 | #某店铺用户消费特征评分#
某店铺用户消费特征评分
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 递减得到相应的分数