UNPKG

zk-draw

Version:

canvas绘制AI数据的一个工具类

185 lines (158 loc) 4.83 kB
/* * @Author: wangfpp * @Date: 2020-05-02 20:42:44 * @Last Modified by: wangfpp * @Last Modified time: 2020-06-05 17:38:30 */ import { splitArr } from '../../comm/comm.js'; import titles from './titles.json'; // import { drawStLine } from './draw_st_line/draw_st_line.js'; // import { createTable } from './draw_st_table/draw_st_table.js'; // import { drawRtCh } from './draw_rtch/draw_rtch.js'; /** * @description 对原始分析结果的数据处理函数 * @param {Array} result [AI原始数据] * @param {Number} Smax [每个合并数据中有几个S才合并为S] * @param {Object} [titles2] [行为归属] * @return {Object} [description] */ const handleData = (result, Smax, titles2) => { let recGap = 6, // 分析间隔 len = result.length, timeLength = (result[len - 1] && result[len - 1][0] && result[len - 1][0][0]) ? Math.ceil(result[len - 1][0][0] / recGap) : 0; if (!timeLength) { return null; } titles2 = titles2 || titles; // 遍历原始数据 取出时间戳 行为分类 以及行为归属 let timeData = result.map(item => { let time = parseInt(item[0][0]), catlog = item[2][1], actionClassify = actionClassifyFn(catlog, titles2); return {time, catlog, actionClassify}; }); // 对数据根据分析间隔来分类 装进每一个分析间隔中的array中 let perMergeData = [], _index = 0; while (_index < timeLength) { let empytArr = []; timeData.forEach((item, index) => { let { time, actionClassify } = item, timeStart = (_index * recGap), timeEnd = ((_index + 1) * recGap); if (time >= timeStart && time < timeEnd) { empytArr.push(actionClassify); } }); // 每6s合并进一个数据 如果全为S归为S 否则归为T if (empytArr.length && empytArr.every(isEveryS)) { perMergeData[_index] = 'S'; } else { perMergeData[_index] = 'T'; } _index++; } // [s, t, t, t, s, s, s, t] => [[s,t,t,t,s], [s,s,t]....] // 按每5个一组分割数组 5个一组 每次分析6s 则每一组为30s的数据 let splitAfterArr = splitArr(5, perMergeData); // 以下开始进行ST数据合并处理 let mergedData = splitAfterArr.map(item => { let scount = 0; item.forEach(catlog => { if (catlog === 'S') { scount ++; } }) if (scount >= Smax) { item = 'S'; } else { item = 'T'; } return item; }) // 计算ST的结果数据 let processData = cal_st(mergedData); return { permerge: perMergeData, // 未合并的数据 mergeData: mergedData, //合并后的数据 rtch: processData // ST结果 } } /** * 计算S T的数量以及行为转化率和课堂类型 * @param {Array} data [S T待计算数据] * @return {Object} {} */ const cal_st = data =>{ let s = 0,t = 0,Rt = 0, Rs = 0, Ch = 0, catlogCount = 0, type = ''; let curr = data[0]; for (let i = 0; i < data.length; i++) { if (data[i] == 'T') { t++; } else if (data[i] == 'S') { s++; } if (curr !== data[i]) { curr = data[i]; Ch++; } } catlogCount = (s + t); Rt = (t / catlogCount).toFixed(2); Rs = (s / catlogCount).toFixed(2); Ch = (Ch / catlogCount).toFixed(2); type = cal_type(Rt,Ch); return {s, t, rt: Rt, rs: Rs, ch: Ch, type}; } /** * 按照ST规则得出课堂类型 * @param {Number} Rt [RT占比] * @param {Number} Ch [Ch占比] * @return {String} 返回课堂类型 */ const cal_type = (Rt,Ch) =>{ let type = "" if (Rt <= 0.3) { type = '练习型' } else if (Rt >= 0.7) { type = '讲授型' } if (Ch >= 0.4) { type = '对话型' } if ((Rt > 0.3 && Rt < 0.7) && Ch < 0.4) { type = '混合型' } return type } /** * 判断数组中的每个元素是否是S * @param {String} actionClassify * @return {Boolean} */ const isEveryS = actionClassify => { return actionClassify === 'S'; } /** * 行为归属为教师还是学生 * @param {String} catlog [行为的catlog] * @param {Object} titles [分析机的titles2] * @return {String} 返回行为归属 */ const actionClassifyFn = (catlog, titles) => { let { student, teacher } = titles; if (student.includes(catlog)) { return 'S'; } else { return 'T'; } } // let data = handleData(orinalData, 3, titles); // let { mergeData, permerge, rtch } = data; // let node = document.querySelector('#root'), // rtchNode = document.querySelector('#rtch'), // tableNode = document.querySelector('#table'); // drawStLine(node, null, '#000', false, [{data: permerge, title: '教授A', scolor: '', tcolor: '', lineWidth: 3},{data: mergeData, title: '教授b', scolor: '', tcolor: '', lineWidth: 3}]); // createTable(tableNode, mergeData, 15); // drawRtCh(rtchNode, null, '#f00', "", "", [{...rtch}]); export { handleData };