移动 dask 数据框中的所有行

Shifting all rows in dask dataframe

在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 数据框以进行绘图。

滚动函数

目前dask.dataframe does not implement the shift operation. It could though if you raise an issue。原则上,这与 dask.dataframe 支持的滚动操作没有太大区别,例如 rolling_meanrolling_sum 等。

实际上,如果您要创建一个与这些 pandas.rolling_foo 函数遵循相同 API 的 Pandas 函数,那么您可以使用 dask.dataframe.rolling.wrap_rolling 函数来转换您的 pandas 风格的滚动函数变成了 dask.dataframe 滚动函数。

dask.dataframe.rolling_sum = wrap_rolling(pandas.rolling_sum)

以下代码可能有助于下移系列。

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

编辑 (03/09/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]

这最终导致整个列向下移动一次。

提示:

如果你想将它向下移动多行,你实际上应该用相同的 window.

再次执行整个操作多次