The-Japan-DataScientist-Society/100knocks-preprocess: データサイエンス100本ノック(構造化データ加工編)をシェルスクリプトで解きました。前編では前半の51問を解いています。
完全な成果物は
https://gitlab.com/youmounlp/prepro100
にあげているので、ここでは特に詰まった問題などについてコメントしていきます。
なんとかUNIXコマンドのみで解いた、というだけなので、ふつうに答え間違ってるとか、どう考えてもPython使ったほうがいい問題とか、色々あると思います。
条件など
- ワンライナー
- ただしどうしてもと言うならバックスラッシュで改行しても良いとする。
- ただしどうしてもと言うならawkを使って手続き型プログラミングのような解き方をしても良いとする。
シェルスクリプトは可視化に弱いので、実際は最初からJupyterLabでやるほうが便利でしょう。
ただPythonで読み込む前にls
、wc
、head
などはよく使うので多少コマンドになれておくとよいと思われます。
環境構築
gitlabのREADMEにまとめてあります。
問題文は
100knocks-preprocess/preprocess_knock_Python.ipynb at master · The-Japan-DataScientist-Society/100knocks-preprocess
をブラウザで開きながら見ることにします。
コメント
よく忘れるのでオプションの意味もメモしておきます。また、勉強のため既出の解答と違う書き方をしているコマンドもあります。
P-002
早くもawkを使ってしまう。
(awk) -F
でセパレータ指定。
P-006
早くもif文を使ってしまう。
P-008
product_cd = P071401019ある…?
P-017
sortが初出。並び替えはsortコマンドを使おう。
(sort) -t
でセパレータ指定、-k
でソートキー列指定。
P-018
ここまでで一番プログラミングっぽくなってしまう。
P-020
行番号をふるだけでOK。
P-021
唐突に簡単になるのすき。
P-022
cutとuniqが初出。
(cut) -d
でセパレータ指定、-f
で抽出する列指定(カンマ区切り)。
(uniq) -c
で重複件数表示。
P-023
コマンドでGROUP BYはできないと言われるが、実はuniqとxargsなどを使えばそれっぽいことはできる。
が、かなり遅いし、結局SUMにはawkが必要なので、GROUP BYの段階からawk(の連想配列)を使うのが吉。
しかし、プログラミングっぽくなってしまう。
P-026
diffコマンドを使いたいがために、断腸の思いでワンライナーを妥協する(※改行しなくてもワンライナーで書けます。可読性のため)。
前半の最高傑作感がある。
(diff) -y
で左右に並べて表示。
P-028
メジアン。あらかじめID順かつ売上金順にソートしておくと、中央値、四分位数でもひとつの配列を使いまわすだけで解決できる。
P-029
モード。プログラミングっぽくなってしまう。
P-030
分散。平均を求めてからでないといけないのがつらい。が全体平均なら組み込み行カウント変数NRが使える。
P-036
joinが初出。テーブル結合はjoinコマンドを使おう。実はここでCRLFに気づいた。
(join) -t
でセパレータ指定、-1
、-2
でテーブル1,2の結合キー指定、-a
で外部結合風、-e
で欠損値のデフォルト値指定、ただし-o auto
と併用する。
P-043
多次元配列も使える。gawkならね。とはいえクロス集計表さすがに業務範囲外感がある。
P-045
csv上はYYYY-MM-DDが日付型でYYYYMMDDが数値型なっぽい。
前半の感想
Jupyterよりもインタラクティブ性は高いので、短めのコマンドで通る処理なら実用性は高い。
ただし、いくつか弱点もある。
- 一時変数: ワンライナーで書くのがしんどい
- 条件分岐: awkで対応はできるが入れ子が深くなるとしんどい
- 組み込み関数: 分散とか組み込み関数で求めてくれないとしんどい
たいていの高級言語は関数型言語りすぺくと?でmap
やfilter
がふつうに使えるし、あれはシェルコマンドのパイプに近いので、同じ感覚でかける。
最初にセパレータをカンマから半角スペースに変えとけばよかった気がしなくもない。
@youmounlp
0 件のコメント:
コメントを投稿