pandas Dask滚动功能失败,并显示重新分区 Dataframe 的消息

hec6srdp  于 2023-01-04  发布在  其他
关注(0)|答案(1)|浏览(155)

当我运行一个dask滚动函数来计算移动平均值时,我得到了这个错误:

df['some_value'].rolling(10).mean()

错误:
分区大小小于重叠窗口大小。请尝试使用"df. repartition"来增加分区大小。
这是什么消息?为什么要求重新分区 Dataframe ?

i86rm4rw

i86rm4rw1#

产生这个错误是因为给定分区大小和滚动窗口,dask需要从多个分区获取数据来计算结果,原则上可以这样做,但是当前的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()

相关问题