RankExtractorItemFeatureV2.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. package examples.extractor;
  2. import java.util.*;
  3. import java.util.stream.Collectors;
  4. public class RankExtractorItemFeatureV2 {
  5. public static Map<String, String> getItemRateFeature(Map<String, String> maps) {
  6. double d;
  7. Map<String, Double> result = new HashMap<>();
  8. d = ExtractorUtils.division("i_1day_exp_cnt", "i_1day_click_cnt", maps);
  9. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  10. result.put("i_1day_ctr",d);
  11. }
  12. d = ExtractorUtils.division("i_1day_exp_cnt", "i_1day_share_cnt", maps);
  13. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  14. result.put("i_1day_str",d);
  15. }
  16. d = ExtractorUtils.division("i_1day_exp_cnt", "i_1day_return_cnt", maps);
  17. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  18. result.put("i_1day_rov",d);
  19. }
  20. d = ExtractorUtils.division("i_1day_share_cnt", "i_1day_return_cnt", maps);
  21. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  22. result.put("i_1day_ros",d);
  23. }
  24. d = ExtractorUtils.division("i_3day_exp_cnt", "i_3day_click_cnt", maps);
  25. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  26. result.put("i_3day_ctr",d);
  27. }
  28. d = ExtractorUtils.division("i_3day_exp_cnt", "i_3day_share_cnt", maps);
  29. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  30. result.put("i_3day_str",d);
  31. }
  32. d = ExtractorUtils.division("i_3day_exp_cnt", "i_3day_return_cnt", maps);
  33. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  34. result.put("i_3day_rov",d);
  35. }
  36. d = ExtractorUtils.division("i_3day_share_cnt", "i_3day_return_cnt", maps);
  37. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  38. result.put("i_3day_ros",d);
  39. }
  40. d = ExtractorUtils.division("i_7day_exp_cnt", "i_7day_click_cnt", maps);
  41. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  42. result.put("i_7day_ctr",d);
  43. }
  44. d = ExtractorUtils.division("i_7day_exp_cnt", "i_7day_share_cnt", maps);
  45. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  46. result.put("i_7day_str",d);
  47. }
  48. d = ExtractorUtils.division("i_7day_exp_cnt", "i_7day_return_cnt", maps);
  49. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  50. result.put("i_7day_rov",d);
  51. }
  52. d = ExtractorUtils.division("i_7day_share_cnt", "i_7day_return_cnt", maps);
  53. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  54. result.put("i_7day_ros",d);
  55. }
  56. d = ExtractorUtils.division("i_3month_exp_cnt", "i_3month_click_cnt", maps);
  57. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  58. result.put("i_3month_ctr",d);
  59. }
  60. d = ExtractorUtils.division("i_3month_exp_cnt", "i_3month_share_cnt", maps);
  61. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  62. result.put("i_3month_str",d);
  63. }
  64. d = ExtractorUtils.division("i_3month_exp_cnt", "i_3month_return_cnt", maps);
  65. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  66. result.put("i_3month_rov",d);
  67. }
  68. d = ExtractorUtils.division("i_3month_share_cnt", "i_3month_return_cnt", maps);
  69. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  70. result.put("i_3month_ros",d);
  71. }
  72. Map<String, String> result2 = new HashMap<>();
  73. for (Map.Entry<String, Double> entry : result.entrySet()){
  74. result2.put(entry.getKey(), String.valueOf(entry.getValue()));
  75. }
  76. return result2;
  77. }
  78. public static Map<String, String> getItemRealtimeTrend(Map<String, Map<String, Double>> maps, String date, String hour){
  79. Map<String, Double> result1 = new HashMap<>();
  80. Map<String, Double> result2 = new HashMap<>();
  81. if (date.isEmpty() || hour.isEmpty()){
  82. return rateFeatureChange(result1);
  83. }
  84. int N = 6;
  85. List<String> hourStrs = ExtractorUtils.generateHourStrings(date + hour, N);
  86. String key;
  87. key = "share_uv_list_1day";
  88. if (maps.containsKey(key)){
  89. Map<String, Double> fList = maps.get(key);
  90. List<Double> arrs = hourStrs.stream().map(r -> fList.getOrDefault(r, 0.0D)).collect(Collectors.toList());
  91. Collections.reverse(arrs);
  92. result1.put(key+"_"+N+"_avg", ExtractorUtils.calculateAverage(arrs));
  93. result1.put(key+"_"+N+"_var", ExtractorUtils.calculateVariance(arrs));
  94. List<Double> arrsDiff = ExtractorUtils.calculateDifferences(arrs);
  95. result2.put(key+"_diff_"+N+"_avg", ExtractorUtils.calculateAverage(arrsDiff));
  96. result2.put(key+"_diff_"+N+"_var", ExtractorUtils.calculateVariance(arrsDiff));
  97. }
  98. key = "return_uv_list_1day";
  99. if (maps.containsKey(key)){
  100. Map<String, Double> fList = maps.get(key);
  101. List<Double> arrs = hourStrs.stream().map(r -> fList.getOrDefault(r, 0.0D)).collect(Collectors.toList());
  102. Collections.reverse(arrs);
  103. result1.put(key+"_"+N+"_avg", ExtractorUtils.calculateAverage(arrs));
  104. result1.put(key+"_"+N+"_var", ExtractorUtils.calculateVariance(arrs));
  105. List<Double> arrsDiff = ExtractorUtils.calculateDifferences(arrs);
  106. result2.put(key+"_diff_"+N+"_avg", ExtractorUtils.calculateAverage(arrsDiff));
  107. result2.put(key+"_diff_"+N+"_var", ExtractorUtils.calculateVariance(arrsDiff));
  108. }
  109. key = "share_uv_list_1h";
  110. if (maps.containsKey(key)){
  111. Map<String, Double> fList = maps.get(key);
  112. List<Double> arrs = hourStrs.stream().map(r -> fList.getOrDefault(r, 0.0D)).collect(Collectors.toList());
  113. Collections.reverse(arrs);
  114. result1.put(key+"_"+N+"_avg", ExtractorUtils.calculateAverage(arrs));
  115. result1.put(key+"_"+N+"_var", ExtractorUtils.calculateVariance(arrs));
  116. List<Double> arrsDiff = ExtractorUtils.calculateDifferences(arrs);
  117. result2.put(key+"_diff_"+N+"_avg", ExtractorUtils.calculateAverage(arrsDiff));
  118. result2.put(key+"_diff_"+N+"_var", ExtractorUtils.calculateVariance(arrsDiff));
  119. }
  120. key = "return_uv_list_1h";
  121. if (maps.containsKey(key)){
  122. Map<String, Double> fList = maps.get(key);
  123. List<Double> arrs = hourStrs.stream().map(r -> fList.getOrDefault(r, 0.0D)).collect(Collectors.toList());
  124. Collections.reverse(arrs);
  125. result1.put(key+"_"+N+"_avg", ExtractorUtils.calculateAverage(arrs));
  126. result1.put(key+"_"+N+"_var", ExtractorUtils.calculateVariance(arrs));
  127. List<Double> arrsDiff = ExtractorUtils.calculateDifferences(arrs);
  128. result2.put(key+"_diff_"+N+"_avg", ExtractorUtils.calculateAverage(arrsDiff));
  129. result2.put(key+"_diff_"+N+"_var", ExtractorUtils.calculateVariance(arrsDiff));
  130. }
  131. Map<String, String> result = new HashMap<>();
  132. for (Map.Entry<String, Double> entry : result1.entrySet()){
  133. result.put(entry.getKey(), String.valueOf(entry.getValue()));
  134. }
  135. for (Map.Entry<String, Double> entry : result2.entrySet()){
  136. result.put(entry.getKey(), String.valueOf(entry.getValue()));
  137. }
  138. return result;
  139. }
  140. public static Map<String, String> rateFeatureChange(Map<String, Double> maps){
  141. Map<String, String> result = new HashMap<>();
  142. for (Map.Entry<String, Double> entry : maps.entrySet()){
  143. int value = ExtractorUtils.ceilLogRate(entry.getValue());
  144. result.put(entry.getKey(), String.valueOf(value));
  145. }
  146. return result;
  147. }
  148. public static Map<String, String> cntFeatureChange4Double(Map<String, Double> maps){
  149. Map<String, String> result = new HashMap<>();
  150. for (Map.Entry<String, Double> entry : maps.entrySet()){
  151. int value = ExtractorUtils.bucketCnt(entry.getValue());
  152. result.put(entry.getKey(), String.valueOf(value));
  153. }
  154. return result;
  155. }
  156. public static Map<String, String> cntFeatureChange(Map<String, String> maps,
  157. Set<String> names){
  158. Map<String, String> result = new HashMap<>();
  159. for (Map.Entry<String, String> entry : maps.entrySet()){
  160. if (!names.contains(entry.getKey())){
  161. continue;
  162. }
  163. int value = ExtractorUtils.bucketCnt(Double.valueOf(entry.getValue()));
  164. result.put(entry.getKey(), String.valueOf(value));
  165. }
  166. return result;
  167. }
  168. public static Map<String, String> getItemRealtimeCnt(Map<String, Map<String, Double>> maps,
  169. Set<String> names,
  170. String date, String hour){
  171. Map<String, String> result = new HashMap<>();
  172. if (date.isEmpty() || hour.isEmpty()){
  173. return result;
  174. }
  175. String dateHour = ExtractorUtils.subtractHours(date + hour, 0);
  176. for (Map.Entry<String, Map<String, Double>> entry : maps.entrySet()){
  177. if (!names.contains(entry.getKey())){
  178. continue;
  179. }
  180. Double num = entry.getValue().getOrDefault(dateHour, 0.0);
  181. if (!ExtractorUtils.isDoubleEqualToZero(num)){
  182. result.put(entry.getKey(), String.valueOf(num));
  183. }
  184. }
  185. return result;
  186. }
  187. public static Map<String, String> getItemRealtimeRate(Map<String, Map<String, Double>> maps,
  188. String date, String hour){
  189. Map<String, Double> result = new HashMap<>();
  190. if (date.isEmpty() || hour.isEmpty()){
  191. return rateFeatureChange(result);
  192. }
  193. String dateHour = ExtractorUtils.subtractHours(date + hour, 0);
  194. double d, d1, d2;
  195. String k1, k2;
  196. k1 = "view_pv_list_1day";
  197. k2 = "play_pv_list_1day";
  198. if (maps.containsKey(k1) && maps.containsKey(k2)){
  199. d1 = maps.get(k1).getOrDefault(dateHour, 0.0);
  200. d2 = maps.get(k2).getOrDefault(dateHour, 0.0);
  201. d = ExtractorUtils.divisionDouble(d1, d2);
  202. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  203. result.put("i_1day_ctr_rt", d);
  204. }
  205. }
  206. k1 = "view_pv_list_1day";
  207. k2 = "share_pv_list_1day";
  208. if (maps.containsKey(k1) && maps.containsKey(k2)){
  209. d1 = maps.get(k1).getOrDefault(dateHour, 0.0);
  210. d2 = maps.get(k2).getOrDefault(dateHour, 0.0);
  211. d = ExtractorUtils.divisionDouble(d1, d2);
  212. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  213. result.put("i_1day_str_rt", d);
  214. }
  215. }
  216. k1 = "share_pv_list_1day";
  217. k2 = "return_uv_list_1day";
  218. if (maps.containsKey(k1) && maps.containsKey(k2)){
  219. d1 = maps.get(k1).getOrDefault(dateHour, 0.0);
  220. d2 = maps.get(k2).getOrDefault(dateHour, 0.0);
  221. d = ExtractorUtils.divisionDouble(d1, d2);
  222. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  223. result.put("i_1day_ros_rt", d);
  224. }
  225. }
  226. k1 = "view_pv_list_1day";
  227. k2 = "return_uv_list_1day";
  228. if (maps.containsKey(k1) && maps.containsKey(k2)){
  229. d1 = maps.get(k1).getOrDefault(dateHour, 0.0);
  230. d2 = maps.get(k2).getOrDefault(dateHour, 0.0);
  231. d = ExtractorUtils.divisionDouble(d1, d2);
  232. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  233. result.put("i_1day_rov_rt", d);
  234. }
  235. }
  236. //---
  237. k1 = "view_pv_list_1h";
  238. k2 = "play_pv_list_1h";
  239. if (maps.containsKey(k1) && maps.containsKey(k2)){
  240. d1 = maps.get(k1).getOrDefault(dateHour, 0.0);
  241. d2 = maps.get(k2).getOrDefault(dateHour, 0.0);
  242. d = ExtractorUtils.divisionDouble(d1, d2);
  243. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  244. result.put("i_1h_ctr_rt", d);
  245. }
  246. }
  247. k1 = "view_pv_list_1h";
  248. k2 = "share_pv_list_1h";
  249. if (maps.containsKey(k1) && maps.containsKey(k2)){
  250. d1 = maps.get(k1).getOrDefault(dateHour, 0.0);
  251. d2 = maps.get(k2).getOrDefault(dateHour, 0.0);
  252. d = ExtractorUtils.divisionDouble(d1, d2);
  253. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  254. result.put("i_1h_str_rt", d);
  255. }
  256. }
  257. k1 = "share_pv_list_1day";
  258. k2 = "return_uv_list_1h";
  259. if (maps.containsKey(k1) && maps.containsKey(k2)){
  260. d1 = maps.get(k1).getOrDefault(dateHour, 0.0);
  261. d2 = maps.get(k2).getOrDefault(dateHour, 0.0);
  262. d = ExtractorUtils.divisionDouble(d1, d2);
  263. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  264. result.put("i_1h_ros_rt", d);
  265. }
  266. }
  267. k1 = "view_pv_list_1h";
  268. k2 = "return_uv_list_1h";
  269. if (maps.containsKey(k1) && maps.containsKey(k2)){
  270. d1 = maps.get(k1).getOrDefault(dateHour, 0.0);
  271. d2 = maps.get(k2).getOrDefault(dateHour, 0.0);
  272. d = ExtractorUtils.divisionDouble(d1, d2);
  273. if (!ExtractorUtils.isDoubleEqualToZero(d)){
  274. result.put("i_1h_rov_rt", d);
  275. }
  276. }
  277. Map<String, String> result2 = new HashMap<>();
  278. for (Map.Entry<String, Double> entry : result.entrySet()){
  279. result2.put(entry.getKey(), String.valueOf(entry.getValue()));
  280. }
  281. return result2;
  282. }
  283. public static void main(String[] args) {
  284. String s1 = "share_uv_list_1day";
  285. String s2 = "2024011300:2,2024011301:2,2024011304:2,2024011309:3,2024011311:3,2024011314:4,2024011315:4,2024011321:1,2024011323:1,2024011400:1,2024011401:1,2024011404:1,2024011406:1,2024011407:1,2024011408:1,2024011410:1,2024011423:1,2024011302:2,2024011305:2,2024011312:4,2024011313:4,2024011317:4,2024011318:4,2024011319:3,2024011320:1,2024011403:1,2024011409:1,2024011411:1,2024011419:1,2024011420:1,2024011422:1,2024011303:2,2024011306:2,2024011307:2,2024011308:2,2024011310:3,2024011316:4,2024011322:1,2024011402:1,2024011405:1,2024011421:1";
  286. Map<String, Double> m1 = new HashMap<>();
  287. Map<String, Map<String, Double>> maps = new HashMap<>();
  288. for (String s : s2.split(",")){
  289. String s3 = s.split(":")[0];
  290. String s4 = s.split(":")[1];
  291. m1.put(s3, Double.valueOf(s4));
  292. }
  293. maps.put(s1, m1);
  294. String date = "20240114";
  295. String hour = "20";
  296. System.out.println(getItemRealtimeTrend(maps, date, hour));
  297. }
  298. }