From 2ead45e1f827fbe91ba1bf4ed699e0344ffa4e93 Mon Sep 17 00:00:00 2001 From: wangfeng Date: Wed, 19 Apr 2023 11:43:16 +0800 Subject: [PATCH 1/3] =?UTF-8?q?dataframe=E6=94=AF=E6=8C=81=E4=BB=8E?= =?UTF-8?q?=E5=90=8E=E5=88=B0=E5=89=8D=E7=9A=84=E9=80=89=E6=8B=A9=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=AD=90=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dataframe_subset.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dataframe_subset.go b/dataframe_subset.go index 747f277..b62ea09 100644 --- a/dataframe_subset.go +++ b/dataframe_subset.go @@ -26,7 +26,13 @@ func (self DataFrame) Subset(start, end int) DataFrame { } } -// Select 选择一段记录 +// Sub 选择一个子集, start end 支持从后到前选择 +func (self DataFrame) Sub(start, end int) DataFrame { + sl := stat.RangeFinite(start, end) + return self.SelectRows(sl) +} + +// SelectRows 选择一段记录 func (self DataFrame) SelectRows(p stat.ScopeLimit) DataFrame { columns := []stat.Series{} for i := range self.columns { -- Gitee From d16354c389c93c8dbf65ead4d2d782c9bb1d22f9 Mon Sep 17 00:00:00 2001 From: wangfeng Date: Wed, 19 Apr 2023 12:52:39 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dprint=E5=9C=A8=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E9=9B=86=E5=B0=91=E4=BA=8EmaxRows=E5=BA=8F=E5=8F=B7?= =?UTF-8?q?=E9=94=991=E4=BD=8D=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dataframe_xstring.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dataframe_xstring.go b/dataframe_xstring.go index 78fbd08..c21015d 100644 --- a/dataframe_xstring.go +++ b/dataframe_xstring.go @@ -36,7 +36,7 @@ func (self DataFrame) print( str = fmt.Sprintf("%s error: %v", class, self.Err) return } - nMinRows := int(maxRows / 2) + nMinRows := maxRows / 2 nTotal := 0 nrows, ncols := self.Dims() if nrows == 0 || ncols == 0 { @@ -80,10 +80,10 @@ func (self DataFrame) print( } else if i == nMinRows+1 && shortening { // 跳过 rowNumbersOffset -= 1 - } else if i < nMinRows+1 { - add = strconv.Itoa(i-1+rowNumbersOffset) + ":" - } else { + } else if i >= nMinRows+1 && shortening { add = strconv.Itoa(nrows-maxRows+i-1+rowNumbersOffset) + ":" + } else { + add = strconv.Itoa(i-1+rowNumbersOffset) + ":" } //fmt.Println(i) records[i] = append([]string{add}, records[i]...) -- Gitee From db426e1943587b6263cb512c39f66d694d435ce6 Mon Sep 17 00:00:00 2001 From: wangfeng Date: Wed, 19 Apr 2023 12:53:00 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=88=86=E7=BB=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dataframe_group.go | 28 ++++++++++++++++++++++++++++ dataframe_group_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 dataframe_group.go create mode 100644 dataframe_group_test.go diff --git a/dataframe_group.go b/dataframe_group.go new file mode 100644 index 0000000..e464447 --- /dev/null +++ b/dataframe_group.go @@ -0,0 +1,28 @@ +package pandas + +import ( + "gitee.com/quant1x/pandas/stat" +) + +// Group 分组 +func (self DataFrame) Group(columnName string, filter func(kind stat.Type, e any) bool) DataFrame { + series := self.Col(columnName) + if series.Len() == 0 { + return self + } + t := series.Type() + indexes := []int{} + series.Apply(func(idx int, v any) { + ok := filter(t, v) + if ok { + indexes = append(indexes, idx) + } + }) + ranges := stat.IntsToRanges(indexes) + df := DataFrame{} + for _, r := range ranges { + tmp := self.SelectRows(r) + df = df.Concat(tmp) + } + return df +} diff --git a/dataframe_group_test.go b/dataframe_group_test.go new file mode 100644 index 0000000..0317de4 --- /dev/null +++ b/dataframe_group_test.go @@ -0,0 +1,40 @@ +package pandas + +import ( + "fmt" + "gitee.com/quant1x/pandas/stat" + "testing" +) + +func TestDataFrame_Group(t *testing.T) { + type testStruct struct { + A string + B int + C bool + D float64 + } + data := []testStruct{ + {"a", 1, true, 0.0}, + {"b", 2, false, 0.5}, + {"b", 3, false, 3.5}, + {"b", 4, false, 2.5}, + {"b", 5, false, 1.5}, + {"a", 6, true, 0.0}, + {"a", 7, true, 0.0}, + {"a", 8, true, 0.0}, + {"a", 9, true, 0.0}, + {"a", 10, true, 0.0}, + {"a", 11, true, 0.0}, + } + df := LoadStructs(data) + fmt.Println(df) + + df1 := df.Group("A", func(kind stat.Type, e any) bool { + v := stat.AnyToString(e) + if v == "b" { + return true + } + return false + }) + fmt.Println(df1) +} -- Gitee