Вы можете применить оконный вид к массиву через numpy.lib.stride_tricks.as_strided
. Вот функция, которую я создал некоторое время назад именно для этой цели. Это немного сложно понять. По сути, функция просто изменяет шаги памяти или шагает вдоль вновь созданной оси таким образом, что в каждой строке отображается сдвинутая версия предыдущего.
def windowed_view(x, window_size):
"""Create a 2d windowed view of a 1d array.
`x` must be a 1d numpy array.
`numpy.lib.stride_tricks.as_strided` is used to create the view.
The data is not copied. You should never write to a windowed view.
Example:
>>> x = np.array([1, 2, 3, 4, 5, 6])
>>> windowed_view(x, 3)
array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
"""
assert window_size <= x.size, "window_size (%s) must be <= x.size (%s)" % (window_size, x.size)
return np.lib.stride_tricks.as_strided(
x,
shape=(x.size - window_size + 1, window_size),
strides=(x.strides[0], x.strides[0])
)
df = pd.DataFrame({'predictedFeature': [2000,2000,0,2200,2200,0,2100,2100,2100,0,0,100,100,100,0,100,100]})
w = windowed_view(df.predictedFeature, 7)
[[2000 2000 0 2200 2200 0 2100]
[2000 0 2200 2200 0 2100 2100]
[ 0 2200 2200 0 2100 2100 2100]
[2200 2200 0 2100 2100 2100 0]
[2200 0 2100 2100 2100 0 0]
[ 0 2100 2100 2100 0 0 100]
[2100 2100 2100 0 0 100 100]
[2100 2100 0 0 100 100 100]
[2100 0 0 100 100 100 0]
[ 0 0 100 100 100 0 100]
[ 0 100 100 100 0 100 100]]
Однако вы хотите толькостроки, где 0
находится посередине:
w[w[:,3]==0,:]
[[ 0 2200 2200 0 2100 2100 2100]
[2100 2100 2100 0 0 100 100]
[2100 2100 0 0 100 100 100]]
Единственная проблема - это начало и конец анализируемой серии, поскольку представление содержит только строки с полным окном. Вы пропускаете несколько нулей там. Однако вы можете перебирать первую и последнюю строку w
и обрабатывать эти случаи отдельно. Надеюсь, это поможет.