これは並列処理への私の最初のベンチャーであり、Daskを検討していましたが、実際にコーディングするのに苦労しています。
私は彼らの例とドキュメントを見てきましたが、dask.delayedが最適だと思います。関数をdelay(function_name)でラップするか、@ delayedデコレータを追加しようとしましたが、正しく機能していないようです。他のメソッドよりもDaskの方がpythonで作成されており、その(想定される)単純さのために。)daskはforループでは機能しないことを知っていますが、 。
私のコードは、他の関数への入力を含む関数を介してファイルを渡し、次のようになります。
from dask import delayed
filenames = ['1.csv', '2.csv', '3.csv', etc. etc. ]
for count, name in enumerate(filenames)"
name = name.split('.')[0]
....
次にいくつかの前処理を行いますex:
preprocess1, preprocess2 = delayed(read_files_and_do_some_stuff)(name)
次に、コンストラクターを呼び出して、関数呼び出しにpre_resultsを渡します。
fc = FunctionCalls()
Daily = delayed(fc.function_runs)(filename=name, stringinput='Daily',
input_data=pre_result1, model1=pre_result2)
ここで行うことは、ファイルをforループに渡し、いくつかの前処理を行ってから、ファイルを2つのモデルに渡します。
これを並列化する方法についての考えやヒントはありますか?奇妙なエラーが発生し始め、コードを修正する方法がわかりませんでした。コードはそのまま機能します。私はpandasデータフレーム、シリーズ、およびnumpy配列の束を使用します。dask.dataframesなどで動作するように戻ってすべてを変更したくないです。
私のコメントのコードは読みにくいかもしれません。ここでは、よりフォーマットされた方法です。
以下のコードでは、print(mean_squared_error)と入力すると、単にDelayed( 'mean_squared_error-3009ec00-7ff5-4865-8338-1fec3f9ed138')が表示されます。
from dask import delayed
import pandas as pd
from sklearn.metrics import mean_squared_error as mse
filenames = ['file1.csv']
for count, name in enumerate(filenames):
file1 = pd.read_csv(name)
df = pd.DataFrame(file1)
prediction = df['Close'][:-1]
observed = df['Close'][1:]
mean_squared_error = delayed(mse)(observed, prediction)
最終的に結果を計算するには、dask.computeを呼び出す必要があります。 dask.delayed documentation を参照してください。
import pandas as pd
from sklearn.metrics import mean_squared_error as mse
filenames = [...]
results = []
for count, name in enumerate(filenames):
file1 = pd.read_csv(name)
df = pd.DataFrame(file1) # isn't this already a dataframe?
prediction = df['Close'][:-1]
observed = df['Close'][1:]
mean_squared_error = mse(observed, prediction)
results.append(mean_squared_error)
import dask
import pandas as pd
from sklearn.metrics import mean_squared_error as mse
filenames = [...]
delayed_results = []
for count, name in enumerate(filenames):
df = dask.delayed(pd.read_csv)(name)
prediction = df['Close'][:-1]
observed = df['Close'][1:]
mean_squared_error = dask.delayed(mse)(observed, prediction)
delayed_results.append(mean_squared_error)
results = dask.compute(*delayed_results)
このスニペットは、受け入れられている答えよりもはるかに明確なソリューション、IMOです。
from dask import compute, delayed
import pandas as pd
from sklearn.metrics import mean_squared_error as mse
filenames = [...]
def compute_mse(file_name):
df = pd.read_csv(file_name)
prediction = df['Close'][:-1]
observed = df['Close'][1:]
return mse(observed, prediction)
delayed_results = [delayed(compute_mse)(file_name) for file_name in filenames]
mean_squared_errors = compute(*delayed_results, scheduler="processes")