представление кадра данных о кадрировании

Я хочу представление данных кадрового окна. Вместо того, чтобы выполнять какую-либо операцию в катящемся окне, мне нужен фреймворк данных, где окно представлено в другом измерении. Это может быть как pd.Panel или np.array и pd.DataFrame с pd.MultiIndex .

Настроить

 import pandas as pd import numpy as np np.random.seed([3,1415]) df = pd.DataFrame(np.random.rand(10, 3).round(2), columns=['A', 'B', 'C'], index=list('abcdefghij')) print df ABC a 0.44 0.41 0.46 b 0.47 0.46 0.02 c 0.85 0.82 0.78 d 0.76 0.93 0.83 e 0.88 0.93 0.72 f 0.12 0.15 0.20 g 0.44 0.10 0.28 h 0.61 0.09 0.84 i 0.74 0.87 0.69 j 0.38 0.23 0.44 

Ожидаемый результат

Для window = 2 я ожидаю, что результат будет.

  0 1 ABCABC a 0.44 0.41 0.46 0.47 0.46 0.02 b 0.47 0.46 0.02 0.85 0.82 0.78 c 0.85 0.82 0.78 0.76 0.93 0.83 d 0.76 0.93 0.83 0.88 0.93 0.72 e 0.88 0.93 0.72 0.12 0.15 0.20 f 0.12 0.15 0.20 0.44 0.10 0.28 g 0.44 0.10 0.28 0.61 0.09 0.84 h 0.61 0.09 0.84 0.74 0.87 0.69 i 0.74 0.87 0.69 0.38 0.23 0.44 

Я не уверен, что макет представлен таким образом, но это информация, которую я хочу. Я ищу наиболее эффективный способ справиться с этим.

Что я сделал до сих пор

Я экспериментировал с использованием shift различными способами, но он чувствует себя неуклюжим. Это то, что я использую для вывода выше:

 print pd.concat([df, df.shift(-1)], axis=1, keys=[0, 1]).dropna() 

2 Solutions collect form web for “представление кадра данных о кадрировании”

Мы могли бы использовать NumPy, чтобы получить вид в эти скользящие окна с его эзотерическими strided tricks . Если вы используете это новое измерение для некоторого сокращения, например матричное умножение, это будет идеально. Если по какой-то причине вы хотите иметь 2D выход, нам нужно использовать форму изменения в конце, что приведет к созданию копии.

Таким образом, реализация будет выглядеть примерно так:

 from numpy.lib.stride_tricks import as_strided as strided def get_sliding_window(df, W, return2D=0): a = df.values s0,s1 = a.strides m,n = a.shape out = strided(a,shape=(m-W+1,W,n),strides=(s0,s0,s1)) if return2D==1: return out.reshape(a.shape[0]-W+1,-1) else: return out 

Пример прогона для вывода 2D / 3D –

 In [68]: df Out[68]: AB 0 0.44 0.41 1 0.46 0.47 2 0.46 0.02 3 0.85 0.82 4 0.78 0.76 In [70]: get_sliding_window(df, 3,return2D=1) Out[70]: array([[ 0.44, 0.41, 0.46, 0.47, 0.46, 0.02], [ 0.46, 0.47, 0.46, 0.02, 0.85, 0.82], [ 0.46, 0.02, 0.85, 0.82, 0.78, 0.76]]) 

Вот как будет выглядеть вывод 3D-представлений –

 In [69]: get_sliding_window(df, 3,return2D=0) Out[69]: array([[[ 0.44, 0.41], [ 0.46, 0.47], [ 0.46, 0.02]], [[ 0.46, 0.47], [ 0.46, 0.02], [ 0.85, 0.82]], [[ 0.46, 0.02], [ 0.85, 0.82], [ 0.78, 0.76]]]) 

Пришло время для просмотра 3D для различных размеров окон –

 In [331]: df = pd.DataFrame(np.random.rand(1000, 3).round(2)) In [332]: %timeit get_3d_shfted_array(df,2) # @Yakym Pirozhenko's soln 10000 loops, best of 3: 47.9 µs per loop In [333]: %timeit get_sliding_window(df,2) 10000 loops, best of 3: 39.2 µs per loop In [334]: %timeit get_3d_shfted_array(df,5) # @Yakym Pirozhenko's soln 10000 loops, best of 3: 89.9 µs per loop In [335]: %timeit get_sliding_window(df,5) 10000 loops, best of 3: 39.4 µs per loop In [336]: %timeit get_3d_shfted_array(df,15) # @Yakym Pirozhenko's soln 1000 loops, best of 3: 258 µs per loop In [337]: %timeit get_sliding_window(df,15) 10000 loops, best of 3: 38.8 µs per loop 

Давайте проверим, что мы действительно получаем мнения –

 In [338]: np.may_share_memory(get_sliding_window(df,2), df.values) Out[338]: True 

Почти постоянные тайминги с get_sliding_window даже в разных размерах окна предполагают огромную выгоду от получения представления вместо копирования.

Отказ от ответственности:

Во-первых, я бы не назвал метод, который вы предоставляете неуклюжим. Он читается, и вы можете легко обобщить его со списком в любом размере окна. В то же время, это вопрос открытого типа, который может иметь множество решений, в том числе и ваших собственных.

/ Отказ от ответственности

Вот еще один метод, который, по моему мнению, подходит под ваше описание:

Используйте np.dstack для df.values . Одним из преимуществ существующего подхода является скорость строительства.

 import pandas as pd import numpy as np from io import StringIO df = pd.read_csv(StringIO( ''' ABC a 0.44 0.41 0.46 b 0.47 0.46 0.02 c 0.85 0.82 0.78 d 0.76 0.93 0.83 e 0.88 0.93 0.72 f 0.12 0.15 0.20 g 0.44 0.10 0.28 h 0.61 0.09 0.84 i 0.74 0.87 0.69 j 0.38 0.23 0.44 '''), sep=r' +') window = 2 def get_3d_shfted_array(df, window=window): rows = df.values res = np.dstack((rows[i:i-window] for i in range(window))) return res # 100000 loops, best of 3: 15.5 µs per loop res = get_3d_shfted_array(df) zero = res[...,0] one = res[...,1] # current method def get_multiindexed_array(df, window=window): return pd.concat([df, df.shift(-1)], axis=1, keys=[0, 1]).dropna() # 1000 loops, best of 3: 928 µs per loop 
  • Код Numba медленнее, чем чистый питон
  • Администратор Django меняет форму загрузки довольно медленно
  • Сравнение: import statement vs __import__ function
  • Это самый быстрый способ сгруппироваться в Пандах?
  • Быстрая библиотека ГИС-библиотеки python, которая поддерживает большое окружение и многоугольник
  • битовый массив python (исполнитель)
  • Неожиданная версия «Экспоненциально взвешенная скользящая средняя», эквивалентная pandas.ewm (). Mean ()
  • Сравнение производительности интерфейсов OpenCV-Python, cv и cv2
  • Быстрая замена на месте некоторых значений в массиве numpy
  • Разница между производительностью или стилем между «if» и «if not»?
  • Каков наилучший подход в python: несколько OR или IN в инструкции if?
  • Python - лучший язык программирования в мире.