在列滑动窗口向下横移,而不是行

问题描述 投票:0回答:1

我试图建立一个使用下面的代码段沿每一行横贯滑动窗口:

读取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

python pandas numpy sliding-window
1个回答
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。但由于数据帧是系列,该列的集合,它是有道理的二维数组版本会为了“F”,其值下降的列。

想要在整个列roll,所以你需要改变排列顺序。

© www.soinside.com 2019 - 2024. All rights reserved.