【问题标题】:sliding window traverses downward on column instead of rows滑动窗口在列而不是行上向下遍历
【发布时间】:2019-06-27 15:53:01
【问题描述】:

我正在尝试使用下面的 sn-p 构建一个遍历每一行的滑动窗口:

从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]]

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

从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 工作表

【问题讨论】:

  • 如上所述,该问题不可重现。你发现生成的数组没有这个问题。
  • 抱歉,如果我已经描述了我在获取数据时使用的确切方法、我用来处理它的函数、我得到的结果以及我正在寻找的期望输出。
  • 当你使用生成的数组生成 i 时,你会得到一个带逗号的数组。我错过了什么吗?上面的数组看起来像数字文本字符串。
  • @run-out 每个号码的类型是<class 'numpy.int64'>
  • @run-out,不带逗号的数组是numpy数组的典型显示。

标签: python pandas numpy sliding-window


【解决方案1】:

我的 pandas 上没有安装 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' 的 ravel 一样

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 跨列,因此您需要更改数组的顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2016-01-24
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多