import numpy as np
import pandas as pd
import math
import random
import scipy.interpolate as interpolate # B-Spline
RANDOM_STATE = 1
[docs]def chunks(lst, n):
"""Yield successive n-sized chunks from lst."""
for i in range(0, len(lst), n):
yield lst[i : i + n]
[docs]def sort_values_by_X(X, y):
df = pd.DataFrame(y, X)
df = df.sort_index()
X_sorted = np.array(df.index)
y_sorted = np.array(df[0])
return X_sorted, y_sorted
[docs]def create_partitions(X, y, n_sections, sampling_type):
n = X.shape[0]
if sampling_type == "random":
idx = list(range(0, n))
random.seed(RANDOM_STATE) # not np.random.seed !!!
random.shuffle(idx)
elif sampling_type == "slicing":
idx = list(range(0, n))
X_partition_idxs = list(chunks(idx, math.ceil(n / n_sections)))
return X_partition_idxs
[docs]def bspline(x, y, sections, degree=3):
idx = np.linspace(0, len(x) - 1, sections + 1, endpoint=True).round(0).astype("int")
x = x[idx]
y = y[idx]
t, c, k = interpolate.splrep(x, y, s=0, k=degree)
spline = interpolate.BSpline(t, c, k, extrapolate=True)
pars = {"t": t, "c": c, "deg": k}
points = {"x": x, "y": y}
return pars, spline, points