滑动窗口在列而不是行上向下遍历

时间:2019-02-03 20:15:30

标签: python pandas numpy sliding-window

我正在尝试创建一个滑动窗口,该窗口使用下面的代码片段遍历每行:

从excel读取数据:

import numpy as np
import pandas as pd

data = pd.read_excel('link_to_excel', header=None)
vals = pd.DataFrame.to_numpy(data)
col_count, row_count = vals.shape

来自excel的数据如下:

i = [[ 1  2  3  4  5  6  7  8  9 10]
     [11 12 13 14 15 16 17 18 19 20]
     [21 22 23 23 25 26 27 28 29 30]
     [ 1  2  3  4  5  6  7  8  9 10]
     [21 22 23 23 25 26 27 28 29 30]
     [21 22 23 23 25 26 27 28 29 30]
     [ 1  2  3  4  5  6  7  8  9 10]]

滑动窗口功能:

def rolling(a, window):
    shape = (a.size - window + 1, window)
    strides = (a.itemsize, a.itemsize)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides, writeable=False)

当我跑步时:

window = 6
print(rolling(i, window))

我得到一个看起来像这样的滑动窗口(遍历i的列):

[[ 1 11 21  1 21 21]
 [11 21  1 21 21  1]
 [21  1 21 21  1  2]
 [ 1 21 21  1  2 12]
 [21 21  1  2 12 22]]

基于i中的第一行,我正在寻找所需的滑动窗口:

[[1 2 3 4 5  6]
 [2 3 4 5 6  7]
 [3 4 5 6 7  8]
 [4 5 6 7 8  9]
 [5 6 7 8 9 10]]

当我使用i生成np.random.randint(1, 31, size=(7, 10))时,会得到想要的结果。

从excel中读取时如何获得所需的滑动窗口?

print(i.ravel(order='K'))的输出

[ 1 11 21  1 21 21  1  2 12 22  2 22 22  2  3 13 23  3 23 23  3  4 14 24
  4 24 24  4  5 15 25  5 25 25  5  6 16 26  6 26 26  6  7 17 27  7 27 27
  7  8 18 28  8 28 28  8  9 19 29  9 29 29  9 10 20 30 10 30 30 10]

print(i.shape)的输出

(7,10)

excel样张

1 个答案:

答案 0 :(得分:1)

我的熊猫没有安装xlrd支持,但是将其导出到csv

In [168]: data = pd.read_csv('../Downloads/Untitled spreadsheet - Sheet1.csv', h
     ...: eader=None)
In [169]: data
Out[169]: 
    0   1   2   3   4   5   6   7   8   9
0   1   2   3   4   5   6   7   8   9  10
1  11  12  13  14  15  16  17  18  19  20
2  21  22  23  24  25  26  27  28  29  30
3   1   2   3   4   5   6   7   8   9  10
4  21  22  23  24  25  26  27  28  29  30
5  21  22  23  24  25  26  27  28  29  30
6   1   2   3   4   5   6   7   8   9  10
In [170]: data = data.values

strides表示它是order F,阶次为'K'的裂痕也是如此

In [171]: data.strides
Out[171]: (8, 56)
In [172]: data.ravel('K')
Out[172]: 
array([ 1, 11, 21,  1, 21, 21,  1,  2, 12, 22,  2, 22, 22,  2,  3, 13, 23,
        3, 23, 23,  3,  4, 14, 24,...])

In [175]: data.ravel('C')
Out[175]: 
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
       18, 19, 20, 21, 22,...])

In [177]: rolling(data.ravel('C'),6)
Out[177]: 
array([[ 1,  2,  3,  4,  5,  6],
       [ 2,  3,  4,  5,  6,  7],
       [ 3,  4,  5,  6,  7,  8],
       [ 4,  5,  6,  7,  8,  9],
       [ 5,  6,  7,  8,  9, 10],
       ...

我以前没有看过order数据框值。但是,由于DataFrame是Series,列的集合,因此2d数组版本的顺序为'F'是有意义的,其值沿列向下。

您想跨列roll,因此您需要更改数组的顺序。