🏠 Home 

Greasy Fork is available in English.

数据工厂_模型结果导出

云图扩展工具

  1. // ==UserScript==
  2. // @name 数据工厂_模型结果导出
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.9.1
  5. // @description 云图扩展工具
  6. // @author siji-Xian
  7. // @match *://yuntu.oceanengine.com/yuntu_brand/data_factory/model_prediction/model/list?*
  8. // @icon https://lf3-static.bytednsdoc.com/obj/eden-cn/prhaeh7pxvhn/yuntu/yuntu-logo_default.svg
  9. // @grant none
  10. // @license MIT
  11. // @require https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.2.1/jquery.min.js
  12. // @require https://cdn.bootcss.com/moment.js/2.20.1/moment.min.js
  13. // @require https://greasyfork.org/scripts/404478-jsonexportexcel-min/code/JsonExportExcelmin.js?version=811266
  14. // @require https://greasyfork.org/scripts/455576-qmsg/code/Qmsg.js?version=1122361
  15. // ==/UserScript==
  16. (function () {
  17. "use strict";
  18. var new_element = document.createElement("link");
  19. new_element.setAttribute("rel", "stylesheet");
  20. new_element.setAttribute("href", "https://qmsg.refrain.xyz/message.min.css");
  21. document.body.appendChild(new_element);
  22. var button2 = document.createElement("button"); //创建一个按钮
  23. button2.textContent = "导出特征信息熵"; //按钮内容
  24. button2.style.height = "34px"; //高
  25. button2.style.lineHeight = "34px"; //行高
  26. button2.style.align = "center"; //文本居中
  27. button2.style.color = "#FFF"; //按钮文字颜色
  28. button2.style.background = "rgb(234,94,32)"; //按钮底色
  29. button2.style.border = "0px solid #eee"; //边框属性
  30. button2.style.borderRadius = "2px"; //按钮四个角弧度
  31. button2.style.marginLeft = "10px";
  32. button2.style.fontSize = "14px";
  33. button2.style.padding = "0 15px";
  34. button2.style.position = "absolute";
  35. button2.style.top = "49px";
  36. button2.style.right = "0px";
  37. button2.style.zIndex = "999";
  38. button2.addEventListener("click", ()=>urlClick(1)); //监听按钮点击事件
  39. var button = document.createElement("button"); //创建一个按钮
  40. button.textContent = "导出数据"; //按钮内容
  41. button.style.height = "34px"; //高
  42. button.style.lineHeight = "34px"; //行高
  43. button.style.align = "center"; //文本居中
  44. button.style.color = "#FFF"; //按钮文字颜色
  45. button.style.background = "rgb(234,94,32)"; //按钮底色
  46. button.style.border = "0px solid #eee"; //边框属性
  47. button.style.borderRadius = "2px"; //按钮四个角弧度
  48. button.style.marginLeft = "10px";
  49. button.style.fontSize = "14px";
  50. button.style.padding = "0 15px";
  51. button.style.position = "absolute";
  52. button.style.top = "0px";
  53. button.style.right = "0px";
  54. button.style.zIndex = "999";
  55. button.addEventListener("click", ()=>urlClick(0)); //监听按钮点击事件
  56. const getRequestOptions = {
  57. method: "GET",
  58. redirect: "follow",
  59. };
  60. //获取brand信息
  61. let brand = localStorage.getItem("__Garfish__platform__yuntu_user") || "";
  62. let brands = JSON.parse(brand);
  63. function getQueryVariable(variable) {
  64. var query = window.location.search.substring(1);
  65. var vars = query.split("&");
  66. for (var i = 0; i < vars.length; i++) {
  67. var pair = vars[i].split("=");
  68. if (pair[0] == variable) {
  69. return pair[1];
  70. }
  71. }
  72. return false;
  73. }
  74. //message.js
  75. let loadingMsg = null;
  76. let xhrList = [];
  77. (function listen() {
  78. var origin = {
  79. open: XMLHttpRequest.prototype.open,
  80. send: XMLHttpRequest.prototype.send,
  81. };
  82. XMLHttpRequest.prototype.open = function (a, b) {
  83. this.addEventListener("load", replaceFn);
  84. origin.open.apply(this, arguments);
  85. };
  86. XMLHttpRequest.prototype.send = function (a, b) {
  87. origin.send.apply(this, arguments);
  88. };
  89. function replaceFn(obj) {
  90. if (this?._url?.slice(0, 28) == "/data_factory/api/model/list") {
  91. xhrList.push(obj.target._reqHeaders);
  92. }
  93. }
  94. })();
  95. function appendDoc() {
  96. setTimeout(() => {
  97. var like_comment = document.querySelectorAll("body")[0];
  98. if (like_comment) {
  99. like_comment.append(button); //把按钮加入到 x 的子节点中
  100. like_comment.append(button2); //把按钮加入到 x 的子节点中
  101. return;
  102. }
  103. appendDoc();
  104. }, 1000);
  105. }
  106. appendDoc();
  107. function checkElement() {
  108. const targetElement = document.querySelector(".index__name--cRoDQ");
  109. if (targetElement) {
  110. button.style.display = "block";
  111. button2.style.display = "block";
  112. } else {
  113. button.style.display = "none";
  114. button2.style.display = "none";
  115. }
  116. }
  117. const intervalId = setInterval(checkElement, 1000);
  118. function fetchFun(url, data, requestOptions = getRequestOptions) {
  119. const urlData = Object.keys(data)
  120. .map((v) => `${v}=${data[v]}`)
  121. .join("&");
  122. return fetch(`${url}?${urlData}`, requestOptions)
  123. .then((response) => response.text())
  124. .then((r###lt) => {
  125. return JSON.parse(r###lt);
  126. })
  127. .catch((error) => console.log("error", error));
  128. }
  129. async function task_list() {
  130. let myHeaders = new Headers();
  131. myHeaders.append("accept", "application/json, text/plain, */*");
  132. myHeaders.append("content-type", "application/json;charset=UTF-8");
  133. myHeaders.append("x-csrf-token", xhrList[0]["x-csrf-token"]);
  134. let element = document.querySelector(".index__name--cRoDQ");
  135. let content = element.firstChild.innerText;
  136. let data = {
  137. aadvid: getQueryVariable("aadvid"),
  138. };
  139. let raw = JSON.stringify({
  140. limit: "10",
  141. offset: "0",
  142. without_detail: true,
  143. });
  144. const postRequestOptions = {
  145. method: "POST",
  146. headers: myHeaders,
  147. body: raw,
  148. redirect: "follow",
  149. };
  150. let total = await fetchFun(
  151. "https://yuntu.oceanengine.com/data_factory/api/model/list",
  152. data,
  153. postRequestOptions
  154. );
  155. let raw1 = JSON.stringify({
  156. limit: total?.data?.total,
  157. offset: "0",
  158. without_detail: true,
  159. });
  160. const postRequestOptions1 = {
  161. method: "POST",
  162. headers: myHeaders,
  163. body: raw1,
  164. redirect: "follow",
  165. };
  166. let res = await fetchFun(
  167. "https://yuntu.oceanengine.com/data_factory/api/model/list",
  168. data,
  169. postRequestOptions1
  170. );
  171. let targetObj = res?.data?.items?.filter((v) => {
  172. return v.model_name === content;
  173. })[0];
  174. return targetObj;
  175. }
  176. function convertArrayToObject(arr) {
  177. const headers = arr[0];
  178. const data = arr.slice(1);
  179. return data.map((row) =>
  180. Object.fromEntries(row.map((val, i) => [headers[i], val]))
  181. );
  182. }
  183. function transformData(arr,Maps) {
  184. const r###lt = [];
  185. arr.forEach((data) => {
  186. const transformedDataArray = [];
  187. data.forEach((bucketData) => {
  188. const {
  189. categories,
  190. feature_id,
  191. bucket_name,
  192. cluster_id,
  193. one_proportion,
  194. all_one_proportion,
  195. tgi,
  196. sort_key,
  197. } = {...bucketData,...Maps.get(bucketData.feature_id)};
  198. let transformedData = transformedDataArray.find(
  199. (d) => d.feature_id === feature_id && d.bucket_name === bucket_name
  200. );
  201. if (!transformedData) {
  202. transformedData = {
  203. categories,
  204. feature_id,
  205. bucket_name,
  206. };
  207. transformedDataArray.push(transformedData);
  208. }
  209. transformedData[`one_proportion_${cluster_id}`] = one_proportion;
  210. transformedData[`all_one_proportion_${cluster_id}`] =
  211. all_one_proportion;
  212. transformedData[`tgi_${cluster_id}`] = tgi;
  213. transformedData[`sort_key_${cluster_id}`] = sort_key;
  214. });
  215. r###lt.push(transformedDataArray);
  216. });
  217. return r###lt;
  218. }
  219. async function getData(e) {
  220. let elements = Array.from(document.querySelectorAll(".dfmp-tag-closable"));
  221. let textContents = elements.map((element) => element.textContent);
  222. if (!textContents.length) {
  223. Qmsg.error("未选择特征!");
  224. return;
  225. }
  226. loadingMsg = Qmsg.loading("正在导出,请勿重复点击!");
  227. let targetObj = await task_list();
  228. let inputArray = JSON.parse(targetObj.clustering_info);
  229. const outputArray = convertArrayToObject(inputArray);
  230. let data = {
  231. aadvid: getQueryVariable("aadvid"),
  232. };
  233. var myHeaders = new Headers();
  234. myHeaders.append("authority", "yuntu.oceanengine.com");
  235. myHeaders.append("accept", "application/json, text/plain, */*");
  236. myHeaders.append("accept-language", "zh-CN,zh;q=0.9");
  237. myHeaders.append("content-type", "application/json;charset=UTF-8");
  238. myHeaders.append("x-csrf-token", xhrList[0]["x-csrf-token"]);
  239. const postRequestOptions = {
  240. method: "POST",
  241. headers: myHeaders,
  242. body: "{}",
  243. redirect: "follow",
  244. };
  245. let barData = await fetchFun(
  246. "https://yuntu.oceanengine.com/data_factory/api/model/feature/list",
  247. data,
  248. postRequestOptions
  249. );
  250. let barDataList = barData?.data?.items?.map((v) => {
  251. return { categories: v.categories.join("/"), feature_id: v.feature_id };
  252. });
  253. const barDataListMap = new Map(
  254. barDataList.map((item) => [item.categories, item])
  255. );
  256. let target = []
  257. textContents?.forEach((v) => {
  258. if (barDataListMap.get(v)) {
  259. target.push(barDataListMap.get(v))
  260. }
  261. });
  262. if (e) {
  263. expExcel2(target)
  264. return
  265. }
  266. let filtrationData = target.map((v) => {
  267. return outputArray.filter((t) => {
  268. return v?.feature_id === t?.feature_id;
  269. });
  270. });
  271. const barDataMap = new Map(
  272. barDataList.map((item) => [item.feature_id, item])
  273. );
  274. let transformData_target = transformData(filtrationData, barDataMap);
  275. expExcel(transformData_target);
  276. }
  277. function expExcel(transformData_target) {
  278. let title = document.getElementsByClassName("dfmp-table-th-title");
  279. let titleArr = Array.from(title);
  280. let contrasts = {};
  281. titleArr
  282. .filter((v, i) => {
  283. return i >= 10;
  284. })
  285. .map((v, i) => {
  286. contrasts[v.textContent + "占比"] = `one_proportion_${i}`;
  287. contrasts[v.textContent + "TGI"] = `tgi_${i}`;
  288. });
  289. let contrast = {
  290. 特征: "categories",
  291. 特征值: "bucket_name",
  292. ...contrasts,
  293. };
  294. let fileName = `聚类模型数据`;
  295. setTimeout(() => {
  296. let option = {};
  297. option.fileName = fileName; //文件名
  298. option.datas = transformData_target.map((v, i) => {
  299. return {
  300. sheetName: '',
  301. // sheetName: sheetName[i],
  302. sheetData: v.map((item) => {
  303. return item;
  304. }),
  305. sheetHeader: Object.keys(contrast),
  306. sheetFilter: Object.values(contrast),
  307. columnWidths: [], // 列宽
  308. };
  309. });
  310. var toExcel = new ExportJsonExcel(option);
  311. toExcel.saveExcel();
  312. setTimeout(() => {
  313. loadingMsg.close();
  314. }, 1000);
  315. }, 1000);
  316. }
  317. function expExcel2(e) {
  318. let contrast = {
  319. 特征: "categories",
  320. 特征ID: "feature_id",
  321. };
  322. let fileName = `特征信息熵`;
  323. let option = {};
  324. option.fileName = fileName; //文件名
  325. option.datas = [{
  326. sheetName: "",
  327. sheetData: e,
  328. sheetHeader: Object.keys(contrast),
  329. sheetFilter: Object.values(contrast),
  330. columnWidths: [], // 列宽
  331. }]
  332. var toExcel = new ExportJsonExcel(option);
  333. toExcel.saveExcel();
  334. setTimeout(() => {
  335. loadingMsg.close();
  336. }, 1000);
  337. }
  338. function urlClick(e) {
  339. getData(e);
  340. }
  341. })();