题解 | #筛选某店铺最有价值用户中消费最多前5名#
筛选某店铺最有价值用户中消费最多前5名
https://www.nowcoder.com/practice/58655010a7c34e9fb2b7b491c3f79ca4
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
sales["RFMClass"] = (
sales["R_Quartile"].map(str)
+ sales["F_Quartile"].map(str)
+ sales["M_Quartile"].map(str)
)
return sales
sales = sales_score(df)
print(sales.loc[:, ["user_id", "recency", "frequency", "monetary", "RFMClass"]].head(5))
print(
sales.query("RFMClass == '444'")
.sort_values(by="monetary", ascending=False)
.loc[:, ["user_id", "recency", "frequency", "monetary", "RFMClass"]]
.head(5)
)
查看8道真题和解析