python - 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
解决方案
推荐阅读
- java - 如何使用方言“Mvel”检查流口水中的 if 语句值?
- reactjs - 无法将日期和时间传递到下一个屏幕反应原生
- mysql - 以毫秒为单位的 Mysql 插入
- django-models - 如何在 django 中合并两个模型
- python - scipy.interpolate.Rbf() 的插值不准确
- php - 提交后的 URL 重写问题
- android - RecyclerView 滚动混乱(在大位图存在的情况下)
- r - 两个具有缺失值的矩阵的叉积
- cs-cart - 如何将邮政编码查找到我的 cs-cart 地址表单以制作附加组件?
- javascript - 混合字符串和数字(地址)的Lodash排序