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


