From f18fa577258d629cdfe4aa77a46c90a70f639d74 Mon Sep 17 00:00:00 2001 From: wangfeng Date: Sat, 4 Feb 2023 15:38:39 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stat/repeat.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stat/repeat.go b/stat/repeat.go index 53564e8..9f47296 100644 --- a/stat/repeat.go +++ b/stat/repeat.go @@ -9,10 +9,10 @@ import ( // Repeat repeat func Repeat[T Float](f T, n int) []T { var d any - bitsize := unsafe.Sizeof(f) - if bitsize == 4 { + bitSize := unsafe.Sizeof(f) + if bitSize == 4 { d = vek32.Repeat(float32(f), n) - } else if bitsize == 8 { + } else if bitSize == 8 { d = vek.Repeat(float64(f), n) } else { // 应该不会走到这里 -- Gitee From 8e25420c8806e8f841f10e3db3759ea127c71c42 Mon Sep 17 00:00:00 2001 From: wangfeng Date: Sat, 4 Feb 2023 16:05:04 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=89=A9=E5=B1=95=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E6=93=8D=E4=BD=9C=E7=9A=84=E6=B3=9B=E5=9E=8B?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stat/align.go | 2 +- stat/type.go | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/stat/align.go b/stat/align.go index 83cc768..a7e845e 100644 --- a/stat/align.go +++ b/stat/align.go @@ -1,7 +1,7 @@ package stat // Align Data alignment -func Align[T StatType](x []T, a T, dLen int) []T { +func Align[T MoveType](x []T, a T, dLen int) []T { d := []T{} xLen := len(x) if xLen >= dLen { diff --git a/stat/type.go b/stat/type.go index 3f2a167..1ee3dc0 100644 --- a/stat/type.go +++ b/stat/type.go @@ -13,6 +13,10 @@ type StatType interface { ~int32 | ~int64 | ~float32 | ~float64 } +type MoveType interface { + StatType | ~bool | ~string +} + // 随便输入一个什么值 func typeDefault[T StatType](x T) T { xv := reflect.ValueOf(x) -- Gitee From b027cdf04c1d3f59c22c1e8332e54af4568142c0 Mon Sep 17 00:00:00 2001 From: wangfeng Date: Sat, 4 Feb 2023 16:05:46 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=B3=9B=E5=9E=8B=E8=AE=A1=E7=AE=97=E6=9C=80=E5=A4=A7=E7=9A=84?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stat/max.go | 27 +++++++++++++++++++++++++++ stat/max_test.go | 15 +++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 stat/max.go create mode 100644 stat/max_test.go diff --git a/stat/max.go b/stat/max.go new file mode 100644 index 0000000..d0d5b56 --- /dev/null +++ b/stat/max.go @@ -0,0 +1,27 @@ +package stat + +import ( + "github.com/viterin/vek" + "github.com/viterin/vek/vek32" + "unsafe" +) + +// Max 计算最大值 +func Max[T Float](f []T) T { + if len(f) == 0 { + return T(0) + } + var d any + var s any + s = f + bitSize := unsafe.Sizeof(f[0]) + if bitSize == 4 { + d = vek32.Max(s.([]float32)) + } else if bitSize == 8 { + d = vek.Max(s.([]float64)) + } else { + // 应该不会走到这里 + d = T(0) + } + return d.(T) +} diff --git a/stat/max_test.go b/stat/max_test.go new file mode 100644 index 0000000..405bafd --- /dev/null +++ b/stat/max_test.go @@ -0,0 +1,15 @@ +package stat + +import ( + "fmt" + "testing" +) + +func TestMax(t *testing.T) { + + f1 := []float32{1.1, 1.2, 1.3} + f2 := []float32{1.1, 1.2, 1.3} + fmt.Println(Max(f1)) + fmt.Println(Max(f2)) + +} -- Gitee From fc8240e8503c5535b103e18662e2f0970fa8244e Mon Sep 17 00:00:00 2001 From: wangfeng Date: Sat, 4 Feb 2023 16:14:38 +0800 Subject: [PATCH 4/4] =?UTF-8?q?#I6CLQH=20dataframe=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AF=B9=E9=BD=90=E6=93=8D=E4=BD=9C,=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=8F=B3=E8=BF=9E=E6=8E=A5=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dataframe_join.go | 57 +++++++++++++++++++++++++++++++++++++++++++++++ dataframe_test.go | 20 +++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 dataframe_join.go diff --git a/dataframe_join.go b/dataframe_join.go new file mode 100644 index 0000000..063d4be --- /dev/null +++ b/dataframe_join.go @@ -0,0 +1,57 @@ +package pandas + +import "gitee.com/quant1x/pandas/stat" + +func (self DataFrame) align(ss ...Series) []Series { + defaultValue := []Series{} + sLen := len(ss) + if sLen == 0 { + return defaultValue + } + ls := make([]float32, sLen) + for i, v := range ss { + ls[i] = float32(v.Len()) + } + + maxLength := stat.Max(ls) + if maxLength <= 0 { + return defaultValue + } + cols := make([]Series, sLen) + for i, v := range ss { + vt := v.Type() + vn := v.Name() + vs := v.Values() + // 声明any的ns变量用于接收逻辑分支的输出 + // 切片数据不能直接对齐, 需要根据类型指定Nil和NaN默认值 + var ns any + if vt == SERIES_TYPE_BOOL { + ns = stat.Align(vs.([]bool), Nil2Bool, int(maxLength)) + } else if vt == SERIES_TYPE_INT { + ns = stat.Align(vs.([]int64), Nil2Int64, int(maxLength)) + } else if vt == SERIES_TYPE_STRING { + ns = stat.Align(vs.([]string), Nil2String, int(maxLength)) + } else if vt == SERIES_TYPE_FLOAT { + ns = stat.Align(vs.([]float64), Nil2Float64, int(maxLength)) + } + cols[i] = NewSeries(vt, vn, ns) + } + return cols +} + +// Join 默认右连接, 加入一个series +func (self DataFrame) Join(series Series) DataFrame { + if series.Len() < 0 { + return self + } + nCol := self.Ncol() + cols := make([]Series, nCol+1) + cols[len(cols)-1] = series + for i, s := range self.columns { + cols[i] = s + } + cols = self.align(cols...) + df := NewDataFrame(cols...) + self = df + return self +} diff --git a/dataframe_test.go b/dataframe_test.go index f1ef073..d1f4230 100644 --- a/dataframe_test.go +++ b/dataframe_test.go @@ -52,3 +52,23 @@ func TestLoadStructs(t *testing.T) { df2 := LoadStructs(dataTags) fmt.Println(df2) } + +func TestDataFrame_Join(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}, + } + df1 := LoadStructs(data) + fmt.Println(df1) + + // 增加1列 + s_e := GenericSeries[string]("", "a0", "a1", "a2", "a3") + df2 := df1.Join(s_e) + fmt.Println(df2) +} -- Gitee