首页 > 解决方案 > dask_dataframe.compute() 是否需要执行

问题描述

我正在进行时间序列分析。我有一个约 6 亿行的 dask 数据框。我正在使用以下函数创建日期时间功能,

def get_date_features(data):
    # generate date features
    data['year'] = data['date'].dt.year
    data['quarter'] = data['date'].dt.quarter
    data['month'] = data['date'].dt.month
    data['day'] = data['date'].dt.day
    data['weekday'] = data['date'].dt.weekday
    data['is_monthend'] = data['date'].dt.is_month_end * 1
    data['is_monthstart'] = data['date'].dt.is_month_start * 1
    data['is_quarterend'] = data['date'].dt.is_quarter_end * 1
    data['is_quarterstart'] = data['date'].dt.is_quarter_start * 1
    data['is_yearend'] = data['date'].dt.is_year_end * 1
    data['is_yearstart'] = data['date'].dt.is_year_start * 1
    data['dayofyear'] = data['date'].dt.dayofyear
    data['weekofyear'] = data['date'].dt.weekofyear
    data['daysinmonth'] = data['date'].dt.days_in_month

    return data

data = get_date_features(data)

然后更改数据类型

cols = ['quarter', 'month', 'day','weekofyear', 'daysinmonth',
       'weekday', 'is_monthend', 'is_monthstart', 'is_quarterend',
       'is_quarterstart', 'is_yearend', 'is_yearstart', 'dayofyear'
       ]

for col in cols:
    data[col] = data[col].astype(np.uint8)

for col in ['year']:
    data[col] = data[col].astype(np.uint16)

当我检查 dtypes 时print(data.dtypes),我可以看到它们已转换,

year                       uint16
quarter                     uint8
month                       uint8
day                         uint8
weekday                     uint8
is_monthend                 uint8
is_monthstart               uint8
is_quarterend               uint8
is_quarterstart             uint8
is_yearend                  uint8
is_yearstart                uint8
dayofyear                   uint8
weekofyear                  uint8
daysinmonth                 uint8

当我运行data.visualize()查看 dask 计算的并行化计划时,代码运行了一个多小时,我已经中止了它。我尝试运行data=data.compute(),由于内存不足错误而中止。

我正在使用 16GB 内存。data.compute()在步骤之前占用了 ~2GB 的 RAM

执行时data.head(),我可以看到前 5 行具有日期时间提取的特征,但data.shape.compute()返回错误,'tuple' object has no attribute 'compute'

有没有必要跑到data.compute()这里。此外,当我在此过程之后尝试merge另一个数据帧(或)尝试生成滞后和分组特征时,执行因内存不足错误而中止。

dask是解决我的问题的正确工具,还是有任何其他 python 包可以帮助我解决这个问题?

另外,有没有办法在不增加 RAM 配置的情况下解决这个问题?非常感谢任何帮助/指导。

标签: python-3.xdask

解决方案


.visualize方法使用 graphviz 库进行可视化。该库很慢,并且在数百个任务之外无法正常工作。

调用.compute您的数据框会将整个结果作为单个熊猫数据框返回到内存中。如果您的数据太大,那么这将填满您的内存。也许您想使用类似to_csvor的方法将结果存储到磁盘to_parquet


推荐阅读