Một giải pháp thay thế sẽ là sử dụng công cụ dòng công việc dask. Mặc dù nó không thú vị về mặt cú pháp như ...
var
| do this
| then do that
... nó vẫn cho phép biến của bạn chảy xuống chuỗi và sử dụng dask mang lại lợi ích bổ sung của việc song song hóa nếu có thể.
Đây là cách tôi sử dụng dask để thực hiện mô hình chuỗi ống:
import dask
def a(foo):
return foo + 1
def b(foo):
return foo / 2
def c(foo,bar):
return foo + bar
workflow = {'a_task':(a,1),
'b_task':(b,'a_task',),
'c_task':(c,99,'b_task'),}
dask.get(workflow,'c_task')
Sau khi làm việc với elixir, tôi muốn sử dụng mô hình đường ống trong Python. Đây không phải là mẫu hoàn toàn giống nhau, nhưng nó tương tự và như tôi đã nói, đi kèm với các lợi ích bổ sung của song song; nếu bạn yêu cầu dask nhận một nhiệm vụ trong quy trình làm việc của bạn mà không phụ thuộc vào người khác chạy trước, chúng sẽ chạy song song.
Nếu bạn muốn cú pháp dễ dàng hơn, bạn có thể bọc nó trong một thứ gì đó sẽ giúp bạn đặt tên các tác vụ cho bạn. Tất nhiên trong tình huống này, bạn sẽ cần tất cả các hàm lấy đường ống dẫn làm đối số đầu tiên và bạn sẽ mất bất kỳ lợi ích nào của việc ghép song song. Nhưng nếu bạn đồng ý với điều đó, bạn có thể làm điều gì đó như sau:
def dask_pipe(initial_var, functions_args):
'''
call the dask_pipe with an init_var, and a list of functions
workflow, last_task = dask_pipe(initial_var, {function_1:[], function_2:[arg1, arg2]})
workflow, last_task = dask_pipe(initial_var, [function_1, function_2])
dask.get(workflow, last_task)
'''
workflow = {}
if isinstance(functions_args, list):
for ix, function in enumerate(functions_args):
if ix == 0:
workflow['task_' + str(ix)] = (function, initial_var)
else:
workflow['task_' + str(ix)] = (function, 'task_' + str(ix - 1))
return workflow, 'task_' + str(ix)
elif isinstance(functions_args, dict):
for ix, (function, args) in enumerate(functions_args.items()):
if ix == 0:
workflow['task_' + str(ix)] = (function, initial_var)
else:
workflow['task_' + str(ix)] = (function, 'task_' + str(ix - 1), *args )
return workflow, 'task_' + str(ix)
def foo(df):
return df[['a','b']]
def bar(df, s1, s2):
return df.columns.tolist() + [s1, s2]
def baz(df):
return df.columns.tolist()
import dask
import pandas as pd
df = pd.DataFrame({'a':[1,2,3],'b':[1,2,3],'c':[1,2,3]})
Bây giờ, với trình bao bọc này, bạn có thể tạo một đường dẫn theo một trong các mẫu cú pháp sau:
như thế này:
workflow, last_task = dask_pipe(df, [foo, baz])
print(dask.get(workflow, last_task))
workflow, last_task = dask_pipe(df, {foo:[], bar:['string1', 'string2']})
print(dask.get(workflow, last_task))
crime_by_state %>% filter(State=="New York", Year==2005) ...
phần cuối của How dplyr đã thay thế các thành ngữ R phổ biến nhất của tôi .