Я не могу точно отразить эту проблему в заголовке. Я хочу использовать list
, func(*args)
и Pool.map
без ошибок. См. Ниже.
▼ Код
def df_parallelize_run(func, arguments):
p = Pool(psutil.cpu_count())
df = p.map(func, arguments)
p.close()
p.join()
return df
def make_lag(df: DataFrame, LAG_DAY: list):
for l in LAG_DAY:
df[f'lag{l}d'] = df.groupby(['id'])['target'].transform(lambda x: x.shift(l))
return df
def wrap_make_lag(args):
return make_lag(*args)
Учитывая три вышеупомянутые функции, я хочу выполнить следующие действия:
# df: DataFrame
arguments = (df, [1, 3, 7, 13, 16])
df = df_parallelize_run(wrap_make_lag, arguments)
▼ Ошибка
in df_parallelize_run(func, arguments)
----> 7 df = pool.map(func, arguments)
in ..../python3.7/multiprocessing/pool.py in map(self, func, iterable, chunksize)
--> 268 return self._map_async(func, iterable, mapstar, chunksize).get()
in ..../python3.7/multiprocessing/pool.py in get(self, timeout)
--> 657 raise self._value
TypeError: make_lag() takes 2 positional arguments but 5 were given
Я знаю причину этого несоответствия (из-за распаковки списка, [1, 3, 7, 13, 16]
, это 5). Как правильно делать? Если возможно, я хочу уместить этот список в пределах ограничений позиционных аргументов. Если это практически невозможно (list
или Pool.map
), что более подходящий, простой и гибкий способ?