自動化データワークを作る


私は40以上の生産性を維持できると思うのが好きです.Make 今年は43です、そして、それはまだ私のデータクリーニングやデータ分析を自動化するための選択の私のツールです.それは多彩で美しくシンプルです.(当初)それでもin a recent survey , 我々は、データの精通したエコノミストの5パーセント未満が定期的に作るのを発見しました.

何ができますか.
ほとんどのビルドシステムは、物事を構築するためのものです.Java、Cなどのコードをコンパイルします.makeはそれを行うことになっています、そして、ほとんどのチュートリアルとスタックオーバーの質問はCコードを構築する方法に関する例を特徴とします.
しかし、その非常に基本的に、makeは本当に美しく簡単です.テキストファイルを作成するMakefile 以下の内容で私のフォルダで.
clean_data.csv: raw_data.csv data_cleaner.py
    python data_cleaner.py
じゃあmake シェルで作成しますclean_data.csv からraw_data.csv .
言い換えれば、私は指定する必要があります
target: source
    recipe
とmakeは私のためのレシピを実行します.
この情報は私のドキュメントに注意したいものです.私のスクリプトは何を必要としますか?私はMakefileにそれを置くかもしれません.
このように、データワークのチェーンをリンクできます.
visualization.pdf: clean_data.csv visualize.py
    python visualize.py
clean_data.csv: raw_data.csv data_cleaner.py
    python data_cleaner.py
入るとmake シェルでは、私は私を得ますvisualization.pdf 生のデータから右に再現.

Order matters here. Typing make without any arguments recreates the first target found in the file called Makefile. I can also type make clean_data.csv if I want to recreate a specific target.



必要なだけを行う
私が私のグラフの色が好きでないと仮定して、編集することに決めてくださいvisualize.py . しかし、データのクリーニング時間がかかる!If clean_data.csv は既に最新のものであるraw_data.csv and data_cleaner.py ), メイクは、その手順をスキップし、のみ可視化のレシピをやり直します.
すべてを再実行する必要はありません.怠惰は良い.あなたが書くことを望むもう一つの理由.

変数と関数
あなたの最初のいくつかの簡単なMakefileの力を感じるとすぐに、あなたはもっと切望します.これはできますか.できるかな?答えははい、そうすることができますが、それはstackoverflowの検索をたくさんかかります.
私が定期的に使用する1つの機能は自動変数です.私のきちんとしたPythonスクリプトにハードコードファイル名を使いたくないならば、私は目標とソースの名前を変数として渡すことができます.
clean_data.csv: raw_data.csv data_cleaner.py
    python data_cleaner.py < $< > $@
このパスraw_data.csv 変数$< の最初のソースファイルを参照してくださいdata_cleaner.py と出力をstdoutclean_data.csv 変数$@ を指定します.
なぜこれらのシンボル?私に聞くな.彼らはきれいに見えないが、彼らは仕事を得る.
私も使うことができますfunctions ライク
clean_data.csv: input/complicated-path/raw_data.csv data_cleaner.py
    python data_cleaner.py $(basename $(notdir $@)) 
そして、より多く.

並列実行
そして今、最良の部分.makeは並列にジョブを実行できます.うまく装備されたAWSサーバーでは、喜んで起動make -j60 60スレッドでタスクを行うには.ジョブスケジューラとして機能します.何が何に依存しているかを知っているので、レースコンディションにはならない.
  • Knock, knock.
  • Race condition.
  • Who's there?

平行した実行は、私が上記のようなレシピの線形鎖を持っているならば、助けません.しかし、依存ブランチを並列ブランチに分割することができれば、正しい順序で実行されます.
それで、私のデータが2(またはより多く)に分裂すると仮定してください.次のコードは、データクリーニングレシピの並列実行を可能にします.
visualization.pdf: merged_data.csv visualize.py
    python visualize.py
merged_data.csv: clean_data_1.csv clean_data_2.csv merge_data.py
    python merge_data.py
clean_data_%.csv: raw_data_%.csv data_cleaner.py
    python data_cleaner.py < $< > $@
パターンマッチング文字を使いました% 両方に合わせるclean_data_1.csv and clean_data_2.csv .
オプションでmakeを呼び出すj , make -j2 データをきれいにする2つのプロセスを開始します.両方が終了すると、マージデータのレシピを実行し、可視化.(これらはシングルスレッドです).
私は定期的にモンテカルロシミュレーションを行うか、ブートストラップサンプルを描画する並列実行を使用します.たとえ私が500の並列タスクと40のプロセッサだけであっても.make -j40 これらのタスクで根気よく離れて磨きます.そして、もし私が誰かに週末にMATLABを走らせるように仕事を殺すならば(なぜ彼らはそうしますか?)私は月曜日に行くだけで460のタスクを月曜日に再起動することができます.

  • Simple real-world Makefile 変数とループを使用します.

  • Not-so simple Makefile 変数、ループ、関数、およびパターンマッチングの場合.
  • まだ作るのが好きでない人々?$< $@ それら.
    もともと投稿