AttributeError:“系列”对象在Dask中没有属性“列”

时间:2019-05-14 12:50:49

标签: python pandas parallel-processing dask

我有一个函数应该应用于某些数据框以进行一些计算。由于数据框很大,目的是加快计算速度,因此我决定选择Dask进行并行熊猫处理

我有以下代码: https://pastebin.com/Zh672Wei

主要问题在于以下几行:

crosses_data.apply((lambda row: calculate_vwap(row[0], row[1], row[2], vwap_data, row.name)), axis=1)

上面的代码有效。 相同的代码,但用dask并行化失败,并显示错误“系列”对象没有属性“列”:

dd.from_pandas(crosses_data,npartitions=4).map_partitions(
      lambda df : df.apply((lambda row: calculate_vwap(row[0], row[1], row[2], vwap_data, row.name)), axis=1)).\
   compute(scheduler=get)

我使用了正式文档进行搜索,现在这个错误确实很有意义。

1 个答案:

答案 0 :(得分:0)

可能是某种魔术,但是解决方案如下: compute_vwap函数应具有touple作为输出:

def calculate_vwap(ric_id, interval_start, interval_finish, vwap_data, row_n):
    some_tmp_vwap_interval_data = \
        vwap_data.query(
            'TKER == @ric_id and interval > @interval_start and interval < '
            '@interval_finish '
        )[['IVWP', 'INTV']]
    if sum(some_tmp_vwap_interval_data['INTV']):
        return \
            sum(
                vwap * volume for vwap, volume in
                zip(some_tmp_vwap_interval_data['IVWP'],
                    some_tmp_vwap_interval_data['INTV'])
            ) \
            / sum(some_tmp_vwap_interval_data['INTV']), \
            some_tmp_vwap_interval_data.IVWP.iloc[0], \
            some_tmp_vwap_interval_data.IVWP.iloc[-1], \
            some_tmp_vwap_interval_data.INTV.sum()

    return None

之后,此输出应转换为数据框:

pd.DataFrame(
                dd.from_pandas(crosses_data[[
                    'RIC', 'Interval_Start_Human',
                    'Interval_End_Human']],
                               npartitions=int(partitions_number)).
                map_partitions(
                    lambda df: df.apply((
                        lambda row: calculate_vwap(row[0],
                                                   row[1],
                                                   row[2],
                                                   vwap_data,
                                                   row.name)),
                                        axis=1)).
                compute(scheduler=get).values.tolist())