瀏覽代碼

finished roi api

gufengshou1 1 年之前
父節點
當前提交
d2f69f6286
共有 15 個文件被更改,包括 296 次插入75 次删除
  1. 57 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/config/AdOutV1OnlineWeightConfig.java
  2. 39 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/config/RoiModelConfig.java
  3. 15 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/constant/RuleRedisKeyConst.java
  4. 46 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/containner/RoiPredictParamContainer.java
  5. 1 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/containner/ThresholdModelContainer.java
  6. 26 4
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/impl/PredictModelServiceImpl.java
  7. 5 12
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/AddThresholdPredictModel.java
  8. 2 35
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/BasicThresholdPredictModel.java
  9. 5 13
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/MultiplyThresholdPredictModel.java
  10. 80 2
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/RoiThresholdPredictModel.java
  11. 3 4
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/ScoreThresholdPredictModel.java
  12. 1 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/ThresholdPredictModel.java
  13. 13 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/param/RoiThresholdPredictModelParam.java
  14. 1 1
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/param/RuleParamHelper.java
  15. 2 0
      ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/param/ThresholdPredictModelParam.java

+ 57 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/config/AdOutV1OnlineWeightConfig.java

@@ -1,14 +1,70 @@
 package com.tzld.piaoquan.ad.engine.service.predict.config;
 
+import com.google.gson.Gson;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
 import java.util.*;
 
 
+@Component
 public class AdOutV1OnlineWeightConfig {
     public static Map<String,Double> weightMap=new HashMap<>();
 
-    public static Double defaultWeight=new Double(0);
+    public final static Double defaultWeight=new Double(0);
 
     public static Double getWeight(String key){
         return weightMap.getOrDefault(key,defaultWeight);
     }
+
+    //todo weightMap init
+
+    @PostConstruct
+    public void initWeightMap(){
+        String weightJsonStr="{\n" +
+                "  \"bias\": -0.147853,\n" +
+                "  \"ctx_apptype#0\": 0.180751,\n" +
+                "  \"ctx_apptype#17\": -0.245126,\n" +
+                "  \"ctx_apptype#18\": -0.0559548,\n" +
+                "  \"ctx_apptype#19\": -0.0976163,\n" +
+                "  \"ctx_apptype#21\": -0.246539,\n" +
+                "  \"ctx_apptype#22\": -0.230472,\n" +
+                "  \"ctx_apptype#3\": -0.304472,\n" +
+                "  \"ctx_apptype#4\": -0.00857673,\n" +
+                "  \"ctx_apptype#5\": -0.166914,\n" +
+                "  \"ctx_apptype#6\": -0.451902,\n" +
+                "  \"ctx_hour#00\": -1.33904,\n" +
+                "  \"ctx_hour#01\": -1.27071,\n" +
+                "  \"ctx_hour#02\": -1.28498,\n" +
+                "  \"ctx_hour#03\": -1.19206,\n" +
+                "  \"ctx_hour#04\": -1.43452,\n" +
+                "  \"ctx_hour#05\": -1.61711,\n" +
+                "  \"ctx_hour#06\": -1.71274,\n" +
+                "  \"ctx_hour#07\": -1.74905,\n" +
+                "  \"ctx_hour#08\": 0.0582405,\n" +
+                "  \"ctx_hour#09\": 0.118864,\n" +
+                "  \"ctx_hour#10\": 0.14203,\n" +
+                "  \"ctx_hour#11\": 0.169456,\n" +
+                "  \"ctx_hour#12\": 0.129989,\n" +
+                "  \"ctx_hour#13\": 0.102083,\n" +
+                "  \"ctx_hour#14\": 0.0894642,\n" +
+                "  \"ctx_hour#15\": 0.093456,\n" +
+                "  \"ctx_hour#16\": 0.0541803,\n" +
+                "  \"ctx_hour#17\": 0.0170209,\n" +
+                "  \"ctx_hour#18\": -0.119698,\n" +
+                "  \"ctx_hour#19\": -0.172689,\n" +
+                "  \"ctx_hour#20\": -0.16682,\n" +
+                "  \"ctx_hour#21\": -0.00945801,\n" +
+                "  \"ctx_hour#22\": -0.025524,\n" +
+                "  \"ctx_hour#23\": -0.0166787,\n" +
+                "  \"ctx_week#1\": -0.105368,\n" +
+                "  \"ctx_week#2\": -0.100855,\n" +
+                "  \"ctx_week#3\": -0.0844838,\n" +
+                "  \"ctx_week#4\": -0.127137,\n" +
+                "  \"ctx_week#5\": -0.123138,\n" +
+                "  \"ctx_week#6\": -0.112104,\n" +
+                "  \"ctx_week#7\": -0.0863324\n" +
+                "}\n";
+        weightMap=new Gson().fromJson(weightJsonStr,HashMap.class);
+    }
 }

+ 39 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/config/RoiModelConfig.java

@@ -0,0 +1,39 @@
+package com.tzld.piaoquan.ad.engine.service.predict.config;
+
+import com.google.gson.Gson;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class RoiModelConfig {
+    
+    Map<String,Object> paramsNewStrategyMap=new HashMap<>();
+
+    public Object get(String key){
+        return paramsNewStrategyMap.get(key);
+    }
+
+    @PostConstruct
+    private void init(){
+        String initStr="  {\n" +
+                "        \"VLOG\": {\n" +
+                "            \"video\": {\"data\": \"videos0\"},\n" +
+                "            \"user\": {\"data\": \"user0\", \"rule\": \"rule1\"},\n" +
+                "            \"group_class_key\": \"class1\"\n" +
+                "        },  " +
+                "        \"LOVE_LIVE\": {\n" +
+                "            \"video\": {\"data\": \"videos4\"},\n" +
+                "            \"user\": {\"data\": \"user4\", \"rule\": \"rule1\"},\n" +
+                "            \"group_class_key\": \"class1\"\n" +
+                "        },  " +
+                "        \"LONG_VIDEO\": {\n" +
+                "            \"video\": {\"data\": \"videos5\"},\n" +
+                "            \"user\": {\"data\": \"user5\", \"rule\": \"rule1\"},\n" +
+                "            \"group_class_key\": \"class1\"\n" +
+                "        }";
+        paramsNewStrategyMap=new Gson().fromJson(initStr,HashMap.class);
+    }
+}

+ 15 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/config/RuleRedisKeyConst.java → ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/constant/RuleRedisKeyConst.java

@@ -1,4 +1,4 @@
-package com.tzld.piaoquan.ad.engine.service.predict.config;
+package com.tzld.piaoquan.ad.engine.service.predict.constant;
 
 public class RuleRedisKeyConst {
 //         用户组有广告时的分享率预测结果存放 redis key 前缀,完整格式:ad:users:group:predict:share:rate:{user_data_key}:{date}
@@ -19,4 +19,18 @@ public class RuleRedisKeyConst {
     public static String KEY_NAME_PREFIX_AD_OUT_MODEL_SCORE_ITEM="ad:out:model:score:item:";
 //        # 有广告时的视频跳出模型策略配置  redis key 前缀,完整格式:ad:out:model:config:{model_key}:{abtest_id}:{abtest_config_tag}:{config}
     public static String KEY_NAME_PREFIX_AD_OUT_MODEL_CONFIG="ad:out:model:config:";
+    public static String KEY_NAME_AD_ARPU="ad:arpu";
+    public static String KEY_NAME_AD_ROI_PARAM="ad:roi:param";
+
+
+    //    # 新策略使用
+//    # 视频有广告时的分享率预测结果存放 redis key 前缀,完整格式:video:predict:share:rate:with:ad:{video_data_key}:{date}
+    public static String KEY_NAME_PREFIX_VIDEO_WITH_AD="video:predict:share:rate:with:ad:";
+//  用户组有广告时的分享率预测结果存放 redis key 前缀,完整格式:users:group:predict:share:rate:with:ad:{user_data_key}:{user_rule_key}:{date}
+    public static String KEY_NAME_PREFIX_GROUP_WITH_AD="users:group:predict:share:rate:with:ad:";
+    //用户组无广告时的分享率预测结果存放 redis key 前缀,完整格式:users:group:predict:share:rate:no:ad:{user_data_key}:{user_rule_key}:{date}
+    public static String KEY_NAME_PREFIX_GROUP_NO_AD="users:group:predict:share:rate:no:ad:";
+    //  视频无广告时的分享率预测结果存放 redis key 前缀,完整格式:video:predict:share:rate:no:ad:{video_data_key}:{date}
+    public static String KEY_NAME_PREFIX_VIDEO_NO_AD="video:predict:share:rate:no:ad:";
+
 }

+ 46 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/containner/RoiPredictParamContainer.java

@@ -0,0 +1,46 @@
+package com.tzld.piaoquan.ad.engine.service.predict.containner;
+
+import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
+import com.tzld.piaoquan.ad.engine.commons.redis.RedisHelper;
+import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.Objects;
+
+@Component
+public class RoiPredictParamContainer {
+    @Autowired
+    AlgorithmRedisHelper redisHelper;
+    private final Double zeroDefault=new Double(0);
+    Double adArpu;
+
+    Double adRoi;
+    @PostConstruct
+    private void initParams(){
+
+    }
+
+    private void refreshAdArpu(){
+        adArpu = redisHelper.getDouble(RuleRedisKeyConst.KEY_NAME_AD_ARPU);
+        if(Objects.isNull(adArpu)){
+            adArpu=zeroDefault;
+        }
+    }
+    private void refreshAdRoi(){
+        adRoi = redisHelper.getDouble(RuleRedisKeyConst.KEY_NAME_AD_ROI_PARAM);
+        if(Objects.isNull(adRoi)){
+            adRoi=zeroDefault;
+        }
+    }
+
+    public Double getAdRoi(){
+        return adRoi;
+    }
+
+    public Double getAdArpu(){
+        return adArpu;
+    }
+
+}

+ 1 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/containner/ThresholdModelContainer.java → ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/containner/ThresholdModelContainer.java

@@ -1,4 +1,4 @@
-package com.tzld.piaoquan.ad.engine.service.predict.model.containner;
+package com.tzld.piaoquan.ad.engine.service.predict.containner;
 
 import com.tzld.piaoquan.ad.engine.service.predict.model.threshold.ThresholdPredictModel;
 import org.springframework.beans.factory.annotation.Autowired;

+ 26 - 4
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/impl/PredictModelServiceImpl.java

@@ -1,12 +1,14 @@
 package com.tzld.piaoquan.ad.engine.service.predict.impl;
 
 import com.alibaba.fastjson.JSONArray;
-import com.tzld.piaoquan.ad.engine.commons.redis.AdOwnRedisHelper;
+import com.tzld.piaoquan.ad.engine.commons.enums.AppTypeEnum;
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
-import com.tzld.piaoquan.ad.engine.service.predict.config.RuleRedisKeyConst;
+import com.tzld.piaoquan.ad.engine.service.predict.config.RoiModelConfig;
+import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import com.tzld.piaoquan.ad.engine.service.predict.PredictModelService;
 import com.tzld.piaoquan.ad.engine.service.predict.config.AbConfig;
-import com.tzld.piaoquan.ad.engine.service.predict.model.containner.ThresholdModelContainer;
+import com.tzld.piaoquan.ad.engine.service.predict.containner.ThresholdModelContainer;
+import com.tzld.piaoquan.ad.engine.service.predict.param.RoiThresholdPredictModelParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.request.RoiPredictModelRequestParam;
@@ -33,6 +35,9 @@ public class PredictModelServiceImpl implements PredictModelService {
     @Autowired
     AbConfig abConfig;
 
+    @Autowired
+    RoiModelConfig roiModelConfig;
+
     public  Map<String,Object> adPredict(ThresholdPredictModelRequestParam requestParam){
         Map<String,Object> result=new HashMap<>();
         String[] abParamArr=abConfig.getAbParams(requestParam.getAbTestCode(),requestParam.getAbExpInfo());
@@ -55,6 +60,7 @@ public class PredictModelServiceImpl implements PredictModelService {
         if (midGroup == null) {
             midGroup = "mean_group";
         }
+
         String[] noAdMidGroupList=new String[0];
         noAdMidGroupList=((JSONArray) abtestParam.get("no_ad_mid_group_list")).toArray(noAdMidGroupList);
         boolean inNoAdGroup = false;
@@ -91,7 +97,23 @@ public class PredictModelServiceImpl implements PredictModelService {
     }
 
     public Map<String,Object> adRecommendPredictByRoiModel(RoiPredictModelRequestParam requestParam){
-        return null;
+        RoiThresholdPredictModelParam modelParam=new RoiThresholdPredictModelParam();
+        BeanUtils.copyProperties(requestParam,modelParam);
+        modelParam.setEcpm(requestParam.getAds().get(0).getEcpm());
+        modelParam.setAdId(requestParam.getAds().get(0).getAdId());
+        modelParam.setAdType(requestParam.getAds().get(0).getAdType());
+
+        String groupClassKey = (String)((Map<String,Object>)roiModelConfig.get(AppTypeEnum.valueOf(modelParam.getAppType()).name())).get("group_class_key");
+        String midGroupKeyName = RuleRedisKeyConst.KEY_NAME_PREFIX_MID_GROUP + groupClassKey + ":" + modelParam.getMid();
+        String midGroup = redisHelper.get(midGroupKeyName);
+        if (midGroup == null) {
+            midGroup = "mean_group";
+        }
+        modelParam.setMidGroup(midGroup);
+
+        return ThresholdModelContainer.
+                getThresholdPredictModel("roi")
+                .predict(modelParam);
     }
 
 

+ 5 - 12
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/AddThresholdPredictModel.java

@@ -3,7 +3,7 @@ package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
 import com.tzld.piaoquan.ad.engine.commons.redis.AdOwnRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.calculator.ThresholdPredictCalculator;
-import com.tzld.piaoquan.ad.engine.service.predict.config.RuleRedisKeyConst;
+import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdCalculateParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
@@ -32,18 +32,11 @@ public class AddThresholdPredictModel extends ThresholdPredictModel {
     @Override
     public Map<String, Object> predict(ThresholdPredictModelParam modelParam) {
         Map<String, Object> result = new HashMap<>();
-        // Determine the group to which mid belongs
-        String groupClassKey = (String) modelParam.getAbtestParam().get("group_class_key");
-        String midGroupKeyName = RuleRedisKeyConst.KEY_NAME_PREFIX_MID_GROUP + groupClassKey + ":" + modelParam.getMid();
-        String midGroup = redisHelper.getString(midGroupKeyName);
-        if (midGroup == null) {
-            midGroup = "mean_group";
-        }
         // Get group and video share rates
-        Double groupShareRate = paramHelper.getGroupShareRate(modelParam.getAbtestParam(),modelParam.getDate(),midGroup);
+        Double groupShareRate = paramHelper.getGroupShareRate(modelParam.getAbtestParam(),modelParam.getDate(), modelParam.getMidGroup());
         Double videoShareRate = paramHelper.getVideoShareRate(modelParam.getAbtestParam(), modelParam.getDate(),modelParam.getVideoId());
         // Get group and video out rates
-        Double groupOutRate = paramHelper.getGroupOutRate(modelParam.getAbtestParam(),modelParam.getDate(),midGroup);
+        Double groupOutRate = paramHelper.getGroupOutRate(modelParam.getAbtestParam(),modelParam.getDate(),modelParam.getMidGroup());
         Double videoOutRate = paramHelper.getVideoOutRate(modelParam.getAbtestParam(), modelParam.getDate(),modelParam.getVideoId());
 
         // Calculate mid-video prediction result
@@ -65,13 +58,13 @@ public class AddThresholdPredictModel extends ThresholdPredictModel {
                 modelParam.getAbtestId(),
                 modelParam.getAbTestConfigTag(),
                 modelParam.getAbTestCode(),
-                midGroup,
+                modelParam.getMidGroup(),
                 modelParam.getCareModelStatus(),
                 modelParam.getAbtestParam()
         );
         // Threshold check
         int adPredict=midVideoPredictRes > threshold?2:1;
-        result.put("mid_group", midGroup);
+        result.put("mid_group", modelParam.getMidGroup());
         result.put("group_share_rate", groupShareRate);
         result.put("video_share_rate", videoShareRate);
         result.put("group_out_rate", groupOutRate);

+ 2 - 35
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/BasicThresholdPredictModel.java

@@ -4,7 +4,7 @@ import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 import com.tzld.piaoquan.ad.engine.commons.redis.AdOwnRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.calculator.ThresholdPredictCalculator;
-import com.tzld.piaoquan.ad.engine.service.predict.config.RuleRedisKeyConst;
+import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdCalculateParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
@@ -28,40 +28,7 @@ public class BasicThresholdPredictModel extends ThresholdPredictModel{
 
     @Override
     public Map<String, Object> predict(ThresholdPredictModelParam modelParam) {
-        Map<String, Object> result = new HashMap<>();
-
-        String groupClassKey = (String) modelParam.getAbtestParam().get("group_class_key");
-        Map<String, Set<String>> noAdGroupWithVideoMapping = (Map<String, Set<String>>) modelParam.getAbtestParam().getOrDefault("no_ad_group_with_video_mapping", new HashMap<>());
-
-        String midGroupKeyName = RuleRedisKeyConst.KEY_NAME_PREFIX_MID_GROUP + groupClassKey + ":" + modelParam.getMid();
-        String midGroup = redisHelper.get(midGroupKeyName);
-        if (midGroup == null) {
-            midGroup = "mean_group";
-        }
-
-        if (noAdGroupWithVideoMapping.containsKey(midGroup)) {
-            Set<String> videoMappingKeyList = noAdGroupWithVideoMapping.get(midGroup);
-            String noAdVideos = redisHelper.get(RuleRedisKeyConst.KEY_NAME_PREFIX_NO_AD_VIDEOS + modelParam.getAppType());
-            Map<String, List<String>> noAdVideosMap = new HashMap<>();
-            if (noAdVideos != null) {
-                noAdVideosMap = new Gson().fromJson(noAdVideos, new TypeToken<Map<String, List<String>>>() {}.getType());
-            }
-
-            Set<String> noAdVideoList = new HashSet<>();
-            for (String videoMappingKey : videoMappingKeyList) {
-                noAdVideoList.addAll(noAdVideosMap.getOrDefault(videoMappingKey, new ArrayList<>()));
-            }
-
-            if (noAdVideoList.contains(modelParam.getVideoId())) {
-                // Video is in the no-ad list, do not show the ad
-                result.put("mid_group", midGroup);
-                result.put("ad_predict", 1);
-                result.put("no_ad_strategy", "no_ad_mid_group_with_video");
-                return result;
-            }
-        }
-        result = predictWithRateProcess(modelParam,midGroup);
-        return result;
+        return predictWithRateProcess(modelParam,modelParam.getMidGroup());
     }
 
     public Map<String, Object> predictWithRateProcess(ThresholdPredictModelParam modelParam,String midGroup){

+ 5 - 13
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/MultiplyThresholdPredictModel.java

@@ -2,7 +2,7 @@ package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
 import com.tzld.piaoquan.ad.engine.commons.redis.AdOwnRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.calculator.ThresholdPredictCalculator;
-import com.tzld.piaoquan.ad.engine.service.predict.config.RuleRedisKeyConst;
+import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdCalculateParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
@@ -31,20 +31,12 @@ public class MultiplyThresholdPredictModel  extends ThresholdPredictModel{
     @Override
     public Map<String, Object> predict(ThresholdPredictModelParam modelParam) {
         Map<String, Object> result = new HashMap<>();
-        // Determine the group to which mid belongs
-        String groupClassKey = (String) modelParam.getAbtestParam().get("group_class_key");
-        String midGroupKeyName = RuleRedisKeyConst.KEY_NAME_PREFIX_MID_GROUP + groupClassKey + ":" + modelParam.getMid();
-        String midGroup = redisHelper.getString(midGroupKeyName);
-        if (midGroup == null) {
-            midGroup = "mean_group";
-        }
-        // Check if the user is in the no-ad group list
 
         // Get group and video share rates
-        Double groupShareRate = paramHelper.getGroupShareRate(modelParam.getAbtestParam(),modelParam.getDate(),midGroup);
+        Double groupShareRate = paramHelper.getGroupShareRate(modelParam.getAbtestParam(),modelParam.getDate(),modelParam.getMidGroup());
         Double videoShareRate = paramHelper.getVideoShareRate(modelParam.getAbtestParam(), modelParam.getDate(),modelParam.getVideoId());
         // Get group and video out rates
-        Double groupOutRate = paramHelper.getGroupOutRate(modelParam.getAbtestParam(),modelParam.getDate(),midGroup);
+        Double groupOutRate = paramHelper.getGroupOutRate(modelParam.getAbtestParam(),modelParam.getDate(),modelParam.getMidGroup());
         Double videoOutRate = paramHelper.getVideoOutRate(modelParam.getAbtestParam(), modelParam.getDate(),modelParam.getVideoId());
 
         // Calculate mid-video prediction result
@@ -63,7 +55,7 @@ public class MultiplyThresholdPredictModel  extends ThresholdPredictModel{
                 modelParam.getAbtestId(),
                 modelParam.getAbTestConfigTag(),
                 modelParam.getAbTestCode(),
-                midGroup,
+                modelParam.getMidGroup(),
                 modelParam.getCareModelStatus(),
                 modelParam.getAbtestParam()
         );
@@ -76,7 +68,7 @@ public class MultiplyThresholdPredictModel  extends ThresholdPredictModel{
 //                // Otherwise, do not show the ad
 //                adPredict = 1;
 //            }
-        result.put("mid_group", midGroup);
+        result.put("mid_group", modelParam.getMidGroup());
         result.put("group_share_rate", groupShareRate);
         result.put("video_share_rate", videoShareRate);
         result.put("group_out_rate", groupOutRate);

+ 80 - 2
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/RoiThresholdPredictModel.java

@@ -1,11 +1,19 @@
 package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
+import com.tzld.piaoquan.ad.engine.commons.enums.AppTypeEnum;
 import com.tzld.piaoquan.ad.engine.commons.redis.AdOwnRedisHelper;
+import com.tzld.piaoquan.ad.engine.service.predict.config.RoiModelConfig;
+import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
+import com.tzld.piaoquan.ad.engine.service.predict.containner.RoiPredictParamContainer;
+import com.tzld.piaoquan.ad.engine.service.predict.param.RoiThresholdPredictModelParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 
 @Component
@@ -22,8 +30,78 @@ public class RoiThresholdPredictModel extends ThresholdPredictModel{
         return "roi";
     }
 
+    @Autowired
+    RoiPredictParamContainer container;
+
+    @Autowired
+    RoiModelConfig roiModelConfig;
     @Override
-    public Map<String, Object> predict(ThresholdPredictModelParam modelParam) {
-        return null;
+    public <T extends ThresholdPredictModelParam> Map<String, Object> predict(T param) {
+        RoiThresholdPredictModelParam modelParam=(RoiThresholdPredictModelParam)param;
+        Date previousDate = new Date(modelParam.getDate().getTime() - (24 * 60 * 60 * 1000)); // Subtract one day
+        String nowDt = new SimpleDateFormat("yyyyMMdd").format(modelParam.getDate());
+        String previousDt = new SimpleDateFormat("yyyyMMdd").format(previousDate);
+
+
+        Map<String, Object> userParams =( Map<String, Object>) ((Map<String,Object>)roiModelConfig.get(AppTypeEnum.valueOf(modelParam.getAppType()).name())).get("user");
+        String shareUserDataKey = (String) userParams.get("data");
+        String shareUserRuleKey = (String) userParams.get("rule");
+
+        String groupShareRateKeyWithAd = RuleRedisKeyConst.KEY_NAME_PREFIX_GROUP_WITH_AD + shareUserDataKey + ":" + shareUserRuleKey + ":" + nowDt;
+        if (!redisHelper.contantinsKey(groupShareRateKeyWithAd)) {
+            groupShareRateKeyWithAd = RuleRedisKeyConst.KEY_NAME_PREFIX_GROUP_WITH_AD + shareUserDataKey + ":" + shareUserRuleKey + ":" + previousDt;
+        }
+        Double groupShareRateWithAd = redisHelper.zScore(groupShareRateKeyWithAd, modelParam.getMid());
+
+        Map<String, Object> videoParams = ( Map<String, Object>) ((Map<String,Object>)roiModelConfig.get(AppTypeEnum.valueOf(modelParam.getAppType()).name())).get("video");
+        String shareVideoDataKey = (String) videoParams.get("data");
+        String videoShareRateKeyWithAd = RuleRedisKeyConst.KEY_NAME_PREFIX_VIDEO_WITH_AD + shareVideoDataKey + ":" + nowDt;
+        if (!redisHelper.contantinsKey(videoShareRateKeyWithAd)) {
+            videoShareRateKeyWithAd = RuleRedisKeyConst.KEY_NAME_PREFIX_VIDEO_WITH_AD + shareVideoDataKey + ":" + previousDt;
+        }
+        Double videoShareRateWithAd = redisHelper.zScore(videoShareRateKeyWithAd,modelParam.getVideoId().toString());
+        if (videoShareRateWithAd == null) {
+            videoShareRateWithAd = redisHelper.zScore(videoShareRateKeyWithAd, -1+"");
+        }
+
+        String groupShareRateKeyNoAd = RuleRedisKeyConst.KEY_NAME_PREFIX_GROUP_NO_AD + shareUserDataKey + ":" + shareUserRuleKey + ":" + nowDt;
+        if (!redisHelper.contantinsKey(groupShareRateKeyNoAd)) {
+            groupShareRateKeyNoAd = RuleRedisKeyConst.KEY_NAME_PREFIX_GROUP_NO_AD + shareUserDataKey + ":" + shareUserRuleKey + ":" + previousDt;
+        }
+        Double groupShareRateNoAd = redisHelper.zScore(groupShareRateKeyNoAd, modelParam.getMidGroup());
+
+        String videoShareRateKeyNoAd = RuleRedisKeyConst.KEY_NAME_PREFIX_VIDEO_NO_AD + shareVideoDataKey + ":" + nowDt;
+        if (!redisHelper.contantinsKey(videoShareRateKeyNoAd)) {
+            videoShareRateKeyNoAd = RuleRedisKeyConst.KEY_NAME_PREFIX_VIDEO_NO_AD + shareVideoDataKey + ":" + previousDt;
+        }
+        Double videoShareRateNoAd = redisHelper.zScore(videoShareRateKeyNoAd,modelParam.getVideoId().toString());
+        if (videoShareRateNoAd == null) {
+            videoShareRateNoAd = redisHelper.zScore(videoShareRateKeyNoAd, -1+"");
+        }
+
+        if (groupShareRateWithAd == null || videoShareRateWithAd == null || groupShareRateNoAd == null || videoShareRateNoAd == null) {
+            return null;
+        }
+
+        Double shareRateWithAd = groupShareRateWithAd * videoShareRateWithAd;
+        Double shareRateNoAd = groupShareRateNoAd * videoShareRateNoAd;
+
+        Double roiAd = (modelParam.getEcpm() / 1000d) - (container.getAdRoi() * container.getAdArpu() * (shareRateNoAd - shareRateWithAd));
+        Double adPredict=roiAd>0?2d:1d;
+        Map<String, Object> result = new HashMap<>();
+        result.put("arpu", container.getAdArpu());
+        result.put("roi_param", container.getAdRoi());
+        result.put("ad_id", modelParam.getAdId());
+        result.put("ad_type",  modelParam.getAdType());
+        result.put("mid_group", modelParam.getMidGroup());
+        result.put("group_share_rate_with_ad", groupShareRateWithAd);
+        result.put("video_share_rate_with_ad", videoShareRateWithAd);
+        result.put("group_share_rate_no_ad", groupShareRateNoAd);
+        result.put("video_share_rate_no_ad", videoShareRateNoAd);
+        result.put("share_rate_with_ad", shareRateWithAd);
+        result.put("share_rate_no_ad", shareRateNoAd);
+        result.put("roi_ad", roiAd);
+        result.put("ad_predict", adPredict);
+        return result;
     }
 }

+ 3 - 4
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/ScoreThresholdPredictModel.java

@@ -2,8 +2,8 @@ package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
 import com.tzld.piaoquan.ad.engine.commons.redis.AdOwnRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.config.AdOutV1OnlineWeightConfig;
-import com.tzld.piaoquan.ad.engine.service.predict.config.RuleRedisKeyConst;
-import com.tzld.piaoquan.ad.engine.service.predict.model.containner.ThresholdModelContainer;
+import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
+import com.tzld.piaoquan.ad.engine.service.predict.containner.ThresholdModelContainer;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,8 +55,7 @@ public class ScoreThresholdPredictModel extends ThresholdPredictModel{
         onlineFeatures.put("ctx_apptype", modelParam.getAppType().toString());
         onlineFeatures.put("ctx_week", weekDayFormat.format(modelParam.getDate()));
         onlineFeatures.put("ctx_hour", hourFormat.format(modelParam.getDate()));
-        // Call the getFinalScore method to calculate final and online scores
-        // (You need to implement this method according to your specific logic)
+
         double onlineScore=getOlineScore(onlineFeatures);
         double finalScore =getFinalScore(onlineScore,offlineScore);
 

+ 1 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/ThresholdPredictModel.java

@@ -13,7 +13,7 @@ public abstract class ThresholdPredictModel implements Model {
 
     private final String name;
 
-    abstract public Map<String,Object>  predict(ThresholdPredictModelParam modelParam);
+    abstract public <T extends ThresholdPredictModelParam> Map<String,Object>  predict(T modelParam);
 
     abstract String initName();
     public ThresholdPredictModel(){

+ 13 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/param/RoiThresholdPredictModelParam.java

@@ -0,0 +1,13 @@
+package com.tzld.piaoquan.ad.engine.service.predict.param;
+
+import lombok.Data;
+
+@Data
+public class RoiThresholdPredictModelParam extends ThresholdPredictModelParam{
+    private String adId;
+
+    private Integer adType;
+
+    private Double ecpm;
+
+}

+ 1 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/param/RuleParamHelper.java

@@ -1,7 +1,7 @@
 package com.tzld.piaoquan.ad.engine.service.predict.param;
 
 import com.tzld.piaoquan.ad.engine.commons.redis.AdOwnRedisHelper;
-import com.tzld.piaoquan.ad.engine.service.predict.config.RuleRedisKeyConst;
+import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import org.apache.commons.lang3.StringUtils;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;

+ 2 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/param/ThresholdPredictModelParam.java

@@ -30,4 +30,6 @@ public class ThresholdPredictModelParam {
 
     String midGroup;
     Date date=new Date();
+
+    public ThresholdPredictModelParam(){}
 }