From b573250af6ca15fbd6075307d11986d6605683e1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E7=AB=8B=E5=B8=AE?= <3294713004@qq.com>
Date: Mon, 16 Sep 2024 02:52:18 +0800
Subject: [PATCH] =?UTF-8?q?Update(blocks):=20python=E6=96=B0=E5=A2=9E?=
=?UTF-8?q?=E4=B8=80=E4=BA=9Bpandas=E5=9B=BE=E5=BD=A2=E5=9D=97=EF=BC=8C?=
=?UTF-8?q?=E5=A4=9A=E8=AF=AD=E8=A8=80=E5=B0=86=E5=9C=A8=E7=A8=B3=E5=AE=9A?=
=?UTF-8?q?=E5=90=8E=E8=BF=9B=E8=A1=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
新增pandas API如下:
1. 值排序: sort_values()
2. 获取前 / 后n行数据: head() / tail()
3. 根据所给条件筛选数据
4. 通过给定标签分组: groupby()
5. 常用聚合函数
---
.../default_src/python_mixpy/blocks/data.js | 107 ++-
.../python_mixpy/generators/data.js | 37 +
boards/default_src/python_mixpy/template.xml | 777 ++++++++++--------
.../default_src/python_pyodide/template.xml | 89 ++
4 files changed, 665 insertions(+), 345 deletions(-)
diff --git a/boards/default_src/python_mixpy/blocks/data.js b/boards/default_src/python_mixpy/blocks/data.js
index 2ff0bb8c..3ab68fa6 100644
--- a/boards/default_src/python_mixpy/blocks/data.js
+++ b/boards/default_src/python_mixpy/blocks/data.js
@@ -1455,4 +1455,109 @@ export const py_sum = {
this.setOutput(true);
this.setTooltip('Returns the sum of the iterable.');
}
-};
\ No newline at end of file
+};
+
+export const dataframe_sort_values = {
+ init: function () {
+ this.setColour(DATA_HUE);
+ this.appendValueInput('DICT')
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .setCheck('Dict');
+ this.appendDummyInput()
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .appendField('值排序');
+ this.appendValueInput('KEY')
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .appendField('标签');
+ this.appendDummyInput()
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .appendField('排序方式')
+ .appendField(new Blockly.FieldDropdown([
+ ['升序', 'True'],
+ ['降序', 'False']
+ ]), 'AS_CENDING');
+ this.setOutput(true);
+ this.setInputsInline(true);
+ this.setTooltip('');
+ }
+}
+
+export const dataframe_head_tail = {
+ init: function () {
+ this.setColour(DATA_HUE);
+ this.appendValueInput('DICT')
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .setCheck('Dict');
+ this.appendDummyInput()
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .appendField('获取')
+ .appendField(new Blockly.FieldDropdown([
+ ['前几行', 'head'],
+ ['最后几行', 'tail']
+ ]), 'TYPE');
+ this.appendValueInput('LINES')
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .appendField('行数');
+ this.setOutput(true);
+ this.setInputsInline(true);
+ this.setTooltip('');
+ }
+}
+
+export const dataframe_select = {
+ init: function () {
+ this.setColour(DATA_HUE);
+ this.appendValueInput('DICT')
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .setCheck('Dict');
+ this.appendDummyInput()
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .appendField('筛选数据');
+ this.appendValueInput('KEY')
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .appendField('满足条件');
+ this.setOutput(true);
+ this.setInputsInline(true);
+ this.setTooltip('');
+ }
+}
+
+export const dataframe_groupby = {
+ init: function () {
+ this.setColour(DATA_HUE);
+ this.appendValueInput('DICT')
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .setCheck('Dict');
+ this.appendValueInput('KEY')
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .appendField('通过标签');
+ this.appendDummyInput()
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .appendField('分组');
+ this.setOutput(true);
+ this.setInputsInline(true);
+ this.setTooltip('');
+ }
+}
+
+export const dataframe_aggregate_func = {
+ init: function () {
+ this.setColour(DATA_HUE);
+ this.appendDummyInput()
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .appendField(new Blockly.FieldDropdown([
+ ['求最小值', 'min'],
+ ['求最大值', 'max'],
+ ['求和', 'sum'],
+ ['求平均值', 'mean'],
+ ['求中位数', 'median'],
+ ['求标准差', 'std']
+ ]), 'TYPE');
+ this.appendValueInput('DICT')
+ .setAlign(Blockly.inputs.Align.RIGHT)
+ .setCheck('Dict');
+ this.setOutput(true);
+ this.setInputsInline(true);
+ this.setTooltip('');
+ }
+}
\ No newline at end of file
diff --git a/boards/default_src/python_mixpy/generators/data.js b/boards/default_src/python_mixpy/generators/data.js
index cfc21c05..33e5b15b 100644
--- a/boards/default_src/python_mixpy/generators/data.js
+++ b/boards/default_src/python_mixpy/generators/data.js
@@ -644,4 +644,41 @@ export const py_sum = function (block, generator) {
var array = generator.valueToCode(block, 'ARRAY', generator.ORDER_ATOMIC) || '[]';
var code = 'sum(' + array + ')';
return [code, generator.ORDER_ATOMIC];
+}
+
+export const dataframe_sort_values = function (block, generator) {
+ const dict = generator.valueToCode(block, 'DICT', generator.ORDER_ATOMIC) || 'df';
+ const key = generator.valueToCode(block, 'KEY', generator.ORDER_ATOMIC) || '\'tag\'';
+ const ascending = block.getFieldValue('AS_CENDING');
+ const code = `${dict}.sort_values(by=${key}, ascending=${ascending})`;
+ return [code, generator.ORDER_ATOMIC];
+}
+
+export const dataframe_head_tail = function (block, generator) {
+ const dict = generator.valueToCode(block, 'DICT', generator.ORDER_ATOMIC) || 'df';
+ const lines = generator.valueToCode(block, 'LINES', generator.ORDER_ATOMIC) || '1';
+ const type = block.getFieldValue('TYPE');
+ const code = `${dict}.${type}(${lines})`;
+ return [code, generator.ORDER_ATOMIC];
+}
+
+export const dataframe_select = function (block, generator) {
+ const dict = generator.valueToCode(block, 'DICT', generator.ORDER_ATOMIC) || 'df';
+ const key = generator.valueToCode(block, 'KEY', generator.ORDER_ATOMIC) || 'df[\'tag\'] > 1';
+ const code = `${dict}[${key}]`;
+ return [code, generator.ORDER_ATOMIC];
+}
+
+export const dataframe_groupby = function (block, generator) {
+ const dict = generator.valueToCode(block, 'DICT', generator.ORDER_ATOMIC) || 'df';
+ const key = generator.valueToCode(block, 'KEY', generator.ORDER_ATOMIC) || '\'tag\'';
+ const code = `${dict}.groupby(by=${key})`;
+ return [code, generator.ORDER_ATOMIC];
+}
+
+export const dataframe_aggregate_func = function (block, generator) {
+ const dict = generator.valueToCode(block, 'DICT', generator.ORDER_ATOMIC) || 'df';
+ const type = block.getFieldValue('TYPE');
+ const code = `${dict}.${type}()`;
+ return [code, generator.ORDER_ATOMIC];
}
\ No newline at end of file
diff --git a/boards/default_src/python_mixpy/template.xml b/boards/default_src/python_mixpy/template.xml
index aa095857..4777325b 100644
--- a/boards/default_src/python_mixpy/template.xml
+++ b/boards/default_src/python_mixpy/template.xml
@@ -2457,11 +2457,11 @@
-
-
- df
-
-
+
+
+ df
+
+
@@ -2472,61 +2472,61 @@
-
- array
-
+
+ array
+
- None
+ None
-
- array
-
+
+ array
+
- None
+ None
-
- array
-
+
+ array
+
-
+
-
- array
-
+
+ array
+
-
- array
-
+
+ array
+
-
- df
-
+
+ df
+
-
- value
-
+
+ value
+
- False
+ False
-
+
@@ -2578,9 +2578,9 @@
-
- 1
-
+
+ 1
+
@@ -2618,9 +2618,9 @@
-
- array
-
+
+ array
+
@@ -2637,14 +2637,14 @@
-
- array1
-
+
+ array1
+
-
- array2
-
+
+ array2
+
@@ -2835,6 +2835,95 @@
+
+
+
+ df1
+
+
+
+
+ tag
+
+
+
+
+
+
+ df1
+
+
+
+
+ 1
+
+
+
+
+
+
+ df1
+
+
+
+
+ GT
+
+
+ column
+
+
+ df1
+
+
+
+
+ tag
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ df1
+
+
+
+
+ tag
+
+
+
+
+ min
+
+
+ df1
+
+
+ column
+
+
+ df1
+
+
+
+
+ tag
+
+
+
+
+
@@ -3225,342 +3314,342 @@
-
-
- 100
-
-
-
-
- 20
-
-
-
-
- 2
-
-
-
-
- 2
-
-
-
-
- 0
-
-
-
-
- 2
-
-
-
-
- 2
-
-
-
-
-
+
+
+ 100
+
+
+
+
+ 20
+
+
+
+
+ 2
+
+
+
+
+ 2
+
+
+
+
+ 0
+
+
+
+
+ 2
+
+
+
+
+ 2
+
+
+
+
+
-
-
- 100
-
-
-
-
- 100
-
-
-
-
- 10
-
-
-
-
- 1
-
-
-
-
- 0.0
-
-
-
-
- 0.0
-
-
-
-
-
+
+
+ 100
+
+
+
+
+ 100
+
+
+
+
+ 10
+
+
+
+
+ 1
+
+
+
+
+ 0.0
+
+
+
+
+ 0.0
+
+
+
+
+
-
-
- 100
-
-
-
-
- 2
-
-
-
-
-
-
-
- 1.0
-
-
-
-
- -10.0,10.0
-
-
-
-
- TRUE
-
-
-
-
-
+
+
+ 100
+
+
+
+
+ 2
+
+
+
+
+
+
+
+ 1.0
+
+
+
+
+ -10.0,10.0
+
+
+
+
+ TRUE
+
+
+
+
+
-
-
- iris
-
-
+
+
+ iris
+
+
-
-
- iris_X
-
-
-
-
- iris_y
-
-
-
-
- 0.3
-
-
-
-
-
+
+
+ iris_X
+
+
+
+
+ iris_y
+
+
+
+
+ 0.3
+
+
+
+
+
-
-
- model
-
-
-
-
- TRUE
-
-
-
-
- FALSE
-
-
-
-
-
+
+
+ model
+
+
+
+
+ TRUE
+
+
+
+
+ FALSE
+
+
+
+
+
-
-
- model
-
-
-
-
- 1.0
-
-
-
-
- TRUE
-
-
-
-
- FALSE
-
-
-
-
- 300
-
-
-
-
-
+
+
+ model
+
+
+
+
+ 1.0
+
+
+
+
+ TRUE
+
+
+
+
+ FALSE
+
+
+
+
+ 300
+
+
+
+
+
-
-
- model
-
-
-
-
-
-
-
-
+
+
+ model
+
+
+
+
+
+
+
+
-
-
- model
-
-
-
-
- 100
-
-
-
-
-
-
-
-
-
-
-
+
+
+ model
+
+
+
+
+ 100
+
+
+
+
+
+
+
+
+
+
+
-
-
- model
-
-
-
-
- 5
-
-
-
-
-
+
+
+ model
+
+
+
+
+ 5
+
+
+
+
+
-
-
- model
-
-
+
+
+ model
+
+
-
-
- model
-
-
-
-
- 8
-
-
-
-
- 300
-
-
-
-
-
-
-
-
+
+
+ model
+
+
+
+
+ 8
+
+
+
+
+ 300
+
+
+
+
+
+
+
+
-
-
- model
-
-
-
-
- X_train
-
-
-
-
- y_train
-
-
+
+
+ model
+
+
+
+
+ X_train
+
+
+
+
+ y_train
+
+
-
-
- model
-
-
-
-
- X_test
-
-
-
-
- y_test
-
-
+
+
+ model
+
+
+
+
+ X_test
+
+
+
+
+ y_test
+
+
-
-
- model
-
-
-
-
- X_test
-
-
+
+
+ model
+
+
+
+
+ X_test
+
+
-
-
- model
-
-
+
+
+ model
+
+
-
-
- model
-
-
+
+
+ model
+
+
-
-
- model
-
-
-
-
- D:/mixly/test.pkl
-
-
+
+
+ model
+
+
+
+
+ D:/mixly/test.pkl
+
+
-
+
\ No newline at end of file
diff --git a/boards/default_src/python_pyodide/template.xml b/boards/default_src/python_pyodide/template.xml
index 7440acb1..72b75afb 100644
--- a/boards/default_src/python_pyodide/template.xml
+++ b/boards/default_src/python_pyodide/template.xml
@@ -2578,6 +2578,95 @@
+
+
+
+ df1
+
+
+
+
+ tag
+
+
+
+
+
+
+ df1
+
+
+
+
+ 1
+
+
+
+
+
+
+ df1
+
+
+
+
+ GT
+
+
+ column
+
+
+ df1
+
+
+
+
+ tag
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ df1
+
+
+
+
+ tag
+
+
+
+
+ min
+
+
+ df1
+
+
+ column
+
+
+ df1
+
+
+
+
+ tag
+
+
+
+
+