$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$
大晦日ハッカソン2023の成果です。
はじめに
『Python実践機械学習システム100本ノック』をElixirで楽しんでみます。
会社の同僚がこの本で学んでいると聞いたので冬休みの宿題で私もやってみます。
100本中10本だけ進めました。
Elixirでもやってみたい衝動を抑えられませんでした。
Elixirでもやってみることでより理解が深まるだろうということでその記録を残しておきます。
What is Elixir ?
Elixirという素敵なプログラミング言語があるのですね。
その素敵具合は「Elixir Saves Pinterest $2 Million a Year In Server Costs」によく現れています。開発者も経営者もこの事実に瞠目することでしょう。 $2 Million/年の節約ですってよ!、奥さん。
準備
サポートページの「MLSys_100Knocks.zip」をダウンロードし、展開します。
Dockerコンテナからホスト(開発マシン)のファイルがみえるように次のコマンドでLivebookを起動します。
cd MLSys_100Knocks
docker run -p 8080:8080 -p 8081:8081 --pull always -u $(id -u):$(id -g) -v $(pwd):/data ghcr.io/livebook-dev/livebook
このコマンドは、公式ページのDockerの項に書いてあるコマンドそのままです。
Livebookを使うと、こんな感じでプログラミングができます。
Elixirでプログラミング
「Elixir pandas」でググると、 @RyoWakabayashi さんの記事が見つかりました。
ありがとうーーーーッ!!! ございます。私もパクリスペクトする感じです。
explorerを利用してみます。
以下、ノック10までのElixirの例です。
何をやっているのかは、『Python実践機械学習システム100本ノック』をお買い求めのうえご確認ください。
Mix.install([
{:explorer, "~> 0.7.0"}
])
require Explorer.DataFrame
current_dir = "/data/本章/1章"
file_path = fn file_name -> "#{current_dir}/#{file_name}" end
file_path.("output_data") |> File.mkdir_p!()
filename_order_data_csv = file_path.("output_data/order_data.csv")
m_store = file_path.("m_store.csv") |> Explorer.DataFrame.from_csv!()
m_area = file_path.("m_area.csv") |> Explorer.DataFrame.from_csv!()
files = File.ls!(current_dir)
|> Enum.filter(& String.contains?(&1, "tbl_order_"))
|> Enum.sort(:desc)
[haad_csv | _] = files
empty_df = file_path.(haad_csv) |> Explorer.DataFrame.from_csv!()
|> Explorer.DataFrame.slice(0, 0)
files
|> Enum.reduce(empty_df, fn csv, acc ->
df = file_path.(csv) |> Explorer.DataFrame.from_csv!()
Explorer.DataFrame.concat_rows(acc, df)
end)
|> Explorer.DataFrame.filter(store_id != 999)
|> Explorer.DataFrame.join(m_store, on: [:store_id], how: :left)
|> Explorer.DataFrame.join(m_area, on: [:area_cd], how: :left)
|> Explorer.DataFrame.mutate(takeout_name: if(takeout_flag == 0, do: "デリバリー"))
|> Explorer.DataFrame.mutate(takeout_name: if(takeout_flag == 1, do: "お持ち帰り", else: takeout_name))
|> Explorer.DataFrame.mutate(status_name: if(status == 0, do: "受付"))
|> Explorer.DataFrame.mutate(status_name: if(status == 1, do: "お支払い済", else: status_name))
|> Explorer.DataFrame.mutate(status_name: if(status == 2, do: "お渡し済", else: status_name))
|> Explorer.DataFrame.mutate(status_name: if(status == 9, do: "キャンセル", else: status_name))
|> Explorer.DataFrame.to_csv(filename_order_data_csv)
|>(パイプ演算子)が大活躍です。
こういうプログラムは、 Elixir が一番向いているようにおもいます。
Explorer.DataFrame.mutate/2の連発のところはもっと良い書き方があるかもしれません。
実はマクロのようで、無名関数を作って入れ込んでみたのですがうまく動きませんでした。もっとすっきり書くやり方がわかったら更新します。
empty_df
のマッチで、Explorer.DataFrame.slice(0, 0)
と書いているところももっと良い書き方があるかもしれません。
まあ、とにかくここで言いたいことは、 データ変換はElixirが向いています ということです。
大晦日ハッカソン2023
#大晦日ハッカソン まずは筋トレから。脳鍛。脳を鍛えるには運動しかない! https://t.co/MW5Al4uVTS
— TORIFUKU Kaiou (@torifukukaiou) December 31, 2023
#大晦日ハッカソン 『Python実践機械学習システム100本ノック』 1/100
— TORIFUKU Kaiou (@torifukukaiou) December 31, 2023
千里の道も一歩から。「踏み出せばその一足が道となり その一足が道となる 迷わず行けよ 行けばわかるさ ありがとうーーーーッ!!!」
Google Colaboratoryでやっております。
#大晦日ハッカソン 『Python実践機械学習システム100本ノック』 8/100。まずは10本までが一つの区切りのようです。9, 10を一旦眺めて、休憩に入ります。
— TORIFUKU Kaiou (@torifukukaiou) December 31, 2023
#大晦日ハッカソン 『Python実践機械学習システム100本ノック』 10/100。キリがいいので同じことをElixirでやってみます。
— TORIFUKU Kaiou (@torifukukaiou) December 31, 2023
#大晦日ハッカソン Qiita記事を書きました。 https://t.co/EVDnYfNcyY
— TORIFUKU Kaiou (@torifukukaiou) December 31, 2023
あとは紅白をみます。よいお年を〜
さいごに
『Python実践機械学習システム100本ノック』を学んでいます。
まだ10%の進捗です。冬休みの宿題で学びを深めたいと思っています(あくまでも「思っています」)。
Elixirでも書いてみたい衝動を抑えられずに、書いてみました。
|>(パイプ演算子)は最高でした。
人類は不老不死の霊薬を意味する素敵なプログラミング言語Elixirを手に入れました。並行処理を他のプログラミング言語よりも比較的容易に書くことができます。それはきっとコンピュータ資源を有効活用できることにつながるでしょう。巡り巡って世界平和に貢献できることでしょう。
さあ、そこのあなたもElixirの世界へようこそ。
手始めにエリクサーチなんていかがでしょうか。私のオススメです。
闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。
アドベントカレンダー2023は幕を閉じ、アドベントカレンダー2024が開幕です
$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$