我有一个函数应该应用于某些数据框以进行一些计算。由于数据框很大,目的是加快计算速度,因此我决定选择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)
我使用了正式文档进行搜索,现在这个错误确实很有意义。
答案 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())