chore(boards): 调整mixpy下sklearn模块

This commit is contained in:
王立帮
2025-09-24 21:42:24 +08:00
parent b76967b157
commit 26461c6bd0
8 changed files with 135 additions and 49 deletions

View File

@@ -168,7 +168,12 @@ export const sklearn_data_target = {
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT) .setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_GET) .appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.EIGENVALUES, "data"], [Blockly.Msg.LABEL_VALUE, "target"], [Blockly.Msg.FEATURE, "feature_names"], [Blockly.Msg.mixpy_PYLAB_TICKS_TAG, "target_names"]]), "type"); .appendField(new Blockly.FieldDropdown([
[Blockly.Msg.EIGENVALUES, "data"],
[Blockly.Msg.LABEL_VALUE, "target"],
[Blockly.Msg.FEATURE, "feature_names"],
[Blockly.Msg.mixpy_PYLAB_TICKS_TAG, "target_names"]
]), "type");
this.setOutput(true, null); this.setOutput(true, null);
this.setColour(SKLEARN_HUE); this.setColour(SKLEARN_HUE);
this.setTooltip(""); this.setTooltip("");
@@ -303,7 +308,10 @@ export const sklearn_DecisionTreeClassifier_Regressor = {
init: function () { init: function () {
this.appendDummyInput() this.appendDummyInput()
.appendField("sklearn " + Blockly.Msg.SKLEARN_DECISIONTREE_INIT) .appendField("sklearn " + Blockly.Msg.SKLEARN_DECISIONTREE_INIT)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "DecisionTreeClassifier"], [Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "DecisionTreeRegressor"]]), "type"); .appendField(new Blockly.FieldDropdown([
[Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "DecisionTreeClassifier"],
[Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "DecisionTreeRegressor"]
]), "type");
this.appendValueInput("model_name") this.appendValueInput("model_name")
.setCheck(null) .setCheck(null)
.setAlign(Blockly.inputs.Align.RIGHT) .setAlign(Blockly.inputs.Align.RIGHT)
@@ -330,7 +338,10 @@ export const sklearn_RandomForestClassifier_Regressor = {
init: function () { init: function () {
this.appendDummyInput() this.appendDummyInput()
.appendField("sklearn " + Blockly.Msg.SKLEARN_RANDOMFOREST_INIT) .appendField("sklearn " + Blockly.Msg.SKLEARN_RANDOMFOREST_INIT)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "RandomForestClassifier"], [Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "RandomForestRegressor"]]), "type"); .appendField(new Blockly.FieldDropdown([
[Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "RandomForestClassifier"],
[Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "RandomForestRegressor"]
]), "type");
this.appendValueInput("model_name") this.appendValueInput("model_name")
.setCheck(null) .setCheck(null)
.setAlign(Blockly.inputs.Align.RIGHT) .setAlign(Blockly.inputs.Align.RIGHT)
@@ -365,7 +376,10 @@ export const sklearn_KNeighborsClassifier_Regressor = {
init: function () { init: function () {
this.appendDummyInput() this.appendDummyInput()
.appendField("sklearn " + Blockly.Msg.SKLEARN_KNN_INIT) .appendField("sklearn " + Blockly.Msg.SKLEARN_KNN_INIT)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "KNeighborsClassifier"], [Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "KNeighborsRegressor"]]), "type"); .appendField(new Blockly.FieldDropdown([
[Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "KNeighborsClassifier"],
[Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "KNeighborsRegressor"]
]), "type");
this.appendValueInput("model_name") this.appendValueInput("model_name")
.setCheck(null) .setCheck(null)
.setAlign(Blockly.inputs.Align.RIGHT) .setAlign(Blockly.inputs.Align.RIGHT)
@@ -627,7 +641,10 @@ export const sklearn_coef_intercept = {
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT) .setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_GET) .appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.SKLEARN_COEF, "coef_"], [Blockly.Msg.SKLEARN_INTERCEPT, "intercept_"]]), "type"); .appendField(new Blockly.FieldDropdown([
[Blockly.Msg.SKLEARN_COEF, "coef_"],
[Blockly.Msg.SKLEARN_INTERCEPT, "intercept_"]
]), "type");
this.setOutput(true, null); this.setOutput(true, null);
this.setColour(SKLEARN_HUE); this.setColour(SKLEARN_HUE);
this.setTooltip(""); this.setTooltip("");
@@ -646,7 +663,11 @@ export const sklearn_cluster_centers_labels_inertia = {
.appendField(Blockly.Msg.MODEL_NAME); .appendField(Blockly.Msg.MODEL_NAME);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET) .appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.SKLEARN_CLUSTER_CENTER, "cluster_centers_"], [Blockly.Msg.SKLEARN_LABELS_AFTER_CLUSTERING, "labels_"], [Blockly.Msg.SKLEARN_CLUSTERING_SUM_OF_SQUARED_DISTANCES, "inertia_"]]), "type"); .appendField(new Blockly.FieldDropdown([
[Blockly.Msg.SKLEARN_CLUSTER_CENTER, "cluster_centers_"],
[Blockly.Msg.SKLEARN_LABELS_AFTER_CLUSTERING, "labels_"],
[Blockly.Msg.SKLEARN_CLUSTERING_SUM_OF_SQUARED_DISTANCES, "inertia_"]
]), "type");
this.setInputsInline(true); this.setInputsInline(true);
this.setOutput(true, null); this.setOutput(true, null);
this.setColour(SKLEARN_HUE); this.setColour(SKLEARN_HUE);
@@ -662,7 +683,10 @@ export const sklearn_save_load_model = {
.setCheck(null) .setCheck(null)
.setAlign(Blockly.inputs.Align.RIGHT) .setAlign(Blockly.inputs.Align.RIGHT)
.appendField("sklearn") .appendField("sklearn")
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.SKLEARN_SAVE_MODEL, "dump"], [Blockly.Msg.SKLEARN_LOAD_MODEL, "load"]]), "type") .appendField(new Blockly.FieldDropdown([
[Blockly.Msg.SKLEARN_SAVE_MODEL, "dump"],
[Blockly.Msg.SKLEARN_LOAD_MODEL, "load"]
]), "type")
.appendField(" " + Blockly.Msg.MODEL_NAME); .appendField(" " + Blockly.Msg.MODEL_NAME);
this.appendValueInput("address") this.appendValueInput("address")
.setCheck(null) .setCheck(null)

View File

@@ -64,10 +64,11 @@ export const sklearn_train_test_split = function (_, generator) {
var value_test_size = generator.valueToCode(this, 'test_size', generator.ORDER_ATOMIC) || '0.3'; var value_test_size = generator.valueToCode(this, 'test_size', generator.ORDER_ATOMIC) || '0.3';
var value_rondom_state = generator.valueToCode(this, 'rondom_state', generator.ORDER_ATOMIC) || 'None'; var value_rondom_state = generator.valueToCode(this, 'rondom_state', generator.ORDER_ATOMIC) || 'None';
generator.definitions_['import_sklearn_train_test_split'] = 'from sklearn.model_selection import train_test_split'; generator.definitions_['import_sklearn_train_test_split'] = 'from sklearn.model_selection import train_test_split';
if (value_train_target == 'None') if (value_train_target == 'None') {
var code = 'train_test_split(' + value_train_data + ', test_size=' + value_test_size + ', random_state=' + value_rondom_state + ')'; var code = 'train_test_split(' + value_train_data + ', test_size=' + value_test_size + ', random_state=' + value_rondom_state + ')';
else } else {
var code = 'train_test_split(' + value_train_data + ', ' + value_train_target + ', test_size=' + value_test_size + ', random_state=' + value_rondom_state + ')'; var code = 'train_test_split(' + value_train_data + ', ' + value_train_target + ', test_size=' + value_test_size + ', random_state=' + value_rondom_state + ')';
}
return [code, generator.ORDER_ATOMIC]; return [code, generator.ORDER_ATOMIC];
} }
@@ -186,10 +187,11 @@ export const sklearn_fit = function (_, generator) {
var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model';
var value_train_data = generator.valueToCode(this, 'train_data', generator.ORDER_ATOMIC) || 'X_train'; var value_train_data = generator.valueToCode(this, 'train_data', generator.ORDER_ATOMIC) || 'X_train';
var value_train_target = generator.valueToCode(this, 'train_target', generator.ORDER_ATOMIC) || 'y_train'; var value_train_target = generator.valueToCode(this, 'train_target', generator.ORDER_ATOMIC) || 'y_train';
if (value_train_target == 'None') if (value_train_target == 'None') {
var code = value_model_name + '.fit(' + value_train_data + ')\n'; var code = value_model_name + '.fit(' + value_train_data + ')\n';
else } else {
var code = value_model_name + '.fit(' + value_train_data + ', ' + value_train_target + ')\n'; var code = value_model_name + '.fit(' + value_train_data + ', ' + value_train_target + ')\n';
}
return code; return code;
} }
@@ -214,10 +216,11 @@ export const sklearn_score = function (_, generator) {
var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model';
var value_train_data = generator.valueToCode(this, 'train_data', generator.ORDER_ATOMIC) || 'X_train'; var value_train_data = generator.valueToCode(this, 'train_data', generator.ORDER_ATOMIC) || 'X_train';
var value_train_target = generator.valueToCode(this, 'train_target', generator.ORDER_ATOMIC) || 'y_train'; var value_train_target = generator.valueToCode(this, 'train_target', generator.ORDER_ATOMIC) || 'y_train';
if (value_train_target == 'None') if (value_train_target == 'None') {
var code = value_model_name + '.score(' + value_train_data + ')'; var code = value_model_name + '.score(' + value_train_data + ')';
else } else {
var code = value_model_name + '.score(' + value_train_data + ', ' + value_train_target + ')'; var code = value_model_name + '.score(' + value_train_data + ', ' + value_train_target + ')';
}
return [code, generator.ORDER_ATOMIC]; return [code, generator.ORDER_ATOMIC];
} }
@@ -252,9 +255,10 @@ export const sklearn_save_load_model = function (_, generator) {
var value_address = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC) || 'D:/mixly/test.pkl'; var value_address = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC) || 'D:/mixly/test.pkl';
generator.definitions_['import_sklearn_joblib'] = 'import joblib'; generator.definitions_['import_sklearn_joblib'] = 'import joblib';
var code = ''; var code = '';
if (dropdown_type == 'dump') if (dropdown_type == 'dump') {
code = 'joblib.dump(' + value_model_name + ', ' + value_address + ')\n'; code = 'joblib.dump(' + value_model_name + ', ' + value_address + ')\n';
else } else {
code = value_model_name + ' = joblib.load(' + value_address + ')\n'; code = value_model_name + ' = joblib.load(' + value_address + ')\n';
}
return code; return code;
} }

View File

@@ -3502,7 +3502,7 @@
<block type="sklearn_train_test_split"> <block type="sklearn_train_test_split">
<value name="train_data"> <value name="train_data">
<shadow type="variables_get"> <shadow type="variables_get">
<field name="VAR">iris_X</field> <field name="VAR">iris_x</field>
</shadow> </shadow>
</value> </value>
<value name="train_target"> <value name="train_target">
@@ -3623,7 +3623,7 @@
</value> </value>
<value name="train_data"> <value name="train_data">
<shadow type="variables_get"> <shadow type="variables_get">
<field name="VAR">X</field> <field name="VAR">x</field>
</shadow> </shadow>
</value> </value>
</block> </block>
@@ -3680,7 +3680,7 @@
</value> </value>
<value name="train_data"> <value name="train_data">
<shadow type="variables_get"> <shadow type="variables_get">
<field name="VAR">X</field> <field name="VAR">x</field>
</shadow> </shadow>
</value> </value>
</block> </block>
@@ -3692,7 +3692,7 @@
</value> </value>
<value name="train_data"> <value name="train_data">
<shadow type="variables_get"> <shadow type="variables_get">
<field name="VAR">X_train</field> <field name="VAR">x_train</field>
</shadow> </shadow>
</value> </value>
<value name="train_target"> <value name="train_target">
@@ -3709,7 +3709,7 @@
</value> </value>
<value name="train_data"> <value name="train_data">
<shadow type="variables_get"> <shadow type="variables_get">
<field name="VAR">X_test</field> <field name="VAR">x_test</field>
</shadow> </shadow>
</value> </value>
<value name="train_target"> <value name="train_target">
@@ -3726,7 +3726,7 @@
</value> </value>
<value name="train_data"> <value name="train_data">
<shadow type="variables_get"> <shadow type="variables_get">
<field name="VAR">X_test</field> <field name="VAR">x_test</field>
</shadow> </shadow>
</value> </value>
</block> </block>

View File

@@ -0,0 +1,36 @@
/**
* @typedef {import('@mixly/python-mixpy').PythonMixpySKLearnBlocks} PythonMixpySKLearnBlocks
*/
import * as Blockly from 'blockly/core';
const SKLEARN_HUE = 80;
/**
* @override Override {@link PythonMixpySKLearnBlocks.sklearn_LinearRegression}
*/
//sklearn 初始化线性回归
export const sklearn_LinearRegression = {
init: function () {
this.appendDummyInput()
.appendField('sklearn ' + Blockly.Msg.SKLEARN_LINEARREGRESSION_INIT);
this.appendValueInput('model_name')
.setCheck(null)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MODEL_NAME);
this.appendValueInput('fit_intercept')
.setCheck(null)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.SKLEARN_CALCULATE_MODEL_INTERRUPT);
this.appendValueInput('n_jobs')
.setCheck(null)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.SKLEARN_THREADS);
this.setInputsInline(false);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(SKLEARN_HUE);
this.setTooltip('');
this.setHelpUrl('');
}
};

View File

@@ -0,0 +1,7 @@
import * as PythonPyodideSKLearnBlocks from './blocks/sklearn';
import * as PythonPyodideSKLearnGenerators from './generators/sklearn';
export {
PythonPyodideSKLearnBlocks,
PythonPyodideSKLearnGenerators
};

View File

@@ -0,0 +1,13 @@
/**
* @typedef {import('@mixly/python-mixpy').PythonMixpySKLearnGenerators} PythonMixpySKLearnGenerators
*/
// sklearn 初始化线性回归
export const sklearn_LinearRegression = function (_, generator) {
const value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model';
const value_fit_intercept = generator.valueToCode(this, 'fit_intercept', generator.ORDER_ATOMIC) || 'True';
const value_n_jobs = generator.valueToCode(this, 'n_jobs', generator.ORDER_ATOMIC) || 'None';
generator.definitions_['import_sklearn_linear_model'] = 'from sklearn.linear_model import LinearRegression';
const code = value_model_name + ' = LinearRegression(fit_intercept=' + value_fit_intercept + ', n_jobs=' + value_n_jobs + ')\n';
return code;
}

View File

@@ -67,6 +67,11 @@ import {
PythonMixpyTurtleGenerators PythonMixpyTurtleGenerators
} from '@mixly/python-mixpy'; } from '@mixly/python-mixpy';
import {
PythonPyodideSKLearnBlocks,
PythonPyodideSKLearnGenerators
} from './';
import './others/loader'; import './others/loader';
import './css/color_mixpy_python_advance.css'; import './css/color_mixpy_python_advance.css';
@@ -108,6 +113,7 @@ Object.assign(
PythonMixpySKLearnBlocks, PythonMixpySKLearnBlocks,
PythonMixpySystemBlocks, PythonMixpySystemBlocks,
PythonMixpyTurtleBlocks, PythonMixpyTurtleBlocks,
PythonPyodideSKLearnBlocks
); );
Object.assign( Object.assign(
@@ -139,5 +145,6 @@ Object.assign(
PythonMixpySerialGenerators, PythonMixpySerialGenerators,
PythonMixpySKLearnGenerators, PythonMixpySKLearnGenerators,
PythonMixpySystemGenerators, PythonMixpySystemGenerators,
PythonMixpyTurtleGenerators PythonMixpyTurtleGenerators,
PythonPyodideSKLearnGenerators
); );

View File

@@ -3467,7 +3467,7 @@
<block type="sklearn_train_test_split"> <block type="sklearn_train_test_split">
<value name="train_data"> <value name="train_data">
<shadow type="variables_get"> <shadow type="variables_get">
<field name="VAR">iris_X</field> <field name="VAR">iris_x</field>
</shadow> </shadow>
</value> </value>
<value name="train_target"> <value name="train_target">
@@ -3495,11 +3495,6 @@
<field name="BOOL">TRUE</field> <field name="BOOL">TRUE</field>
</shadow> </shadow>
</value> </value>
<value name="normalize">
<shadow type="logic_boolean">
<field name="BOOL">FALSE</field>
</shadow>
</value>
<value name="n_jobs"> <value name="n_jobs">
<shadow type="logic_null"></shadow> <shadow type="logic_null"></shadow>
</value> </value>
@@ -3588,7 +3583,7 @@
</value> </value>
<value name="train_data"> <value name="train_data">
<shadow type="variables_get"> <shadow type="variables_get">
<field name="VAR">X</field> <field name="VAR">x</field>
</shadow> </shadow>
</value> </value>
</block> </block>
@@ -3645,7 +3640,7 @@
</value> </value>
<value name="train_data"> <value name="train_data">
<shadow type="variables_get"> <shadow type="variables_get">
<field name="VAR">X</field> <field name="VAR">x</field>
</shadow> </shadow>
</value> </value>
</block> </block>
@@ -3657,7 +3652,7 @@
</value> </value>
<value name="train_data"> <value name="train_data">
<shadow type="variables_get"> <shadow type="variables_get">
<field name="VAR">X_train</field> <field name="VAR">x_train</field>
</shadow> </shadow>
</value> </value>
<value name="train_target"> <value name="train_target">
@@ -3674,7 +3669,7 @@
</value> </value>
<value name="train_data"> <value name="train_data">
<shadow type="variables_get"> <shadow type="variables_get">
<field name="VAR">X_test</field> <field name="VAR">x_test</field>
</shadow> </shadow>
</value> </value>
<value name="train_target"> <value name="train_target">
@@ -3691,7 +3686,7 @@
</value> </value>
<value name="train_data"> <value name="train_data">
<shadow type="variables_get"> <shadow type="variables_get">
<field name="VAR">X_test</field> <field name="VAR">x_test</field>
</shadow> </shadow>
</value> </value>
</block> </block>
@@ -3717,7 +3712,7 @@
</value> </value>
<value name="address"> <value name="address">
<shadow type="text"> <shadow type="text">
<field name="TEXT">D:/mixly/test.pkl</field> <field name="TEXT">/test.pkl</field>
</shadow> </shadow>
</value> </value>
</block> </block>