скользящее окно перемещается вниз по столбцу вместо строк - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь построить скользящее окно, которое перемещается вдоль каждой строки, используя следующий фрагмент:

Чтение данных из 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]]

Требуемое скользящее окно, которое я ищу, основано на строке first из 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 голосов
/ 04 февраля 2019

У меня на пандах не установлена ​​поддержка 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, как и ravel с заказом'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 по столбцам, так что вам нужно будет изменить порядок массива.

...