Сдвиг всех строк в кадре данных dask

В Pandas есть метод DataFrame.shift(n), который сдвигает содержимое массива на n строк относительно индекса аналогично np.roll(a, n). Кажется, я не могу найти способ заставить подобное поведение работать с Dask. Я понимаю, что такими вещами, как сдвиги строк, может быть сложно управлять с помощью системы Dask, разбитой на блоки, но я не знаю лучшего способа сравнить каждую строку с последующей.

Что я хотел бы сделать, так это:

import numpy as np
import pandas as pd
import dask.DataFrame as dd

with pd.HDFStore(path) as store:
    data = dd.from_hdf(store, 'sim')[col1]
    shifted = data.shift(1)

    idx = data.apply(np.sign) != shifted.apply(np.sign)

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


person TroyHurts    schedule 11.12.2015    source источник
comment
shifted = data.sign() != data.sign().shift() должно работать, а не использовать apply   -  person EdChum    schedule 11.12.2015
comment
Из проверки источника я почти уверен, что этот метод реализован только для массивов Dask, а не для фреймов данных.   -  person TroyHurts    schedule 14.12.2015


Ответы (2)


Прокатные функции

В настоящее время dask.dataframe не реализует операцию shift. Однако это возможно, если вы поднимете вопрос. В принципе, это не так уж сильно отличается от операций прокрутки, которые dask.dataframe поддерживает, например rolling_mean, rolling_sum и т. д.

На самом деле, если бы вам нужно было создать функцию Pandas, которая придерживается того же API, что и эти функции pandas.rolling_foo, то вы можете использовать функцию dask.dataframe.rolling.wrap_rolling, чтобы превратить функцию прокрутки в стиле панд в функцию прокрутки dask.dataframe.

dask.dataframe.rolling_sum = wrap_rolling(pandas.rolling_sum)
person MRocklin    schedule 11.12.2015
comment
Возможно ли это с объектом GroupBy? Попытка сделать что-то похожее на Troy выше, сгруппированное по индексу. Моя текущая apply, shift попытка мучительно медленная. - person kadrach; 09.03.2018

Следующий код может помочь сместить серию вниз.

s = dd_df['column'].rolling(window=2).sum() - dd_df['column']

Изменить (09.03.2019):

Когда вы прокручиваете и находите сумму для определенной строки,

result[i] = row[i-1] + row[i]

Затем, вычитая из результата старое значение столбца, вы выполняете следующую операцию:

final_row[i] = result[i] - row[i]

Что равно:

final_row[i] = row[i-1] + row[i] - row[i]

Что в конечном итоге приводит к тому, что весь столбец смещается вниз один раз.

Совет:

Если вы хотите сдвинуть его вниз на несколько строк, вам следует выполнить всю операцию снова столько раз с одним и тем же окном.

person Srinath Sridharan    schedule 26.08.2019
comment
Не могли бы вы добавить некоторые пояснения к вашему ответу? - person Tim Woocker; 26.08.2019