【问题标题】:How to cut dataset into X and Y parameters如何将数据集切割成 X 和 Y 参数
【发布时间】:2021-09-29 23:48:12
【问题描述】:

我有一个时间序列数据集,它由均匀间隔的时间步长和另一个参数(比如音量)组成。我想将数据集切割/拆分为 X 和 Y 参数来训练我的 ML 模型。我正在寻找一种适用于 Python 的逻辑/算法,可用于处理下面的简化版本。

我有一个偶数时间步长数组(1 个时间步长 = 1 天),范围从 1 到 100:

                                            array = [1,2,3,...,100]

我还想出了以下参数:NK。 N用于X参数,K用于Y参数。

如果N = 5,则在第一次迭代X = [1,2,3,4,5],在第二次迭代X = [2,3,4,5,6]第三次迭代X = [3,4,5,6,7]等等。所以,一个X的长度等于N的个数。如果N = 10,则在第一次迭代时X = [1,2,3,...,10],在第二次迭代时X = [2,3,4...,11],依此类推。

K参数表示几何序列的长度。例如:k =5 表示k = (1,2,4,8,16)k = 3 表示k = (1,2,4)k = 7 表示k = (1,2,4,8,16,32,64)。 Y 参数在每次迭代中使用 X 数组的最后一个元素,并将几何序列中的值添加到其中。所以,一个Y的长度等于K的个数。如果len(K) = 5 -> len(Y)=5,如果len(K) = 3 -> len(Y)=3等等。

示例 1:N=5,K=5:

第一步

                 X = [1,2,3,4,5]         and       Y = [6,7,9,13, 21] 

because K = (1,2,4,8, 16)  and Y = [5+1, 5+2, 5+4, 5+8, 5+16] with 5 being the last element of an array X

第二步

                 X = [2,3,4,5, 6]        and       Y = [7,8,10,14, 22] 

because K = (1,2,4,8, 16)  and Y = [6+1, 6+2, 6+4, 6+8, 6+16] with 6 being the last element of an array X

第三步

                 X = [3,4,5, 6, 7]       and       Y = [8,9,11,15, 23] 

because K = (1,2,4,8, 16)  and Y = [7+1, 7+2, 7+4, 7+8, 7+16] with 7 being the last element of an array X

**Other steps**

最后一步

                         X = [?,?,?,?,?]; Y = [?,?,?,?,100] 
k = (1,2,4,8,16) because 100 is the last element of an array

示例 2:N = 6,K = 3: 第一步

X = [1,2,3,4,5, 6]     and      Y = [7,8,10]   Because K = (1,2,4) and Y = [6+1, 6+2, 6+4]

第二步

X = [2,3,4,5,6, 7]     and      Y = [8,9,11]   Because K = (1,2,4) and Y = [7+1, 7+2, 7+4]

第三步

X = [3,4,5,6,7,8]      and        Y = [9,10,12] Because K = (1,2,4) and Y = [8+1, 8+2, 8+4]

**Other steps** 最后一步

X = [92,93,94,95,96]; Y = [97,98,100], k = (1,2,4) because 100 is the last element of an array

编辑

我希望函数看起来像: def dataset_split(array, N, K):

它应该基于 1 到 100 之间的输入数组返回多个 X 和 Y 数组(基本上是块)。基本上它应该遍历步骤并将 X 和 Y 的结果以矩阵或数组的形式保存。根据我上面的示例 1,前三个步骤后我的 X 数组将是

X = [[1,2,3,4,5], [2,3,4,5,6], [3,4,5, 6, 7]]

前三步后我的 Y 数组将是

Y = [[6,7,9,13, 21], [7,8,10,14, 22], [8,9,11,15, 23]]

该过程应该一直持续到到达数组的最后一个元素,在这种情况下为 100

【问题讨论】:

  • 函数应该返回什么?
  • 函数应该根据 N 和 K 的输入值返回 X 和 Y 数组。如果我返回示例 1,输入 N = 5 和 K = 5,函数应该返回大小为 X 的数组在 (83,5) 附近,其中 83 是切割次数,5 是每次切割的长度。与 Y 数组类似

标签: python arrays python-3.x algorithm numpy


【解决方案1】:

获取X 的所有值的一个非常简单的方法是在array 中创建一个滑动窗口视图。您可以直接使用np.lib.stride_tricks.sliding_window_view

n = ...
k = ...

x = np.lib.stride_tricks.sliding_window_view(array, n)

几何序列K可以用np.logspace生成:

K = np.logspace(0, k - 1, k, base=2)

K = 2.0**np.arange(k)

无论哪种方式,您都可以将所有y 预先生成为

y = x + K

现在您有两个数组,其中包含您需要的所有数据:

>>> array = np.arange(1, 101)
>>> n = k = 5
>>> x = np.lib.stride_tricks.sliding_window_view(array, n)
>>> x
array([[  1,   2,   3,   4,   5],
       [  2,   3,   4,   5,   6],
       [  3,   4,   5,   6,   7],
       ...
       [ 94,  95,  96,  97,  98],
       [ 95,  96,  97,  98,  99],
       [ 96,  97,  98,  99, 100]])
>>> K = np.logspace(0, k - 1, k, base=2)
>>> K
array([ 1.,  2.,  4.,  8., 16.])
>>> y = x + K
>>> y
array([[  2.,   4.,   7.,  12.,  21.],
       [  3.,   5.,   8.,  13.,  22.],
       [  4.,   6.,   9.,  14.,  23.],
       ...
       [ 95.,  97., 100., 105., 114.],
       [ 96.,  98., 101., 106., 115.],
       [ 97.,  99., 102., 107., 116.]])

这种方法的好处是你不需要复制array的原始数据来制作x,一切都是完全向量化的。无论您计划执行什么操作,都可以使用 numpy 函数批量执行。

【讨论】:

  • 谢谢!在​​处理大型数组/矩阵时,矢量化会派上用场
【解决方案2】:

这满足你的例子:

def split_dataset(array, N, K):
    k = 2**np.arange(K)
    
    # column stacking i-places shifted array for N columns
    X = np.c_[[np.roll(array,-i) for i in range(N)]].T[:-N+1]
    
    # masking rows that will go over the last value in array
    mask = X[:,-1] + k[-1] <= array[-1]
    X = X[mask]
    
    # adding k to the last column of X 
    Y = X[:,-1].reshape(-1,1) + k

    return X, Y
    
X, Y = split_dataset(array, 5, 5)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-20
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    相关资源
    最近更新 更多