|
@@ -28,7 +28,7 @@ def split_relation_subtable(data, filter_dict, save_dir):
|
|
|
for name, sub_data in sub_tables.items():
|
|
for name, sub_data in sub_tables.items():
|
|
|
sub_data.to_csv(os.path.join(save_dir, f"{name}.csv"), index=False, encoding='utf-8-sig')
|
|
sub_data.to_csv(os.path.join(save_dir, f"{name}.csv"), index=False, encoding='utf-8-sig')
|
|
|
|
|
|
|
|
-def generate_report(data, filter_dict, save_dir):
|
|
|
|
|
|
|
+def generate_report(city_uuid, data, filter_dict, recommend_data, delivery_count, save_dir):
|
|
|
"""根据总表筛选结果"""
|
|
"""根据总表筛选结果"""
|
|
|
# 1. 筛选商户相关性排序结果
|
|
# 1. 筛选商户相关性排序结果
|
|
|
data = filter_data(data, filter_dict).copy()
|
|
data = filter_data(data, filter_dict).copy()
|
|
@@ -45,12 +45,68 @@ def generate_report(data, filter_dict, save_dir):
|
|
|
for key, value in filter_dict.items():
|
|
for key, value in filter_dict.items():
|
|
|
if key != 'product_code':
|
|
if key != 'product_code':
|
|
|
f.write(f"{ImportanceFeaturesMap.PRODUCT_FEATRUES_MAP[key]}, {value}\n")
|
|
f.write(f"{ImportanceFeaturesMap.PRODUCT_FEATRUES_MAP[key]}, {value}\n")
|
|
|
|
|
+
|
|
|
|
|
+ # 3. 生成推荐报告
|
|
|
|
|
+ recommend_report = generate_recommend_report(city_uuid, recommend_data, delivery_count)
|
|
|
|
|
+ recommend_report.to_csv(os.path.join(save_dir, "recommend_report.csv"), index=False, encoding="utf-8-sig")
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+def generate_recommend_report(city_uuid, recommend_data, delivery_count):
|
|
|
|
|
+ recommend_data = pd.DataFrame(recommend_data)
|
|
|
|
|
+
|
|
|
|
|
+ recpmmend_list = recommend_data["cust_code"].to_list()
|
|
|
|
|
+ recommend_cust_info = dao.get_cust_by_ids(city_uuid, recpmmend_list)
|
|
|
|
|
+
|
|
|
|
|
+ cust_ids = recommend_cust_info.set_index("BB_RETAIL_CUSTOMER_CODE")
|
|
|
|
|
+ recommend_data = recommend_data.join(cust_ids, on="cust_code", how="inner")
|
|
|
|
|
+ recommend_data = recommend_data[["cust_code", "BB_RETAIL_CUSTOMER_NAME", "recommend_score"]]
|
|
|
|
|
+ # 1. 计算每个商户的理论应得数量(带小数)
|
|
|
|
|
+ recommend_data["delivery_float"] = (
|
|
|
|
|
+ recommend_data["recommend_score"] / recommend_data["recommend_score"].sum() * delivery_count
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ # 2. 向下取整得到基础配额
|
|
|
|
|
+ recommend_data["delivery_count"] = recommend_data["delivery_float"].astype(int)
|
|
|
|
|
+
|
|
|
|
|
+ # 3. 计算余数并排序
|
|
|
|
|
+ recommend_data["remainder"] = recommend_data["delivery_float"] - recommend_data["delivery_count"]
|
|
|
|
|
+ recommend_data = recommend_data.sort_values("remainder", ascending=False)
|
|
|
|
|
+
|
|
|
|
|
+ # 4. 将剩余配额按余数从大到小分配
|
|
|
|
|
+ remaining = delivery_count - recommend_data["delivery_count"].sum()
|
|
|
|
|
+ recommend_data.iloc[:remaining, recommend_data.columns.get_loc("delivery_count")] += 1
|
|
|
|
|
+
|
|
|
|
|
+ recommend_data = recommend_data.drop(columns=["delivery_float", "remainder"])
|
|
|
|
|
+ recommend_data = recommend_data.reset_index()
|
|
|
|
|
+ # 5. 按recommend_score从大到小重新排序
|
|
|
|
|
+ recommend_data = recommend_data.sort_values("index")
|
|
|
|
|
+ recommend_data = recommend_data.rename(columns={"index": "推荐序号", "BB_RETAIL_CUSTOMER_NAME": "商户名称", "recommend_score": "匹配评分", "delivery_count": "建议投放量(条)"})
|
|
|
|
|
+ recommend_data["推荐序号"] = recommend_data["推荐序号"] + 1
|
|
|
|
|
+
|
|
|
|
|
+ return recommend_data
|
|
|
|
|
+
|
|
|
def get_cust_list_from_history_order(city_uuid, product_code):
|
|
def get_cust_list_from_history_order(city_uuid, product_code):
|
|
|
|
|
+ # 获取订单数据并处理
|
|
|
order_data = dao.get_order_by_product(city_uuid, product_code)
|
|
order_data = dao.get_order_by_product(city_uuid, product_code)
|
|
|
- return order_data
|
|
|
|
|
|
|
+ order_data = order_data[["cust_code", "cust_name", "product_code", "product_name", "sale_qty", "sale_amt"]]
|
|
|
|
|
+
|
|
|
|
|
+ # 确保cust_code是字符串类型
|
|
|
|
|
+ order_data["cust_code"] = order_data["cust_code"].astype(str)
|
|
|
|
|
+
|
|
|
|
|
+ order_data = order_data.groupby(["cust_code", "cust_name", "product_code", "product_name"])[["sale_qty", "sale_amt"]].sum().reset_index()
|
|
|
|
|
+ order_data = order_data.sort_values("sale_qty", ascending=False)
|
|
|
|
|
+
|
|
|
|
|
+ # 读取推荐数据
|
|
|
|
|
+ recommend_data = pd.read_csv('./data/recommend_report.csv')
|
|
|
|
|
+
|
|
|
|
|
+ # 确保recommend_data中的cust_code也是字符串类型
|
|
|
|
|
+ recommend_data["cust_code"] = recommend_data["cust_code"].astype(str)
|
|
|
|
|
+ cust_ids = recommend_data.set_index("cust_code")
|
|
|
|
|
+
|
|
|
|
|
+ # 执行合并操作
|
|
|
|
|
+ merge_data = order_data.join(cust_ids, on="cust_code", how="inner")
|
|
|
|
|
+ merge_data = merge_data[["cust_code", "cust_name", "product_code", "product_name", "sale_qty", "sale_amt", "推荐序号", "匹配评分"]]
|
|
|
|
|
+ return merge_data
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if __name__ == "__main__":
|
|
|
- order_data = get_cust_list_from_history_order("00000000000000000000000011445301", "350139")
|
|
|
|
|
- order_data.to_csv("./data/history.csv", index=False)
|
|
|
|
|
|
|
+ order_data = get_cust_list_from_history_order("00000000000000000000000011445301", "420202")
|
|
|
|
|
+ order_data.to_csv("./data/eval.csv", index=False)
|