您的算法需要在每一步进行逻辑检查,这并不能真正转化为polar方法。你也许可以/也许可以用
cumulative_eval
但它指出它可能是O(n^2)。相反,您可以使用numba来编译一个ufunc,这将非常快。
运行一个需要两个(或多个)矢量输入的函数有点麻烦,但这绝对是可行的,而且你可以制作一个辅助表达式,这样更容易使用。一般来说,您必须将这些输入放入一个结构中,然后使用该结构作为输入。在创建结构时,helper函数会对字段进行别名,因为使用它们需要有它们的名称。
第一件事是使用numba的guvectorize装饰器创建ufunc,如下所示:
@nb.guvectorize([(nb.int64[:], nb.int64[:], nb.int64, nb.int64[:])], '(n),(n),()->(n)', nopython=True)
def effective_start(dur, arrival, num_workers, res):
workers = np.zeros(num_workers,dtype=np.int64)
for i in range(len(dur)):
next_avail = np.min(workers)
next_worker = np.where(workers==next_avail)[0][0]
res[i]=max(arrival[i], next_avail)
workers[next_worker]=res[i]+dur[i]
下一步是可选的,但它为ufunc创建了一个表达式包装器,您可以在
with_columns
或
select
def eff_start(dur, arrival, num_workers):
if isinstance(dur, str):
dur=pl.col(dur)
if isinstance(arrival, str):
arrival=pl.col(arrival)
return (
pl.struct(dur.alias('___dur'), arrival.alias('___arrival'))
.map_batches(
lambda x, num_workers = num_workers: (
effective_start(
x.struct.field('___dur'),
x.struct.field('___arrival'),
num_workers)
)
)
)
定义了这些函数后,您可以简单地执行
df.with_columns(
z=eff_start('servicing_time_requirement','arrival_time',2)
)
或者你甚至可以使用生成器一次获得所有的可能性
(df.with_columns(
eff_start('servicing_time_requirement','arrival_time',x).alias(f"workers={x}")
for x in range(1,df.shape[0]+1)
))
shape: (5, 8)
âââââââ¬ââââââââââââââââââ¬âââââââââââââââ¬ââââââââââââ¬ââââââââââââ¬ââââââââââââ¬ââââââââââââ¬ââââââââââââ
â id â servicing_time_ â arrival_time â workers=1 â workers=2 â workers=3 â workers=4 â workers=5 â
â --- â requirement â --- â --- â --- â --- â --- â --- â
â i64 â --- â i64 â i64 â i64 â i64 â i64 â i64 â
â â i64 â â â â â â â
âââââââªââââââââââââââââââªâââââââââââââââªââââââââââââªââââââââââââªââââââââââââªââââââââââââªââââââââââââ¡
â 1 â 20 â 0 â 0 â 0 â 0 â 0 â 0 â
â 2 â 3 â 15 â 20 â 15 â 15 â 15 â 15 â
â 3 â 8 â 16 â 23 â 18 â 16 â 16 â 16 â
â 4 â 30 â 25 â 31 â 25 â 25 â 25 â 25 â
â 5 â 5 â 30 â 61 â 30 â 30 â 30 â 30 â
âââââââ´ââââââââââââââââââ´âââââââââââââââ´ââââââââââââ´ââââââââââââ´ââââââââââââ´ââââââââââââ´ââââââââââââ