データサイエンティストのメモ:小さなツールは大きい



ほとんどの場合、データサイエンティストの作業では、あるビューから別のビューにデータを転送し、集約し、同じ粒度に導き、データをクリーンアップし、データをロード、アンロード、分析、フォーマットして送信する必要があります(一般に、これも何らかの形式のデータです)。データには常に何か問題があり、すばやく前後に駆動する必要があります。何よりも、従来のUnixユーティリティと小さいながらも誇り高いツールがこれに役立ちます。今日は、それらについて説明します。



そして今日、私がそれらを使わなければならない例と状況を含む選択があります。ここと以下で説明するものはすべて実際の主観的な体験であり、もちろんそれはすべての人にとって異なりますが、おそらく誰かにとって役立つでしょう。



ツール-ツールを学ぶ-書かれたものはすべて主観的であり、個人的な経験のみに基づいています。それは私を助けました、多分それはあなたも助けるでしょう。



読み始める前に、kulkhatskersのためのゲームが進行中であることを思い出します。そこでは、なんとかお金を稼ぐことができます...


Zshとoh-my-zsh-これらすべての年の後にBashで!



今覚えているように、私は17歳で、Linuxをインストールしました。ターミナルとバッシュ。そしてどういうわけか、bashは常にプロセスの一部であり、ターミナルでの実際の作業を私に具体化してくれました。博士課程を卒業してから12年後、紹介文書のある会社に行き、初めてポピーに出会い、それに従うことにしました。



そして見よ!便利なフォルダナビゲーション、人間の自動補完、gitインジケータ、テーマ、プラグイン、pythonの仮想環境のサポートなど-今、私はターミナルに座っており、大喜びではありません!





通常はすべてを配置してoh-my-zshに移動するので、zshを配置します(実際、これは箱から出してすぐに機能し、プラグインやテーマなどのサポートが追加されたレシピのフォークアセンブリです)。あなたはここでそれを取ることができますまた、テーマを設定することもできます(たとえば)。ここにある可能性の優れたデモが。こちらの記事から引用。



パイプライン





最高の端末設計の1つはパイプラインです。簡単に言うと、あるコマンドの出力を別のコマンドの入力に接続することができます。これは、2日前に行っていたタスクから文字通り取得した単純なアプリケーション例です。



組み合わせの問題を解決するには、1つの言語で問題をシミュレートする必要がありました。すべてが端末から開始され、単純なアイコンを配置することで、テキストから完全に読み取れない形式で表示されました。 -接続された入力出力と作成されたフォーマットのサポート:



| python.py format.py



より興味深く日常的なタスクは、アップロードされたデータからいくつかのパラメータまたは特性を評価することです。原則として、これは、データを含むサーバー上の必要な値が適切に動作することを確認する一連のクイックチェックです-たとえば、パーサーとすべてのjsonファイルに収集された一意のグループの数を確認します-このパラメーターは、時間の経過とともに自然に適切に増加するはずです。



cat data/*groups* | jq .group | uniq | wc -l


それぞれについて詳しく説明しますが、一般的な考え方はすでに明確です。



  • cat-(concatenateの略)データ/フォルダーの名前に「group」という単語が含まれるファイルの内容を出力します
  • jq-jsonから「グループ」フィールドを削除します
  • uniq-一意のグループのみを残します
  • wc --- lスイッチを使用すると、行、つまりグループの数がカウントされます 


そして今、私たちはwcを詳しく見ていきます。



WCは、行や単語などを数えるための小さいながらも誇り高いユーティリティです。



wc-単純なキーを使用して、単語、行、文字、バイト、および最大行長をすばやく読み取ることができます。



  • —bytes
  • —chars
  • —words
  • —lines
  • —max-line-length
     

これは些細なことのようですが、信じられないほど頻繁に必要で便利であることがわかります。



毎日の使用で、収集したデータの量をすばやく見積もりましょう(ここでは、1行、1レコードです)。





詳細はこちら



Ack / grep



何千ものマニュアルや記事がそれらについて書かれていますが、私は言及せずにはいられません-彼らはパターンに従って常連と彼ら自身のクエリ言語でテキストを引き裂きます。一般に、ackの方が使いやすく、箱から出してすぐに使用できるように思われるので、次のようにします。



例:Pythonソースファイルで大文字と小文字を区別せずに(key -i)という単語(key“ -w”)ga2m(モデルタイプ)の出現をすばやく見つけます。 :





JQ-コマンドラインでjsonを解析します



ドキュメント



JQはjsonにとっては実にgrep / ackです(sedとawkのタッチがありますが、後者については後で説明します)-実際、コマンドラインのjsonとjson行の単純なパーサーですが、非常に便利な場合もあります-どういうわけかwikidataアーカイブを解析する必要がありましたbz2形式では、重量は約100GB、非圧縮で約0.5TBです。



いくつかのフィールド間の対応をそこから取り除く必要がありました。これは、CPUとメモリに実質的に負荷がかからないマシンで非常に簡単に実行されることが判明しました。これは、私が使用したコマンドそのものです。 



bzcat data/latest-all.json.bz2  | jq —stream 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")' | python3 scripts/post_process.py "output.csv"


すべてがストリームモードで機能していることがわかるので、必要なマッピングを作成したのは基本的にパイプライン全体でした。 



  • bzcatはアーカイブの一部を読み取り、jqを提供しました
  • -streamキーを指定したjqはすぐに結果を生成し、それをpythonでポストプロセッサに渡しました(最初の例と同じように)
  • 内部的には、ポストプロセッサは単純なステートマシンです


合計すると、ビッグデータ(0.5TB)でストリームモードで動作する複雑なパイプラインであり、大きなリソースはなく、単純なパイプラインといくつかのツールで構成されています。ゆっくりとチェックアウトすることをお勧めします。



fzf-ファジーファインダー



最も便利なこと(特に水泳の中で):ファイルをすばやく検索します。これは、大規模なプロジェクトに便利です。特に、ファイルが複数ある場合に便利です。原則として、大規模なプロジェクトでは、特定の単語でファイルをすばやく検索する必要があります。私は、いくつかの大規模なリポジトリを含む新しいプロジェクトに没頭しました。導入タスクとして、システムで利用可能な品揃えに1つの単純なモデルを追加する必要があり、迅速に行う必要がありました。 ga2mキーワードを使用してファイルを検索し、他の「コードブロック」と同様に作業します。どちらか一方をすばやく編集します。ここで、fzfが非常に役立ちます。





リポジトリ へのリンク



AWK



名前は、Aho、Weinberger、Kernighanの作成者の最初の文字に由来します:実際、テキストテーブルデータを処理するためのスクリプト言語-ファイルの各行に変換パターンを適用します。



原則として、これは、tsvの形式で手作業で組み立てられたデータセットを持っているなど、迅速な1回限りの変換に理想的です。 、およびプロセッサは入力としてjsonlを受け取り、ソースファイルにない追加の「テーマ」フィールドを期待していました(現在の計算にとって重要ではないいくつかのものに必要)-合計で、単純な1行が書き込まれました。



cat groups.tsv | awk '{ printf "{\"group\": \"%s\", \"theme\": \"manual\" }\n", $1  }' > group.jsonl




実際、彼はファイルを取り、各行を必要なフィールドでjsonでラップしました。チュートリアル



からのリンク



wget-用途の広いコマンドラインダウンローダー



定期的にスクリプトとパイプラインはどこかから何かをプルアップしてダウンロードする必要があります-そしてwgetは失敗しません:それはダウンロード、ログイン、プロキシ、クッキー、そしてhttp(s)の他にftpを行うことができます。ダウンロード中の



スイスナイフ



HSTR-人間の顔をした検索コマンド履歴



ommandhistory:hstr



定期的に、コマンド履歴で何かを検索する必要があります。



  • 「私はすでにそれをしなければなりませんでした」
  • 「Xはどのキーで始まりますか?」
  • 「しかし、この作品は再利用できます」


したがって、hstrが完全に機能する一方で、コマンド履歴を適切かつ便利に検索することは非常に重要です。







便利ですが含まれていません



最後に、私は有用なことに言及します-しかし、別の記事のトピックを引っ張って-見ることは有用です: 



  • Ssh + tmux + vim(neo、プラグインなど)
  • コマンドラインgit + gitフックの基本的な知識
  • Data pipeline construction make/just
  • Python virtual environments
  • Docker





All Articles