5

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

4

2 回答 2

1

滚动函数

目前dask.dataframe没有实现该shift操作。如果您提出问题,它可能会。原则上,这与 dask.dataframe支持的滚动操作没有太大区别,比如,rolling_meanrolling_sum

实际上,如果您要创建一个与这些函数遵循相同 API 的 Pandas 函数,pandas.rolling_foo那么您可以使用该dask.dataframe.rolling.wrap_rolling函数将您的 pandas 样式的滚动函数转换为dask.dataframe滚动函数。

dask.dataframe.rolling_sum = wrap_rolling(pandas.rolling_sum)
于 2015-12-11T15:03:12.053 回答
0

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

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

编辑(2019 年 3 月 9 日):

当您滚动并找到特定行的总和时,

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

然后通过从结果中减去该列的旧值,您正在执行以下操作:

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

等于:

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

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

提示:

如果要将其向下移动多行,则实际上应该使用同一窗口再次执行整个操作多次。

于 2019-08-26T13:44:24.050 回答