当我运行一个dask滚动函数来计算移动平均值时,我得到了这个错误:
df['some_value'].rolling(10).mean()
错误:分区大小小于重叠窗口大小。请尝试使用"df. repartition"来增加分区大小。这是什么消息?为什么要求重新分区 Dataframe ?
i86rm4rw1#
产生这个错误是因为给定分区大小和滚动窗口,dask需要从多个分区获取数据来计算结果,原则上可以这样做,但是当前的dask.dataframe.rolling实现只支持从一个额外的分区获取信息。下面是一个例子:
dask.dataframe.rolling
from dask.datasets import timeseries df = timeseries(freq="1h") # each partition has 24 rows # this will work _ = df["x"].rolling(25).mean().compute() # this will not work _ = df["x"].rolling(26).mean().compute()
注意,这里每个分区有24行(每行代表一个小时),所以如果我们要求dask计算最后25个值的滚动平均值,那么对于第二个分区中的第一行,它将需要获得24个先前的值,这些值在单个分区中很方便。如果我们要求最后26个值的滚动平均值,那么对于第二个分区中的第一行,我们将需要获得之前的25个值:其中24个在前一个分区上,但还有一个在前一个分区上,所以这里dask会触发一个错误。为了避免这个错误,你需要使用足够小的窗口值或者足够大的分区。例如,如果我们重新划分 Dataframe ,使每个分区包含两倍的行数(因此将分区数减少2),上面的代码将不会触发错误:
new_df = df.repartition(npartitions=df.npartitions // 2) # this will work now _ = new_df["x"].rolling(26).mean().compute()
1条答案
按热度按时间i86rm4rw1#
产生这个错误是因为给定分区大小和滚动窗口,dask需要从多个分区获取数据来计算结果,原则上可以这样做,但是当前的
dask.dataframe.rolling
实现只支持从一个额外的分区获取信息。下面是一个例子:
注意,这里每个分区有24行(每行代表一个小时),所以如果我们要求dask计算最后25个值的滚动平均值,那么对于第二个分区中的第一行,它将需要获得24个先前的值,这些值在单个分区中很方便。
如果我们要求最后26个值的滚动平均值,那么对于第二个分区中的第一行,我们将需要获得之前的25个值:其中24个在前一个分区上,但还有一个在前一个分区上,所以这里dask会触发一个错误。
为了避免这个错误,你需要使用足够小的窗口值或者足够大的分区。例如,如果我们重新划分 Dataframe ,使每个分区包含两倍的行数(因此将分区数减少2),上面的代码将不会触发错误: