【前半51問】データサイエンス100本ノック(構造化データ加工編)

2020/06/24

UNIXコマンド

t f B! P L

The-Japan-DataScientist-Society/100knocks-preprocess: データサイエンス100本ノック(構造化データ加工編)シェルスクリプトで解きました。前編では前半の51問を解いています。
 
完全な成果物は
https://gitlab.com/youmounlp/prepro100
にあげているので、ここでは特に詰まった問題などについてコメントしていきます。
 
なんとかUNIXコマンドのみで解いた、というだけなので、ふつうに答え間違ってるとか、どう考えてもPython使ったほうがいい問題とか、色々あると思います。

条件など

  • ワンライナー
  • ただしどうしてもと言うならバックスラッシュで改行しても良いとする。
  • ただしどうしてもと言うならawkを使って手続き型プログラミングのような解き方をしても良いとする。

シェルスクリプトは可視化に弱いので、実際は最初からJupyterLabでやるほうが便利でしょう。

ただPythonで読み込む前にlswcheadなどはよく使うので多少コマンドになれておくとよいと思われます。

環境構築

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で対応はできるが入れ子が深くなるとしんどい
  • 組み込み関数: 分散とか組み込み関数で求めてくれないとしんどい

たいていの高級言語は関数型言語りすぺくと?でmapfilterがふつうに使えるし、あれはシェルコマンドのパイプに近いので、同じ感覚でかける。
 
最初にセパレータをカンマから半角スペースに変えとけばよかった気がしなくもない。
 
@youmounlp

ラベル

QooQ