代替ソリューションの1つは、ワークフローツールdaskを使用することです。構文的にはそれほど楽しいものではありませんが...
var
| do this
| then do that
...それでも変数がチェーンを流れることができ、daskを使用すると、可能な場合は並列化の追加の利点が得られます。
daskを使用してパイプチェーンパターンを作成する方法は次のとおりです。
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')
elixirを使用した後、Pythonでパイピングパターンを使用したいと思いました。これは完全に同じパターンではありませんが、類似しており、私が言ったように、並列化の追加の利点があります。daskに、最初に実行する他のタスクに依存しないワークフロー内のタスクを取得するように指示すると、それらは並行して実行されます。
より簡単な構文が必要な場合は、タスクの命名を処理するものでラップすることができます。もちろん、この状況では、パイプを最初の引数として使用するためにすべての関数が必要になり、並列化の利点が失われます。しかし、それでよければ、次のようなことができます。
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]})
これで、このラッパーを使用して、次の構文パターンのいずれかに従ってパイプを作成できます。
このような:
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) ...
年末からdplyrは私の最も一般的なRイディオムを置き換える方法。