首页 > 解决方案 > Pandas Dask:使用 groupby.apply 执行滚动求和时“ValueError:索引必须是单调的”

问题描述

我正在尝试对日期时间索引上的 dask 数据帧执行滚动求和。在 Dask 中, groupby.apply 似乎是最好的方法......当将分区数设置为 1 时代码工作正常,但随着我们增加分区而中断。感谢有关如何修复以下代码的建议。

我目前正在使用 Pandas 1.1.0 和 Dask 2.22.0。

from dask import dataframe as dd
import pandas as pd

# initialize dataframe
df = pd.DataFrame({"column1": range(600), 
                   "column2": range(600), 
                   "column3": range(600),
                   "column4": range(600),
                   'group': 3*['l'+str(i) for i in range(200)], 
                   'date':pd.date_range("20190101", periods=600)})

# set index to date for rolling window
df=df.set_index('date')

# create dask dataframe from pandas dataframe.
test_dd = dd.from_pandas(df, npartitions=5)

# function used in apply with rolling window on date index
def test_func(x):
    x['New_Col'] = x.rolling('3d')['column1'].sum()
    return x

# Metadata
m=pd.DataFrame().reindex_like(df)
m=m.reindex(columns=m.columns.tolist()+['New_Col'])

## dask groupby apply
test_dd.groupby('group').apply(test_func,meta=m).compute().head(10)

### Output
ValueError: index must be monotonic

但是代码在设置 npartitions=1 时有效

## Expected output (output when npartitions=1)

            idx  column1  column2  column3  column4 group  New_Col
date                                                              
2019-01-01    0        0        0        0        0    l0      0.0
2019-01-02    1        1        1        1        1    l1      1.0
2019-01-03    2        2        2        2        2    l2      2.0
2019-01-04    3        3        3        3        3    l3      3.0
2019-01-05    4        4        4        4        4    l4      4.0
2019-01-06    5        5        5        5        5    l5      5.0
2019-01-07    6        6        6        6        6    l6      6.0
2019-01-08    7        7        7        7        7    l7      7.0
2019-01-09    8        8        8        8        8    l8      8.0
2019-01-10    9        9        9        9        9    l9      9.0

编辑:我在这里附上了 dask 图的视觉效果。达克图

标签: pythonpandasdask

解决方案


推荐阅读