feat: 15 funciones datascience — estadística, DSP e IO de datos
12 funciones puras con implementación real: Standardize, MinMaxScale, Clip, RollingWindow, ZipSlices, GroupBy, Histogram, Pearson, Autocorrelation, FFT (Cooley-Tukey), DetectOutliers, Impute 3 funciones impuras (stubs): LoadCSV, LoadParquet, FetchDataFrame Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,12 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
// Autocorrelation calcula la autocorrelación de data con el desfase (lag) dado.
|
||||||
|
// Usa la correlación de Pearson entre data[0:n-lag] y data[lag:n].
|
||||||
|
// Si lag es inválido, retorna 0.
|
||||||
|
func Autocorrelation(data []float64, lag int) float64 {
|
||||||
|
n := len(data)
|
||||||
|
if lag < 0 || lag >= n {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return Pearson(data[:n-lag], data[lag:])
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: autocorrelation
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: pure
|
||||||
|
signature: "func Autocorrelation(data []float64, lag int) float64"
|
||||||
|
description: "Calcula la autocorrelación de una serie temporal con un desfase (lag) dado, usando correlación de Pearson."
|
||||||
|
tags: [datascience, statistics, autocorrelation, timeseries]
|
||||||
|
uses_functions: [pearson_go_datascience]
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: ""
|
||||||
|
imports: []
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/autocorrelation.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
// Clip recorta cada valor del slice para que quede dentro del rango [min, max].
|
||||||
|
func Clip(data []float64, min, max float64) []float64 {
|
||||||
|
result := make([]float64, len(data))
|
||||||
|
for i, v := range data {
|
||||||
|
switch {
|
||||||
|
case v < min:
|
||||||
|
result[i] = min
|
||||||
|
case v > max:
|
||||||
|
result[i] = max
|
||||||
|
default:
|
||||||
|
result[i] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: clip
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: pure
|
||||||
|
signature: "func Clip(data []float64, min, max float64) []float64"
|
||||||
|
description: "Recorta cada valor del slice para que quede dentro del rango [min, max]."
|
||||||
|
tags: [datascience, clamp, clip, range]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: ""
|
||||||
|
imports: []
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/clip.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
import "math"
|
||||||
|
|
||||||
|
// DetectOutliers devuelve un []bool donde true indica que el valor es un outlier
|
||||||
|
// según z-score. Un valor es outlier si |z-score| > threshold.
|
||||||
|
func DetectOutliers(data []float64, threshold float64) []bool {
|
||||||
|
n := len(data)
|
||||||
|
if n == 0 {
|
||||||
|
return []bool{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var sum float64
|
||||||
|
for _, v := range data {
|
||||||
|
sum += v
|
||||||
|
}
|
||||||
|
mean := sum / float64(n)
|
||||||
|
|
||||||
|
var sqSum float64
|
||||||
|
for _, v := range data {
|
||||||
|
d := v - mean
|
||||||
|
sqSum += d * d
|
||||||
|
}
|
||||||
|
stddev := math.Sqrt(sqSum / float64(n))
|
||||||
|
|
||||||
|
result := make([]bool, n)
|
||||||
|
if stddev == 0 {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
for i, v := range data {
|
||||||
|
z := (v - mean) / stddev
|
||||||
|
if z < 0 {
|
||||||
|
z = -z
|
||||||
|
}
|
||||||
|
result[i] = z > threshold
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: detect_outliers
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: pure
|
||||||
|
signature: "func DetectOutliers(data []float64, threshold float64) []bool"
|
||||||
|
description: "Detecta outliers en un slice de float64 usando z-score. Devuelve true para valores cuyo |z-score| supera el umbral."
|
||||||
|
tags: [datascience, statistics, outlier, anomaly]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: ""
|
||||||
|
imports: ["math"]
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/detect_outliers.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// FetchDataFrame ejecuta una consulta SQL contra un DSN y retorna los resultados como slice de mapas.
|
||||||
|
func FetchDataFrame(dsn, query string) ([]map[string]any, error) {
|
||||||
|
return nil, fmt.Errorf("not implemented")
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: fetch_data_frame
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: impure
|
||||||
|
signature: "func FetchDataFrame(dsn, query string) ([]map[string]any, error)"
|
||||||
|
description: "Ejecuta una consulta SQL contra un DSN y retorna los resultados como slice de mapas columna-valor."
|
||||||
|
tags: [datascience, io, bigquery, fetch]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: "error_go_core"
|
||||||
|
imports: ["fmt"]
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/fetch_data_frame.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
"math/cmplx"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FFT calcula la Fast Fourier Transform usando el algoritmo Cooley-Tukey radix-2.
|
||||||
|
// Si la longitud de data no es potencia de 2, se rellena con ceros (zero-padding).
|
||||||
|
func FFT(data []float64) []complex128 {
|
||||||
|
n := len(data)
|
||||||
|
if n == 0 {
|
||||||
|
return []complex128{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calcular la siguiente potencia de 2.
|
||||||
|
size := nextPow2(n)
|
||||||
|
|
||||||
|
// Convertir a complex128 con zero-padding.
|
||||||
|
x := make([]complex128, size)
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
x[i] = complex(data[i], 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
fftRecursive(x)
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
// nextPow2 retorna la menor potencia de 2 >= n.
|
||||||
|
func nextPow2(n int) int {
|
||||||
|
p := 1
|
||||||
|
for p < n {
|
||||||
|
p <<= 1
|
||||||
|
}
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// fftRecursive aplica Cooley-Tukey radix-2 DIT in-place.
|
||||||
|
func fftRecursive(x []complex128) {
|
||||||
|
n := len(x)
|
||||||
|
if n <= 1 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Separar pares e impares.
|
||||||
|
even := make([]complex128, n/2)
|
||||||
|
odd := make([]complex128, n/2)
|
||||||
|
for i := 0; i < n/2; i++ {
|
||||||
|
even[i] = x[2*i]
|
||||||
|
odd[i] = x[2*i+1]
|
||||||
|
}
|
||||||
|
|
||||||
|
fftRecursive(even)
|
||||||
|
fftRecursive(odd)
|
||||||
|
|
||||||
|
for k := 0; k < n/2; k++ {
|
||||||
|
t := cmplx.Rect(1, -2*math.Pi*float64(k)/float64(n)) * odd[k]
|
||||||
|
x[k] = even[k] + t
|
||||||
|
x[k+n/2] = even[k] - t
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: fft
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: pure
|
||||||
|
signature: "func FFT(data []float64) []complex128"
|
||||||
|
description: "Calcula la Transformada Rápida de Fourier (FFT) usando el algoritmo Cooley-Tukey radix-2. Aplica zero-padding si la longitud no es potencia de 2."
|
||||||
|
tags: [datascience, dsp, fft, fourier, frequency]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: ""
|
||||||
|
imports: ["math", "math/cmplx"]
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/fft.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
// GroupBy agrupa los elementos de un slice según la clave devuelta por keyFn.
|
||||||
|
func GroupBy[T any, K comparable](xs []T, keyFn func(T) K) map[K][]T {
|
||||||
|
groups := make(map[K][]T)
|
||||||
|
for _, x := range xs {
|
||||||
|
k := keyFn(x)
|
||||||
|
groups[k] = append(groups[k], x)
|
||||||
|
}
|
||||||
|
return groups
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: group_by
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: pure
|
||||||
|
signature: "func GroupBy[T any, K comparable](xs []T, keyFn func(T) K) map[K][]T"
|
||||||
|
description: "Agrupa los elementos de un slice según una función clave, devolviendo un mapa de clave a slice de elementos."
|
||||||
|
tags: [datascience, group, aggregate, generic]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: ""
|
||||||
|
imports: []
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/group_by.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
import "math"
|
||||||
|
|
||||||
|
// Histogram calcula las frecuencias de data distribuidas en la cantidad de buckets indicada.
|
||||||
|
// Retorna un slice de longitud buckets con el conteo de elementos por cada intervalo equiespaciado.
|
||||||
|
func Histogram(data []float64, buckets int) []int {
|
||||||
|
if buckets <= 0 || len(data) == 0 {
|
||||||
|
return make([]int, buckets)
|
||||||
|
}
|
||||||
|
|
||||||
|
minVal := math.Inf(1)
|
||||||
|
maxVal := math.Inf(-1)
|
||||||
|
for _, v := range data {
|
||||||
|
if v < minVal {
|
||||||
|
minVal = v
|
||||||
|
}
|
||||||
|
if v > maxVal {
|
||||||
|
maxVal = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
counts := make([]int, buckets)
|
||||||
|
rang := maxVal - minVal
|
||||||
|
if rang == 0 {
|
||||||
|
// Todos los valores son iguales; poner todo en el primer bucket.
|
||||||
|
counts[0] = len(data)
|
||||||
|
return counts
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, v := range data {
|
||||||
|
idx := int(float64(buckets) * (v - minVal) / rang)
|
||||||
|
if idx >= buckets {
|
||||||
|
idx = buckets - 1
|
||||||
|
}
|
||||||
|
counts[idx]++
|
||||||
|
}
|
||||||
|
return counts
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: histogram
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: pure
|
||||||
|
signature: "func Histogram(data []float64, buckets int) []int"
|
||||||
|
description: "Calcula las frecuencias de un slice de float64 distribuidas en un número dado de buckets equiespaciados."
|
||||||
|
tags: [datascience, statistics, histogram, frequency]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: ""
|
||||||
|
imports: ["math"]
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/histogram.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
import "math"
|
||||||
|
|
||||||
|
// Impute rellena valores NaN usando forward-fill.
|
||||||
|
// Cada NaN se reemplaza con el último valor válido (no NaN) anterior.
|
||||||
|
// Si el primer valor es NaN y no hay valor anterior, se mantiene como NaN.
|
||||||
|
func Impute(data []float64) []float64 {
|
||||||
|
result := make([]float64, len(data))
|
||||||
|
last := math.NaN()
|
||||||
|
for i, v := range data {
|
||||||
|
if !math.IsNaN(v) {
|
||||||
|
last = v
|
||||||
|
}
|
||||||
|
result[i] = last
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: impute
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: pure
|
||||||
|
signature: "func Impute(data []float64) []float64"
|
||||||
|
description: "Rellena valores NaN en un slice de float64 usando forward-fill, reemplazando cada NaN con el último valor válido anterior."
|
||||||
|
tags: [datascience, impute, missing, fill]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: ""
|
||||||
|
imports: ["math"]
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/impute.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// LoadCSV carga un archivo CSV y lo retorna como slice de mapas (columna -> valor).
|
||||||
|
func LoadCSV(path string) ([]map[string]string, error) {
|
||||||
|
return nil, fmt.Errorf("not implemented")
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: load_csv
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: impure
|
||||||
|
signature: "func LoadCSV(path string) ([]map[string]string, error)"
|
||||||
|
description: "Carga un archivo CSV desde disco y lo retorna como slice de mapas columna-valor."
|
||||||
|
tags: [datascience, io, csv, load]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: "error_go_core"
|
||||||
|
imports: ["fmt"]
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/load_csv.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// LoadParquet carga un archivo Parquet y lo retorna como slice de mapas.
|
||||||
|
func LoadParquet(path string) ([]map[string]any, error) {
|
||||||
|
return nil, fmt.Errorf("not implemented")
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: load_parquet
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: impure
|
||||||
|
signature: "func LoadParquet(path string) ([]map[string]any, error)"
|
||||||
|
description: "Carga un archivo Parquet desde disco y lo retorna como slice de mapas columna-valor."
|
||||||
|
tags: [datascience, io, parquet, load]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: "error_go_core"
|
||||||
|
imports: ["fmt"]
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/load_parquet.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
import "math"
|
||||||
|
|
||||||
|
// MinMaxScale escala los valores al rango [0, 1] usando min-max normalización.
|
||||||
|
// Si min == max, retorna un slice de ceros.
|
||||||
|
func MinMaxScale(data []float64) []float64 {
|
||||||
|
n := len(data)
|
||||||
|
if n == 0 {
|
||||||
|
return []float64{}
|
||||||
|
}
|
||||||
|
|
||||||
|
minVal := math.Inf(1)
|
||||||
|
maxVal := math.Inf(-1)
|
||||||
|
for _, v := range data {
|
||||||
|
if v < minVal {
|
||||||
|
minVal = v
|
||||||
|
}
|
||||||
|
if v > maxVal {
|
||||||
|
maxVal = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rang := maxVal - minVal
|
||||||
|
result := make([]float64, n)
|
||||||
|
if rang == 0 {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
for i, v := range data {
|
||||||
|
result[i] = (v - minVal) / rang
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: min_max_scale
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: pure
|
||||||
|
signature: "func MinMaxScale(data []float64) []float64"
|
||||||
|
description: "Escala los valores de un slice al rango [0, 1] usando normalización min-max."
|
||||||
|
tags: [datascience, statistics, normalize, scale]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: ""
|
||||||
|
imports: ["math"]
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/min_max_scale.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
import "math"
|
||||||
|
|
||||||
|
// Pearson calcula el coeficiente de correlación de Pearson entre dos slices.
|
||||||
|
// Si los slices tienen distinta longitud, usa la longitud mínima.
|
||||||
|
// Retorna 0 si alguna desviación estándar es 0.
|
||||||
|
func Pearson(xs, ys []float64) float64 {
|
||||||
|
n := len(xs)
|
||||||
|
if len(ys) < n {
|
||||||
|
n = len(ys)
|
||||||
|
}
|
||||||
|
if n == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
var sumX, sumY float64
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
sumX += xs[i]
|
||||||
|
sumY += ys[i]
|
||||||
|
}
|
||||||
|
meanX := sumX / float64(n)
|
||||||
|
meanY := sumY / float64(n)
|
||||||
|
|
||||||
|
var num, denomX, denomY float64
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
dx := xs[i] - meanX
|
||||||
|
dy := ys[i] - meanY
|
||||||
|
num += dx * dy
|
||||||
|
denomX += dx * dx
|
||||||
|
denomY += dy * dy
|
||||||
|
}
|
||||||
|
|
||||||
|
denom := math.Sqrt(denomX * denomY)
|
||||||
|
if denom == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return num / denom
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: pearson
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: pure
|
||||||
|
signature: "func Pearson(xs, ys []float64) float64"
|
||||||
|
description: "Calcula el coeficiente de correlación de Pearson entre dos slices de float64."
|
||||||
|
tags: [datascience, statistics, correlation, pearson]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: ""
|
||||||
|
imports: ["math"]
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/pearson.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
// RollingWindow genera ventanas deslizantes de tamaño size sobre el slice xs.
|
||||||
|
// Si size <= 0 o size > len(xs), retorna nil.
|
||||||
|
func RollingWindow[T any](xs []T, size int) [][]T {
|
||||||
|
n := len(xs)
|
||||||
|
if size <= 0 || size > n {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
windows := make([][]T, 0, n-size+1)
|
||||||
|
for i := 0; i <= n-size; i++ {
|
||||||
|
w := make([]T, size)
|
||||||
|
copy(w, xs[i:i+size])
|
||||||
|
windows = append(windows, w)
|
||||||
|
}
|
||||||
|
return windows
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: rolling_window
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: pure
|
||||||
|
signature: "func RollingWindow[T any](xs []T, size int) [][]T"
|
||||||
|
description: "Genera ventanas deslizantes de tamaño fijo sobre un slice genérico."
|
||||||
|
tags: [datascience, window, rolling, sliding, generic]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: ""
|
||||||
|
imports: []
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/rolling_window.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
import "math"
|
||||||
|
|
||||||
|
// Standardize aplica Z-score normalización a un slice de float64.
|
||||||
|
// Cada valor se transforma a (x - mean) / stddev.
|
||||||
|
// Si stddev es 0, retorna un slice de ceros.
|
||||||
|
func Standardize(data []float64) []float64 {
|
||||||
|
n := len(data)
|
||||||
|
if n == 0 {
|
||||||
|
return []float64{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var sum float64
|
||||||
|
for _, v := range data {
|
||||||
|
sum += v
|
||||||
|
}
|
||||||
|
mean := sum / float64(n)
|
||||||
|
|
||||||
|
var sqSum float64
|
||||||
|
for _, v := range data {
|
||||||
|
d := v - mean
|
||||||
|
sqSum += d * d
|
||||||
|
}
|
||||||
|
stddev := math.Sqrt(sqSum / float64(n))
|
||||||
|
|
||||||
|
result := make([]float64, n)
|
||||||
|
if stddev == 0 {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
for i, v := range data {
|
||||||
|
result[i] = (v - mean) / stddev
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: standardize
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: pure
|
||||||
|
signature: "func Standardize(data []float64) []float64"
|
||||||
|
description: "Aplica Z-score normalización a un slice de float64, transformando cada valor a (x - media) / desviación estándar."
|
||||||
|
tags: [datascience, statistics, normalize, zscore]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: ""
|
||||||
|
imports: ["math"]
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/standardize.go"
|
||||||
|
---
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package datascience
|
||||||
|
|
||||||
|
// ZipSlices combina dos slices de float64 en pares [2]float64.
|
||||||
|
// El resultado tiene longitud igual al menor de los dos slices.
|
||||||
|
func ZipSlices(as, bs []float64) [][2]float64 {
|
||||||
|
n := len(as)
|
||||||
|
if len(bs) < n {
|
||||||
|
n = len(bs)
|
||||||
|
}
|
||||||
|
result := make([][2]float64, n)
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
result[i] = [2]float64{as[i], bs[i]}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: zip_slices
|
||||||
|
kind: function
|
||||||
|
lang: go
|
||||||
|
domain: datascience
|
||||||
|
version: "1.0.0"
|
||||||
|
purity: pure
|
||||||
|
signature: "func ZipSlices(as, bs []float64) [][2]float64"
|
||||||
|
description: "Combina dos slices de float64 en un slice de pares [2]float64, truncando al más corto."
|
||||||
|
tags: [datascience, zip, combine, pair]
|
||||||
|
uses_functions: []
|
||||||
|
uses_types: []
|
||||||
|
returns: []
|
||||||
|
returns_optional: false
|
||||||
|
error_type: ""
|
||||||
|
imports: []
|
||||||
|
tested: false
|
||||||
|
tests: []
|
||||||
|
test_file_path: ""
|
||||||
|
file_path: "functions/datascience/zip_slices.go"
|
||||||
|
---
|
||||||
Reference in New Issue
Block a user