|
|
@@ -3,10 +3,14 @@ from models import Recommend
|
|
|
from models.rank.data.config import CustConfig, ImportanceFeaturesMap, ProductConfig, DeliveryConfig
|
|
|
from models.rank.data.utils import sample_data_clear
|
|
|
from models.rank import generate_feats_map
|
|
|
+from core import get_logger
|
|
|
|
|
|
import os
|
|
|
import pandas as pd
|
|
|
from utils.reports_process import feats_relation_process, calculate_delivery_by_recommend_data, eval_report_process_pre, eval_report_process
|
|
|
+
|
|
|
+logger = get_logger("utils.report")
|
|
|
+
|
|
|
class ReportUtils:
|
|
|
def __init__(self, city_uuid, product_id):
|
|
|
self._recommend_model = Recommend(city_uuid)
|
|
|
@@ -64,33 +68,40 @@ class ReportUtils:
|
|
|
|
|
|
def generate_feats_ralation_report(self, recall_count):
|
|
|
"""生成特征相关性分析报告"""
|
|
|
+ logger.info("Generating feature relation report")
|
|
|
feats_map = self._generate_feats_map(recall_count)
|
|
|
product_content = self._get_product_content()
|
|
|
# 计算SHAP值
|
|
|
shap_result = self._recommend_model._gbdtlr_model.generate_shap_interance(feats_map)
|
|
|
report = feats_relation_process(shap_result, product_content)
|
|
|
-
|
|
|
+
|
|
|
report.to_excel(os.path.join(self._save_dir, "品规商户特征关系表.xlsx"), index=False)
|
|
|
+ logger.info("Feature relation report saved")
|
|
|
|
|
|
def generate_product_report(self):
|
|
|
"""生成推荐品规信息表"""
|
|
|
+ logger.info("Generating product report")
|
|
|
product_data = self._get_product_content()
|
|
|
with open(os.path.join(self._save_dir, "卷烟信息表.xlsx"), "w", encoding='utf-8-sig') as file:
|
|
|
for key, value in product_data.items():
|
|
|
if key != 'product_code':
|
|
|
file.write(f"{ImportanceFeaturesMap.PRODUCT_FEATRUES_MAP[key]}, {value}\n")
|
|
|
+ logger.info("Product report saved")
|
|
|
|
|
|
def generate_recommend_report(self, recall_count, delivery_count):
|
|
|
"""生成推荐报告,包括投放量"""
|
|
|
+ logger.info("Generating recommend report")
|
|
|
recommend_data = self._get_recommend_data(recall_count)
|
|
|
recommend_list = list(map(lambda x: x["cust_code"], recommend_data))
|
|
|
recommend_cust_infos = self._dao.get_cust_by_ids(self._city_uuid, recommend_list)
|
|
|
report = calculate_delivery_by_recommend_data(recommend_data, recommend_cust_infos, delivery_count)
|
|
|
-
|
|
|
+
|
|
|
report.to_excel(os.path.join(self._save_dir, "商户售卖推荐表.xlsx"), index=False)
|
|
|
+ logger.info("Recommend report saved")
|
|
|
|
|
|
def generate_similarity_product_report(self):
|
|
|
"""生成相似卷烟表"""
|
|
|
+ logger.info("Generating similarity product report")
|
|
|
product_similarity_map = self._recommend_model._item2vec_model.generate_product_similarity_map(self._product_id)
|
|
|
product_similarity_map = product_similarity_map[["product_name", "similarity", "brand_name", "factory_name", "is_low_tar", "is_medium", "is_tiny", "is_coarse", "is_exploding_beads", "is_abnormity", "is_cig", "is_chuangxin", "direct_retail_price", "tbc_total_length", "product_style"]]
|
|
|
product_similarity_map = product_similarity_map.rename(
|
|
|
@@ -113,6 +124,7 @@ class ReportUtils:
|
|
|
}
|
|
|
)
|
|
|
product_similarity_map.to_excel(os.path.join(self._save_dir, "相似卷烟表.xlsx"), index=False)
|
|
|
+ logger.info("Similarity product report saved")
|
|
|
|
|
|
def generate_eval_data_pre(self):
|
|
|
if self._product_id == '350139':
|
|
|
@@ -121,7 +133,7 @@ class ReportUtils:
|
|
|
eval_product_id = self._product_id
|
|
|
eval_order_data = self._dao.get_eval_order_by_product(self._city_uuid, eval_product_id)
|
|
|
if not os.path.exists(os.path.join(self._save_dir, "商户售卖推荐表.xlsx")):
|
|
|
- print("请先生成'商户售卖推荐表'")
|
|
|
+ logger.error("商户售卖推荐表 not found")
|
|
|
recommend_data = pd.read_excel(os.path.join(self._save_dir, "商户售卖推荐表.xlsx"))
|
|
|
report = eval_report_process_pre(eval_order_data, recommend_data)
|
|
|
|
|
|
@@ -129,6 +141,7 @@ class ReportUtils:
|
|
|
|
|
|
def generate_eval_data(self, start_time, end_time, recommend_data):
|
|
|
"""根据推荐列表生成验证报告"""
|
|
|
+ logger.info("Generating eval report")
|
|
|
if self._product_id == '350139':
|
|
|
eval_product_id = "350355"
|
|
|
else:
|
|
|
@@ -142,13 +155,16 @@ class ReportUtils:
|
|
|
report = eval_report_process(delivery_data, recommend_data)
|
|
|
|
|
|
report.to_excel(os.path.join(self._save_dir, "投放验证报告.xlsx"), index=False)
|
|
|
+ logger.info("Eval report saved")
|
|
|
|
|
|
def generate_all_data(self, recall_count, delivery_count):
|
|
|
+ logger.info("Generating all reports")
|
|
|
self.generate_feats_ralation_report(recall_count)
|
|
|
self.generate_product_report()
|
|
|
self.generate_recommend_report(recall_count, delivery_count)
|
|
|
self.generate_similarity_product_report()
|
|
|
# self.generate_eval_data()
|
|
|
+ logger.info("All reports generated")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
city_uuid = "00000000000000000000000011445301"
|