如何在python中包装列表函数?

如何在python中包装列表函数?,python,pandas,multiprocessing,argument-unpacking,Python,Pandas,Multiprocessing,Argument Unpacking,我无法准确地将这个问题反映到标题中。 我想使用list、func(*args)和Pool.map而不出错。 请看下面 ▼代码 鉴于以上三个功能,我想做以下几点 # df: DataFrame arguments = (df, [1, 3, 7, 13, 16]) df = df_parallelize_run(wrap_make_lag, arguments) ▼ 错误 我知道这种不匹配的原因(由于打开列表,[1,3,7,13,16],即5)。 如何做好?如果可能的话,我想在位置参数的约束范围

我无法准确地将这个问题反映到标题中。 我想使用
list
func(*args)
Pool.map
而不出错。 请看下面

▼代码 鉴于以上三个功能,我想做以下几点

# df: DataFrame
arguments = (df, [1, 3, 7, 13, 16])
df = df_parallelize_run(wrap_make_lag, arguments)
▼ 错误 我知道这种不匹配的原因(由于打开列表,
[1,3,7,13,16]
,即5)。
如何做好?如果可能的话,我想在位置参数的约束范围内调整这个列表。如果这几乎是不可能的(
list
Pool.map
),有什么更合适、更简单、更灵活的方法?

使用
Pool.starmap
。为函数的参数生成元组列表。这里,df看起来每次都是相同的,arg是参数中的每个元素

arglist = [(df, arg) for arg in arguments]
with multiprocessing.Pool(multiprocessing.cpu_count()) as p:
    results = p.starmap(make_lag, arglist)


解决了。我用下面的方式重新写了一遍

▼功能 其他功能

def make_lag_roll(df, lag, roll):
    col_name = f'lag{lag}_roll_mean_{roll}'
    df[col_name] = df.groupby(['id'])['target'].transform(lambda x: x.shift(lag).rolling(roll).mean())

    return df[[col_name]]
▼如何使用
# 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
arglist = [(df, arg) for arg in arguments]
with multiprocessing.Pool(multiprocessing.cpu_count()) as p:
    results = p.starmap(make_lag, arglist)

def df_parallelize_run(func, arglist):    
    with Pool(psutil.cpu_count()) as p:
        # concat((lots of returned df))
        results = pd.concat(p.starmap(func, arglist), 1)
    return results
def make_lag(df, lag):
    if not isinstance(lag, list):
        lag = [lag]

    # it doesn't have to be for-loop when you use multiprocessing
    for l in lag:
        col_name = f'lag{l}d'
        df[col_name] = df.groupby(['item_id', 'store_id'])['sales'].transform(lambda x: x.shift(l))

    return df[[col_name]]
def make_lag_roll(df, lag, roll):
    col_name = f'lag{lag}_roll_mean_{roll}'
    df[col_name] = df.groupby(['id'])['target'].transform(lambda x: x.shift(lag).rolling(roll).mean())

    return df[[col_name]]
arglist =  [(df[['id', 'target']], arg) for arg in range(1, 36)]

lag_df = df_parallelize_run(make_lag, arglist)
arglist_roll = [(df[['id', 'target']], lag, roll)
               for lag in range(1, 36)
               for roll in [7, 14, 28]]

lag_roll_df = df_parallelize_run(make_lag_roll, arglist_roll)