Как векторизовать процесс Dask Apply

У меня возникла ваша проблема, и вот мой ответ:

prices = [5, 12, 45]
list=['1','2','3']

for i in range(1,3):
  vars()["prices"+list[0]]=prices[0]
print ("prices[i]=" +prices[i])

, поэтому при печати:

price1 = 5 
price2 = 12
price3 = 45
1
задан Joseph Berry 18 March 2019 в 18:23
поделиться

1 ответ

Я запустил некоторый тест, и определенно попытайтесь использовать dd.Aggregation а не apply. посмотрите ниже результатов:

%%timeit
df = dask.datasets.timeseries()
df_gb = df.groupby(df.name)
gp_col = ['x','y' ,'id']
list_ser_gb = [df_gb[att_col_gr].apply(set_list_att2, 
                                           meta=pd.Series(dtype='object', name=f'{att_col_gr}_att'))
                   for att_col_gr in gp_col]
df_edge_att = df_gb.size().to_frame(name="Weight")
for ser in list_ser_gb:
        df_edge_att = df_edge_att.join(ser.to_frame(), how='left')        
df_edge_att.head()

результаты:
5 минимальных 44 В± 11,2 с на цикл (означают В± станд. dev. 7 выполнений, 1 цикл каждый)

Однако выполнение с dd.Aggregation существует значительное улучшение:

%%timeit
df = dask.datasets.timeseries()
custom_agg = dd.Aggregation(
    'custom_agg', 
    lambda s: s.apply(set), 
    lambda s: s.apply(lambda chunks: list(set(itertools.chain.from_iterable(chunks)))),
)
df_gb = df.groupby(df.name)
gp_col = ['x','y' ,'id']
list_ser_gb = [df_gb[att_col_gr].agg(custom_agg) for att_col_gr in gp_col]
df_edge_att = df_gb.size().to_frame(name="Weight")
for ser in list_ser_gb:
        df_edge_att = df_edge_att.join(ser.to_frame(), how='left')        
df_edge_att.head()

результаты:
2 минуты В± 1,13 с на цикл (означают В± станд. dev. 7 выполнений, 1 цикл каждый)

0
ответ дан Joseph Berry 18 March 2019 в 18:23
поделиться