From 365622daf2ff330dda8d24fdc43656b5bdcfaef7 Mon Sep 17 00:00:00 2001 From: wangfeng Date: Thu, 16 Feb 2023 18:12:28 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=BA=9F=E5=BC=83?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stat/zeros.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/stat/zeros.go b/stat/zeros.go index 68844b2..68a460b 100644 --- a/stat/zeros.go +++ b/stat/zeros.go @@ -4,19 +4,6 @@ package stat // // args[0] dtype 基础数据类型 func Zeros[T BaseType](shape int) []T { - //var __dtype reflect.Kind = reflect.Invalid - //if len(args) > 0 { - // // 第一个参数为是否copy - // if _cp, ok := args[0].(reflect.Kind); ok { - // __dtype = _cp - // } - //} - //switch __dtype { - //case reflect.Invalid: - //case reflect.Int: - // - //default: - //} var t T return Repeat(t, shape) } -- Gitee From d5ae41d84e7758a639d00542d38ad2899d7c489f Mon Sep 17 00:00:00 2001 From: wangfeng Date: Thu, 16 Feb 2023 18:13:25 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E9=A2=84=E5=A4=87=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=87=86=E5=A4=87=E5=90=88=E5=B9=B6=E5=87=BD=E6=95=B0=E7=9A=84?= =?UTF-8?q?"=E6=95=B0=E5=AD=97=E7=9A=84"=E6=BA=90=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stat/numeric.go | 1 + 1 file changed, 1 insertion(+) create mode 100644 stat/numeric.go diff --git a/stat/numeric.go b/stat/numeric.go new file mode 100644 index 0000000..a5ffb48 --- /dev/null +++ b/stat/numeric.go @@ -0,0 +1 @@ +package stat -- Gitee From 9c5053cb287e5b7ea5828c5a9956bca928e2e392 Mon Sep 17 00:00:00 2001 From: wangfeng Date: Thu, 16 Feb 2023 18:15:25 +0800 Subject: [PATCH 3/5] =?UTF-8?q?ewm=E5=8A=9F=E8=83=BD=E6=BA=90=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=94=B9=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stat/{window_ewm.go => ewm.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename stat/{window_ewm.go => ewm.go} (100%) diff --git a/stat/window_ewm.go b/stat/ewm.go similarity index 100% rename from stat/window_ewm.go rename to stat/ewm.go -- Gitee From 1bf93b90b7ce6820457a989603f7b96df342b8fb Mon Sep 17 00:00:00 2001 From: wangfeng Date: Thu, 16 Feb 2023 18:23:41 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=BA=90=E6=96=87=E4=BB=B6=E6=94=B9?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- generic.go => series.go | 0 generic_append.go => series_append.go | 0 generic_apply.go => series_apply.go | 0 generic_diff.go => series_diff.go | 0 generic_diff_test.go => series_diff_test.go | 0 generic_ewm.go => series_ewm.go | 0 generic_fillna.go => series_fillna.go | 0 generic_max.go => series_max.go | 0 generic_min.go => series_min.go | 0 generic_range.go => series_range.go | 0 generic_ref.go => series_ref.go | 0 generic_rolling.go => series_rolling.go | 0 generic_shift.go => series_shift.go | 0 generic_sort.go => series_sort.go | 0 generic_sum.go => series_sum.go | 0 generic_test.go => series_test.go | 0 series_string.go => series_xstring.go | 0 series_string_test.go => series_xstring_test.go | 0 18 files changed, 0 insertions(+), 0 deletions(-) rename generic.go => series.go (100%) rename generic_append.go => series_append.go (100%) rename generic_apply.go => series_apply.go (100%) rename generic_diff.go => series_diff.go (100%) rename generic_diff_test.go => series_diff_test.go (100%) rename generic_ewm.go => series_ewm.go (100%) rename generic_fillna.go => series_fillna.go (100%) rename generic_max.go => series_max.go (100%) rename generic_min.go => series_min.go (100%) rename generic_range.go => series_range.go (100%) rename generic_ref.go => series_ref.go (100%) rename generic_rolling.go => series_rolling.go (100%) rename generic_shift.go => series_shift.go (100%) rename generic_sort.go => series_sort.go (100%) rename generic_sum.go => series_sum.go (100%) rename generic_test.go => series_test.go (100%) rename series_string.go => series_xstring.go (100%) rename series_string_test.go => series_xstring_test.go (100%) diff --git a/generic.go b/series.go similarity index 100% rename from generic.go rename to series.go diff --git a/generic_append.go b/series_append.go similarity index 100% rename from generic_append.go rename to series_append.go diff --git a/generic_apply.go b/series_apply.go similarity index 100% rename from generic_apply.go rename to series_apply.go diff --git a/generic_diff.go b/series_diff.go similarity index 100% rename from generic_diff.go rename to series_diff.go diff --git a/generic_diff_test.go b/series_diff_test.go similarity index 100% rename from generic_diff_test.go rename to series_diff_test.go diff --git a/generic_ewm.go b/series_ewm.go similarity index 100% rename from generic_ewm.go rename to series_ewm.go diff --git a/generic_fillna.go b/series_fillna.go similarity index 100% rename from generic_fillna.go rename to series_fillna.go diff --git a/generic_max.go b/series_max.go similarity index 100% rename from generic_max.go rename to series_max.go diff --git a/generic_min.go b/series_min.go similarity index 100% rename from generic_min.go rename to series_min.go diff --git a/generic_range.go b/series_range.go similarity index 100% rename from generic_range.go rename to series_range.go diff --git a/generic_ref.go b/series_ref.go similarity index 100% rename from generic_ref.go rename to series_ref.go diff --git a/generic_rolling.go b/series_rolling.go similarity index 100% rename from generic_rolling.go rename to series_rolling.go diff --git a/generic_shift.go b/series_shift.go similarity index 100% rename from generic_shift.go rename to series_shift.go diff --git a/generic_sort.go b/series_sort.go similarity index 100% rename from generic_sort.go rename to series_sort.go diff --git a/generic_sum.go b/series_sum.go similarity index 100% rename from generic_sum.go rename to series_sum.go diff --git a/generic_test.go b/series_test.go similarity index 100% rename from generic_test.go rename to series_test.go diff --git a/series_string.go b/series_xstring.go similarity index 100% rename from series_string.go rename to series_xstring.go diff --git a/series_string_test.go b/series_xstring_test.go similarity index 100% rename from series_string_test.go rename to series_xstring_test.go -- Gitee From 7b71401ddf0ff10b7d4e73d1a45c91a1833ee771 Mon Sep 17 00:00:00 2001 From: wangfeng Date: Thu, 16 Feb 2023 20:01:13 +0800 Subject: [PATCH 5/5] =?UTF-8?q?#I6CYP6=20=E5=AE=9E=E7=8E=B0=E9=80=9A?= =?UTF-8?q?=E8=BE=BE=E4=BF=A1LLVBARS=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- formula/llvbars.go | 16 ++++++++ formula/llvbars_test.go | 13 +++++++ series_append.go | 22 +++++++++++ series_max.go | 4 ++ series_min.go | 4 ++ stat/argmax.go | 77 ++++++++++++++++++++++++++++--------- stat/argmax_test.go | 6 +-- stat/argmin.go | 65 +++++++++++++++++++++++++------ stat/argmin_test.go | 8 ++-- stat/ndarray.go | 18 +-------- stat/ndarray_basic.go | 21 ++++++++++ stat/ndarray_fromnumeric.go | 9 +++++ stat/numeric.go | 1 - stat/series.go | 7 ++++ stat/type.go | 1 - 15 files changed, 215 insertions(+), 57 deletions(-) create mode 100644 formula/llvbars.go create mode 100644 formula/llvbars_test.go create mode 100644 stat/ndarray_basic.go create mode 100644 stat/ndarray_fromnumeric.go delete mode 100644 stat/numeric.go diff --git a/formula/llvbars.go b/formula/llvbars.go new file mode 100644 index 0000000..81ce4de --- /dev/null +++ b/formula/llvbars.go @@ -0,0 +1,16 @@ +package formula + +import "gitee.com/quant1x/pandas/stat" + +// LLVBARS 求上一低点到当前的周期数. +// +// 用法: +// LLVBARS(X,N):求N周期内X最低值到当前周期数,N=0表示从第一个有效值开始统计 +// 例如: +// LLVBARS(HIGH,20)求得20日最低点到当前的周期数 +func LLVBARS(S stat.Series, N any) stat.Series { + x := S.Rolling(N).Apply(func(X stat.Series, W stat.DType) stat.DType { + return stat.Any2DType(X.Reverse().ArgMin()) + }) + return x +} diff --git a/formula/llvbars_test.go b/formula/llvbars_test.go new file mode 100644 index 0000000..b011054 --- /dev/null +++ b/formula/llvbars_test.go @@ -0,0 +1,13 @@ +package formula + +import ( + "fmt" + "gitee.com/quant1x/pandas/stat" + "testing" +) + +func TestLLVBARS(t *testing.T) { + n1 := []float32{1.1, 2.2, 1.3, 1.4} + s1 := stat.NewSeries[float32](n1...) + fmt.Println(LLVBARS(s1, 2)) +} diff --git a/series_append.go b/series_append.go index 1593708..f8351d8 100644 --- a/series_append.go +++ b/series_append.go @@ -5,6 +5,28 @@ import ( "reflect" ) +func (self *NDFrame) Reverse() stat.Series { + s := self.Empty() + + if self.type_ == stat.SERIES_TYPE_BOOL { + values := stat.Reverse(self.values.([]bool)) + s = s.Append(values) + } else if self.type_ == stat.SERIES_TYPE_INT64 { + values := stat.Reverse(self.values.([]int64)) + s = s.Append(values) + } else if self.type_ == stat.SERIES_TYPE_FLOAT32 { + values := stat.Reverse(self.values.([]float32)) + s = s.Append(values) + } else if self.type_ == stat.SERIES_TYPE_FLOAT64 { + values := stat.Reverse(self.values.([]float64)) + s = s.Append(values) + } else { + values := stat.Reverse(self.values.([]string)) + s = s.Append(values) + } + return s +} + // 插入一条记录 func (self *NDFrame) insert(idx, size int, v any) { if self.type_ == stat.SERIES_TYPE_BOOL { diff --git a/series_max.go b/series_max.go index 5f825b8..0594dff 100644 --- a/series_max.go +++ b/series_max.go @@ -111,3 +111,7 @@ func (self *NDFrame) Max() any { } //return Nil2Float64 } + +func (self *NDFrame) ArgMax() int { + return stat.ArgMax2(self.DTypes()) +} diff --git a/series_min.go b/series_min.go index c4f4b77..5f978d4 100644 --- a/series_min.go +++ b/series_min.go @@ -117,3 +117,7 @@ func (self *NDFrame) Min() any { } return stat.Nil2Float64 } + +func (self *NDFrame) ArgMin() int { + return stat.ArgMin2(self.DTypes()) +} diff --git a/stat/argmax.go b/stat/argmax.go index d93ce10..0023926 100644 --- a/stat/argmax.go +++ b/stat/argmax.go @@ -6,20 +6,55 @@ import ( ) // ArgMax Returns the indices of the maximum values along an axis. -// 返回轴上最大值的索引 -//func ArgMax_V1[T Number](v []T) int { -// var vv any = v -// switch values := vv.(type) { -// case []float32: -// return vek32.ArgMax(values) -// case []float64: -// return vek.ArgMax(values) -// default: -// return __arg_max(v) -// } -//} +// +// 返回轴上最大值的索引 +func ArgMax[T Number](x []T) int { + ret := unaryOperations2[T, int](x, vek32.ArgMax, vek.ArgMax, __arg_max_go[T]) + return ret +} -func __arg_max_go[T Number](x []T) int { +func ArgMax2[T BaseType](x []T) int { + var d int + switch vs := any(x).(type) { + case []float32: + d = ArgMax(vs) + case []float64: + d = ArgMax(vs) + case []int: + d = ArgMax(vs) + case []int8: + d = ArgMax(vs) + case []int16: + d = ArgMax(vs) + case []int32: + d = ArgMax(vs) + case []int64: + d = ArgMax(vs) + case []uint: + d = ArgMax(vs) + case []uint8: + d = ArgMax(vs) + case []uint16: + d = ArgMax(vs) + case []uint32: + d = ArgMax(vs) + case []uint64: + d = ArgMax(vs) + case []uintptr: + d = ArgMax(vs) + case []string: + d = __arg_max_go(vs) + case []bool: + d = __arg_max_go_bool(vs) + default: + // 其它类型原样返回 + panic(Throw(any(x))) + } + + return d +} + +func __arg_max_go[T Ordered](x []T) int { max := x[0] idx := 0 for i, v := range x[1:] { @@ -31,10 +66,14 @@ func __arg_max_go[T Number](x []T) int { return idx } -// ArgMax Returns the indices of the maximum values along an axis. -// -// 返回轴上最大值的索引 -func ArgMax[T Number](x []T) int { - ret := unaryOperations2[T, int](x, vek32.ArgMax, vek.ArgMax, __arg_max_go[T]) - return ret +func __arg_max_go_bool(x []bool) int { + max := bool2Int(x[0]) + idx := 0 + for i, v := range x[1:] { + if bool2Int(v) > max { + max = bool2Int(v) + idx = 1 + i + } + } + return idx } diff --git a/stat/argmax_test.go b/stat/argmax_test.go index c780001..8046e4f 100644 --- a/stat/argmax_test.go +++ b/stat/argmax_test.go @@ -9,7 +9,7 @@ func TestArgMax(t *testing.T) { n1 := []float32{1.1, 2.2, 1.3, 1.4} n2 := []float64{1.2, 1.2, 3.3} n3 := []int64{11, 12, 33} - fmt.Println(ArgMax(n1)) - fmt.Println(ArgMax(n2)) - fmt.Println(ArgMax(n3)) + fmt.Println(ArgMax2(n1)) + fmt.Println(ArgMax2(n2)) + fmt.Println(ArgMax2(n3)) } diff --git a/stat/argmin.go b/stat/argmin.go index 82c7a8c..d77e568 100644 --- a/stat/argmin.go +++ b/stat/argmin.go @@ -13,19 +13,48 @@ func ArgMin[T Number](x []T) int { return ret } -//func ArgMin[T Number](v []T) int { -// var vv any = v -// switch values := vv.(type) { -// case []float32: -// return vek32.ArgMin(values) -// case []float64: -// return vek.ArgMin(values) -// default: -// return __arg_min(v) -// } -//} +func ArgMin2[T BaseType](x []T) int { + var d int + switch vs := any(x).(type) { + case []float32: + d = ArgMin(vs) + case []float64: + d = ArgMin(vs) + case []int: + d = ArgMin(vs) + case []int8: + d = ArgMin(vs) + case []int16: + d = ArgMin(vs) + case []int32: + d = ArgMin(vs) + case []int64: + d = ArgMin(vs) + case []uint: + d = ArgMin(vs) + case []uint8: + d = ArgMin(vs) + case []uint16: + d = ArgMin(vs) + case []uint32: + d = ArgMin(vs) + case []uint64: + d = ArgMin(vs) + case []uintptr: + d = ArgMin(vs) + case []string: + d = __arg_min_go(vs) + case []bool: + d = __arg_min_go_bool(vs) + default: + // 其它类型原样返回 + panic(Throw(any(x))) + } + + return d +} -func __arg_min_go[T Number](x []T) int { +func __arg_min_go[T Ordered](x []T) int { min := x[0] idx := 0 for i, v := range x[1:] { @@ -36,3 +65,15 @@ func __arg_min_go[T Number](x []T) int { } return idx } + +func __arg_min_go_bool(x []bool) int { + min := bool2Int(x[0]) + idx := 0 + for i, v := range x[1:] { + if bool2Int(v) < min { + min = bool2Int(v) + idx = 1 + i + } + } + return idx +} diff --git a/stat/argmin_test.go b/stat/argmin_test.go index e780983..6ebfdeb 100644 --- a/stat/argmin_test.go +++ b/stat/argmin_test.go @@ -10,8 +10,8 @@ func TestArgMin(t *testing.T) { n2 := []float64{1.2, 1.2, 0.3} n3 := []int64{11, 12, 33} n4 := []int32{55, 11, 12, 33} - fmt.Println(ArgMin(n1)) - fmt.Println(ArgMin(n2)) - fmt.Println(ArgMin(n3)) - fmt.Println(ArgMin(n4)) + fmt.Println(ArgMin2(n1)) + fmt.Println(ArgMin2(n2)) + fmt.Println(ArgMin2(n3)) + fmt.Println(ArgMin2(n4)) } diff --git a/stat/ndarray.go b/stat/ndarray.go index 096b68c..eccaba2 100644 --- a/stat/ndarray.go +++ b/stat/ndarray.go @@ -8,22 +8,6 @@ import ( type NDArray[T BaseType] []T -func (self NDArray[T]) Name() string { - return "x" -} - -func (self NDArray[T]) Rename(name string) { - -} - -func (self NDArray[T]) Type() Type { - return checkoutRawType(self) -} - -func (self NDArray[T]) Values() any { - return []T(self) -} - func (self NDArray[T]) NaN() any { switch any(self).(type) { case []bool: @@ -153,7 +137,7 @@ func (self NDArray[T]) FillNa(v any, inplace bool) Series { } func (self NDArray[T]) Max() any { - d := Min2(self) + d := Max2(self) return d } diff --git a/stat/ndarray_basic.go b/stat/ndarray_basic.go new file mode 100644 index 0000000..fb8f375 --- /dev/null +++ b/stat/ndarray_basic.go @@ -0,0 +1,21 @@ +package stat + +func (self NDArray[T]) Name() string { + return "x" +} + +func (self NDArray[T]) Rename(name string) { + +} + +func (self NDArray[T]) Type() Type { + return checkoutRawType(self) +} + +func (self NDArray[T]) Values() any { + return []T(self) +} + +func (self NDArray[T]) Reverse() Series { + return Reverse(self) +} diff --git a/stat/ndarray_fromnumeric.go b/stat/ndarray_fromnumeric.go new file mode 100644 index 0000000..ef7c449 --- /dev/null +++ b/stat/ndarray_fromnumeric.go @@ -0,0 +1,9 @@ +package stat + +func (self NDArray[T]) ArgMax() int { + return ArgMax2(self) +} + +func (self NDArray[T]) ArgMin() int { + return ArgMin2(self) +} diff --git a/stat/numeric.go b/stat/numeric.go deleted file mode 100644 index a5ffb48..0000000 --- a/stat/numeric.go +++ /dev/null @@ -1 +0,0 @@ -package stat diff --git a/stat/series.go b/stat/series.go index b0447cb..990d0b8 100644 --- a/stat/series.go +++ b/stat/series.go @@ -16,6 +16,9 @@ type Series interface { // Values 获得全部数据集 Values() any + // Reverse 序列反转 + Reverse() Series + // NaN 输出默认的NaN NaN() any // Floats 强制转成[]float32 @@ -57,8 +60,12 @@ type Series interface { FillNa(v any, inplace bool) Series // Max 找出最大值 Max() any + // ArgMax Returns the indices of the maximum values along an axis + ArgMax() int // Min 找出最小值 Min() any + // ArgMin Returns the indices of the minimum values along an axis + ArgMin() int // Select 选取一段记录 Select(r ScopeLimit) Series // Append 增加一批记录 diff --git a/stat/type.go b/stat/type.go index 8c896f3..a239602 100644 --- a/stat/type.go +++ b/stat/type.go @@ -208,7 +208,6 @@ func __anyToNumber[T Number](v any) T { vt := ParseFloat64(val, v) if Float64IsNaN(vt) { td := T(0) - //rawType :=checkoutRawType(td) if !reflect.ValueOf(td).CanFloat() { return td } -- Gitee