/* * Project Name : Visual Python * Description : GUI-based Python code generator * File Name : FitPredict.js * Author : Black Logic * Note : Model fit / predict * License : GNU GPLv3 with Visual Python special exception * Date : 2022. 04. 20 * Change Date : */ //============================================================================ // [CLASS] FitPredict //============================================================================ define([ __VP_TEXT_LOADER__('vp_base/html/m_ml/fitPredict.html'), // INTEGRATION: unified version of text loader __VP_CSS_LOADER__('vp_base/css/m_ml/fitPredict'), // INTEGRATION: unified version of css loader 'vp_base/js/com/com_util', 'vp_base/js/com/com_String', 'vp_base/js/com/com_generatorV2', 'vp_base/data/m_ml/mlLibrary', 'vp_base/js/com/component/PopupComponent', 'vp_base/js/com/component/VarSelector2', 'vp_base/js/com/component/SuggestInput' ], function(msHtml, msCss, com_util, com_String, com_generator, ML_LIBRARIES, PopupComponent, VarSelector2, SuggestInput) { /** * FitPredict */ class FitPredict extends PopupComponent { _init() { super._init(); this.config.sizeLevel = 2; this.config.dataview = false; this.state = { // model selection category: 'All', model: '', modelType: '', method: '', action: {}, optionConfig: {}, userOption: '', ...this.state } // categories : Data Preparation / Regression / Classification / Clustering / Dimension Reduction / Auto ML this.modelCategories = [ 'All', ...vpConfig.getMLCategories() ] this.modelConfig = ML_LIBRARIES; this.loaded = false; } _bindEvent() { super._bindEvent(); /** Implement binding events */ var that = this; // click category $(this.wrapSelector('.vp-ins-select-list.category .vp-ins-select-item')).on('click', function() { let category = $(this).data('var-name'); that.state.category = category; $(that.wrapSelector('.vp-ins-select-list.category .vp-ins-select-item')).removeClass('selected'); $(this).addClass('selected'); // load model list for this category that.loadModelList(category); }); } templateForBody() { let page = $(msHtml); let that = this; //================================================================ // Model selection //================================================================ // set model category list let modelCategoryTag = new com_String(); this.modelCategories.forEach(category => { let selected = ''; if (category == that.state.category) { selected = 'selected'; } modelCategoryTag.appendFormatLine('
  • {5}
  • ', 'vp-ins-select-item', selected, category, 'category', category, category); }); $(page).find('.vp-ins-select-list.category').html(modelCategoryTag.toString()); //================================================================ // Load state //================================================================ Object.keys(this.state).forEach(key => { let tag = $(page).find('#' + key); let tagName = $(tag).prop('tagName'); // returns with UpperCase let value = that.state[key]; if (value == undefined) { return; } switch(tagName) { case 'INPUT': let inputType = $(tag).prop('type'); if (inputType == 'text' || inputType == 'number' || inputType == 'hidden') { $(tag).val(value); break; } if (inputType == 'checkbox') { $(tag).prop('checked', value); break; } break; case 'TEXTAREA': case 'SELECT': default: $(tag).val(value); break; } }); return page; } templateForOption(modelType) { let optionConfig = this.modelConfig[modelType]; let state = this.state; let optBox = new com_String(); // render tag optionConfig.options.forEach(opt => { optBox.appendFormatLine('' , opt.name, opt.name, com_util.optionToLabel(opt.name)); let content = com_generator.renderContent(this, opt.component[0], opt, state); optBox.appendLine(content[0].outerHTML); }); // render user option optBox.appendFormatLine('', 'userOption', 'User option'); optBox.appendFormatLine('', 'userOption', 'key=value, ...', this.state.userOption); return optBox.toString(); } render() { super.render(); this.loadModelList(this.state.category); } loadModelList(category='') { // reset page try { $(this.wrapSelector('.vp-ins-search')).autocomplete("destroy"); } catch { ; } $(this.wrapSelector('.vp-ins-select-list.action')).html(''); $(this.wrapSelector('.vp-ins-parameter-box')).html(''); if (category == 'All') { category = ''; } // set model list let that = this; let modelOptionTag = new com_String(); vpKernel.getModelList(category).then(function(resultObj) { let { result } = resultObj; var modelList = JSON.parse(result); modelList && modelList.forEach((model, idx) => { let selectFlag = ''; // if this item is pre-selected model or first item of model list if ((model.varName == that.state.model) || (that.state.model == '' && idx == 0)) { selectFlag = 'selected'; that.state.model = model.varName; that.state.modelType = model.varType; } modelOptionTag.appendFormatLine('
  • {5} ({6})
  • ', 'vp-ins-select-item', selectFlag, model.varName, model.varType, model.varName, model.varName, model.varType); }); $(that.wrapSelector('.vp-ins-select-list.model')).html(modelOptionTag.toString()); // click model event $(that.wrapSelector('.vp-ins-select-list.model .vp-ins-select-item')).on('click', function() { let model = $(this).data('var-name'); let modelType = $(this).data('var-type'); that.state.model = model; that.state.modelType = modelType; $(that.wrapSelector('.vp-ins-select-list.model .vp-ins-select-item')).removeClass('selected'); $(this).addClass('selected'); that.reload(); }); that.reload(); }); } /** * Load options for selected model */ reload() { // reset option page try { $(this.wrapSelector('.vp-ins-search')).autocomplete("destroy"); } catch { ; } $(this.wrapSelector('.vp-ins-select-list.action')).html(''); $(this.wrapSelector('.vp-ins-parameter-box')).html(''); let model = this.state.model; let modelType = this.state.modelType; let actions = this.getAction(modelType); this.state.action = { ...actions }; var actListTag = new com_String(); Object.keys(actions).forEach(actKey => { let titleText = actions[actKey].description; if (actions[actKey].name != actions[actKey].label) { titleText = actions[actKey].name + ': ' + titleText; } actListTag.appendFormatLine('
  • {4}
  • ', 'vp-ins-select-item', actKey, 'action', titleText, actions[actKey].label); }); $(this.wrapSelector('.vp-ins-select-list.action')).html(actListTag.toString()); let that = this; // action search suggest var suggestInput = new SuggestInput(); suggestInput.addClass('vp-input'); suggestInput.addClass('vp-ins-search'); suggestInput.setPlaceholder("Search Action"); suggestInput.setSuggestList(function () { return Object.keys(actions); }); suggestInput.setSelectEvent(function (value, item) { $(this.wrapSelector()).val(value); $(that.wrapSelector('.vp-ins-type.action')).val(value); $(that.wrapSelector('.vp-ins-select-item[data-var-name="' + value + '"]')).click(); }); $(that.wrapSelector('.vp-ins-search')).replaceWith(function () { return suggestInput.toTagString(); }); // bind event // click option $(this.wrapSelector('.vp-ins-select-list.action .vp-ins-select-item')).on('click', function() { let name = $(this).data('var-name'); let type = $(this).data('var-type'); that.renderOptionPage(type, name); let optionPage = $(that.wrapSelector('.vp-ins-parameter-box')).get(0); optionPage && optionPage.scrollIntoView(); }); // load once on initializing page if (this.loaded == false) { let { modelEditorType, modelEditorName } = this.state; if (modelEditorType != '' && modelEditorName != '') { // render option page for saved state that.renderOptionPage(modelEditorType, modelEditorName); } // set loaded true this.loaded = true; } } /** * Render option page for selected option * @param {String} type action / info * @param {String} name option name (ex. fit/predict/...) */ renderOptionPage(type, name) { if (this.state[type] != undefined && this.state[type][name] != undefined) { let optionConfig = this.state[type][name]; let optBox = new com_String(); // render tag optionConfig && optionConfig.options && optionConfig.options.forEach(opt => { let label = opt.name; if (opt.label != undefined) { label = opt.label; } // fix label label = com_util.optionToLabel(label); optBox.appendFormatLine('' , opt.name, opt.name, label); let content = com_generator.renderContent(this, opt.component[0], opt, this.state); optBox.appendLine(content[0].outerHTML); }); // replace option box $(this.wrapSelector('.vp-ins-parameter-box')).html(optBox.toString()); this.state.optionConfig = optionConfig; // add selection let typeClass = '.vp-ins-select-list.' + type; let nameClass = '.vp-ins-select-item[data-var-name="' + name + '"]'; $(this.wrapSelector(typeClass + ' ' + '.vp-ins-select-item')).removeClass('selected'); $(this.wrapSelector(typeClass + ' ' + nameClass)).addClass('selected'); // set state $(this.wrapSelector('#modelEditorType')).val(type); $(this.wrapSelector('#modelEditorName')).val(name); this.state.modelEditorType = type; this.state.modelEditorName = name; } } generateCode() { let { model } = this.state; let code = new com_String(); let replaceDict = {'${model}': model}; if (this.state.optionConfig.import != undefined) { code.appendLine(this.state.optionConfig.import); code.appendLine(); } let modelCode = com_generator.vp_codeGenerator(this, this.state.optionConfig, this.state); if (modelCode) { Object.keys(replaceDict).forEach(key => { modelCode = modelCode.replace(key, replaceDict[key]); }); code.append(modelCode); let allocateIdx = modelCode.indexOf(' = '); if (allocateIdx >= 0) { let allocateCode = modelCode.substr(0, allocateIdx); code.appendLine(); code.append(allocateCode); } } return code.toString(); } getModelCategory(modelType) { let mlDict = vpConfig.getMLDataDict(); let keys = Object.keys(mlDict); let modelCategory = ''; for (let i = 0; i < keys.length; i++) { let key = keys[i]; if (mlDict[key].includes(modelType)) { modelCategory = key; break; } } return modelCategory; } getAction(modelType) { let category = this.getModelCategory(modelType); let defaultActions = { 'fit': { name: 'fit', label: 'Fit', code: '${model}.fit(${fit_featureData}, ${fit_targetData})', description: 'Perform modeling from features, or distance matrix.', options: [ { name: 'fit_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X_train' }, { name: 'fit_targetData', label: 'Target Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'y_train' } ] }, 'predict': { name: 'predict', label: 'Predict', code: '${pred_allocate} = ${model}.predict(${pred_featureData})', description: 'Predict the closest target data X belongs to.', options: [ { name: 'pred_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X_test' }, { name: 'pred_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'pred' } ] }, 'predict_proba': { name: 'predict_proba', label: 'Predict probability', code: '${pred_prob_allocate} = ${model}.predict_proba(${pred_prob_featureData})', description: 'Predict class probabilities for X.', options: [ { name: 'pred_prob_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X_test' }, { name: 'pred_prob_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'pred' } ] }, 'transform': { name: 'transform', label: 'Transform', code: '${trans_allocate} = ${model}.transform(${trans_featureData})', description: 'Apply dimensionality reduction to X.', options: [ { name: 'trans_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'trans_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'trans' } ] } }; let actions = {}; switch (category) { case 'Data Preparation': actions = { 'fit': { name: 'fit', label: 'Fit', code: '${model}.fit(${fit_featureData})', description: 'Fit Encoder/Scaler to X.', options: [ { name: 'fit_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' } ] }, 'fit_transform': { name: 'fit_transform', label: 'Fit and transform', code: '${fit_trans_allocate} = ${model}.fit_transform(${fit_trans_featureData})', description: 'Fit Encoder/Scaler to X, then transform X.', options: [ { name: 'fit_trans_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'fit_trans_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'trans' } ] }, 'transform': { ...defaultActions['transform'], description: 'Transform labels to normalized encoding.' } } if (modelType != 'ColumnTransformer') { actions = { ...actions, 'inverse_transform': { name: 'inverse_transform', label: 'Inverse transform', code: '${inverse_allocate} = ${model}.inverse_transform(${inverse_featureData})', description: 'Transform binary labels back to multi-class labels.', options: [ { name: 'inverse_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'inverse_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'inv_trans' } ] } } } if (modelType === 'SMOTE') { actions = { 'fit': { name: 'fit', label: 'Fit', code: '${model}.fit(${fit_featureData}, ${fit_targetData})', description: 'Check inputs and statistics of the sampler.', options: [ { name: 'fit_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X_train' }, { name: 'fit_targetData', label: 'Target Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'y_train' } ] }, 'fit_resample': { name: 'fit_resample', label: 'Fit and resample', code: '${fit_res_allocateX}, ${fit_res_allocatey} = ${model}.fit_resample(${fit_res_featureData}, ${fit_res_targetData})', description: 'Resample the dataset.', options: [ { name: 'fit_res_allocateX', label: 'Allocate feature', component: ['input'], placeholder: 'New variable', value: 'X_res' }, { name: 'fit_res_allocatey', label: 'Allocate target', component: ['input'], placeholder: 'New variable', value: 'y_res' }, { name: 'fit_res_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X_train' }, { name: 'fit_res_targetData', label: 'Target Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'y_train' } ] } } } break; case 'Regression': actions = { 'fit': defaultActions['fit'], 'predict': defaultActions['predict'] } break; case 'Classification': actions = { 'fit': defaultActions['fit'], 'predict': defaultActions['predict'], 'predict_proba': defaultActions['predict_proba'], } if (['LogisticRegression', 'SVC', 'GradientBoostingClassifier'].includes(modelType)) { actions = { ...actions, 'decision_function': { name: 'decision_function', label: 'Decision function', code: '${dec_allocate} = ${model}.decision_function(${dec_featureData})', description: 'Compute the decision function of X.', options: [ { name: 'dec_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'dec_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable' } ] } } } break; case 'Auto ML': actions = { 'fit': defaultActions['fit'], 'predict': defaultActions['predict'], 'fit_predict': { name: 'fit_predict', label: 'Fit and predict', code: '${fit_pred_allocate} = ${model}.fit_predict(${fit_pred_featureData})', description: 'Fit and predict.', options: [ { name: 'fit_pred_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'fit_pred_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'pred' } ] }, 'predict_proba': defaultActions['predict_proba'] } break; case 'Clustering': if (modelType == 'AgglomerativeClustering' || modelType == 'DBSCAN') { actions = { 'fit': { name: 'fit', label: 'Fit', code: '${model}.fit(${fit_featureData})', description: 'Perform clustering from features, or distance matrix.', options: [ { name: 'fit_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' } ] }, 'fit_predict': { name: 'fit_predict', label: 'Fit and predict', code: '${fit_pred_allocate} = ${model}.fit_predict(${fit_pred_featureData})', description: 'Compute clusters from a data or distance matrix and predict labels.', options: [ { name: 'fit_pred_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'fit_pred_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'pred' } ] } } break; } actions = { 'fit': { name: 'fit', label: 'Fit', code: '${model}.fit(${fit_featureData})', description: 'Compute clustering.', options: [ { name: 'fit_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' } ] }, 'predict': { name: 'predict', label: 'Predict', code: '${pred_allocate} = ${model}.predict(${pred_featureData})', description: 'Predict the closest target data X belongs to.', options: [ { name: 'pred_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'pred_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'pred' } ] }, 'fit_predict': { name: 'fit_predict', label: 'Fit and predict', code: '${fit_pred_allocate} = ${model}.fit_predict(${fit_pred_featureData})', description: 'Compute cluster centers and predict cluster index for each sample.', options: [ { name: 'fit_pred_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'fit_pred_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'pred' } ] } } if (modelType == 'KMeans') { actions = { ...actions, 'fit_transform': { name: 'fit_transform', label: 'Fit and transform', code: '${fit_trans_allocate} = ${model}.fit_transform(${fit_trans_featureData})', description: 'Compute clustering and transform X to cluster-distance space.', options: [ { name: 'fit_trans_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'fit_trans_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'trans' } ] }, 'transform': { name: 'transform', label: 'Transform', code: '${trans_allocate} = ${model}.transform(${trans_featureData})', description: 'Transform X to a cluster-distance space.', options: [ { name: 'trans_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'trans_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'trans' } ] } } } break; case 'Dimension Reduction': if (modelType == 'TSNE') { actions = { 'fit': { name: 'fit', label: 'Fit', code: '${model}.fit(${fit_featureData})', description: 'Fit X into an embedded space.', options: [ { name: 'fit_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' } ] }, 'fit_transform': { name: 'fit_transform', label: 'Fit and transform', code: '${fit_trans_allocate} = ${model}.fit_transform(${fit_trans_featureData})', description: 'Fit X into an embedded space and return that transformed output.', options: [ { name: 'fit_trans_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'fit_trans_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'trans' } ] } } break; } if (modelType == 'LinearDiscriminantAnalysis') { // LDA actions = { 'fit': { name: 'fit', label: 'Fit', code: '${model}.fit(${fit_featureData}, ${fit_targetData})', description: 'Fit the Linear Discriminant Analysis model.', options: [ { name: 'fit_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'fit_targetData', label: 'Target Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'y' } ] }, 'fit_transform': { name: 'fit_transform', label: 'Fit and transform', code: '${fit_trans_allocate} = ${model}.fit_transform(${fit_trans_featureData}${fit_trans_targetData})', description: 'Fit to data, then transform it.', options: [ { name: 'fit_trans_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'fit_trans_targetData', label: 'Target Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'y' }, { name: 'fit_trans_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'trans' } ] }, 'predict': { name: 'predict', label: 'Predict', code: '${pred_allocate} = ${model}.predict(${pred_featureData})', description: 'Predict class labels for samples in X.', options: [ { name: 'pred_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'pred_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'pred' } ] }, 'transform': { name: 'transform', label: 'Transform', code: '${trans_allocate} = ${model}.transform(${trans_featureData})', description: 'Project data to maximize class separation.', options: [ { name: 'trans_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'trans_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'trans' } ] } } break; } actions = { 'fit': { name: 'fit', label: 'Fit', code: '${model}.fit(${fit_featureData})', description: 'Fit X into an embedded space.', options: [ { name: 'fit_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' } ] }, 'fit_transform': { name: 'fit_transform', label: 'Fit and transform', code: '${fit_trans_allocate} = ${model}.fit_transform(${fit_trans_featureData})', description: 'Fit the model with X and apply the dimensionality reduction on X.', options: [ { name: 'fit_trans_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'fit_trans_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'trans' } ] }, 'inverse_transform': { name: 'inverse_transform', label: 'Inverse transform', code: '${inverse_allocate} = ${model}.inverse_transform(${inverse_featureData})', description: 'Transform data back to its original space.', options: [ { name: 'inverse_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'inverse_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'inv_trans' } ] }, 'transform': { name: 'transform', label: 'Transform', code: '${trans_allocate} = ${model}.transform(${trans_featureData})', description: 'Apply dimensionality reduction to X.', options: [ { name: 'trans_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'trans_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'trans' } ] } } break; case 'ETC': if (modelType === 'GridSearchCV') { actions = { 'fit': { name: 'fit', label: 'Fit', code: '${model}.fit(${fit_featureData}${fit_targetData})', description: 'Run fit with all sets of parameters.', options: [ { name: 'fit_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X_train' }, { name: 'fit_targetData', label: 'Target Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'y_train', usePair: true, pairKey: 'y' } ] }, 'predict': { name: 'predict', label: 'Predict', code: '${pred_allocate} = ${model}.predict(${pred_featureData})', description: 'Call predict on the estimator with the best found parameters.', options: [ { name: 'pred_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X_test' }, { name: 'pred_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'pred' } ] }, 'inverse_transform': { name: 'inverse_transform', label: 'Inverse transform', code: '${inverse_allocate} = ${model}.inverse_transform(${inverse_featureData})', description: 'Call inverse_transform on the estimator with the best found params.', options: [ { name: 'inverse_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'inverse_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'inv_trans' } ] }, 'transform': { name: 'transform', label: 'Transform', code: '${trans_allocate} = ${model}.transform(${trans_featureData})', description: 'Call transform on the estimator with the best found parameters.', options: [ { name: 'trans_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X' }, { name: 'trans_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'trans' } ] } } } break; } return actions; } } return FitPredict; });