tags: 🔖DataScience 🔖Clojure
Overview
Clojureとデータサイエンスに関わるTopicsをまとめる.
Sciclojがまとめているライブラリページがよい. スターがついているのがおすすめとか. Clojureのライブラリはメンテされてなくて放置されているものもあるので最新の状況をチェックできるのはよい.
https://scicloj.github.io/docs/resources/libs/
Clojure: 統計処理/科学技術計算
どうも組込み関数だけだと何もないように見える. 簡単なのは自力で書くか, ライブラリをいれる. BigDecimalに気をつけること.
fastmathとkixi.statsが有力. fastmathはJavaの肩に載っていてkixi.statsは純粋なClojureなので速度はfastmathのほうが速い.
- fastmath: https://github.com/generateme/fastmath
- JavaやCを利用して高速で計算.
- kixi.stats:
- incanterに変わる優良株.
- incanter
- かつての定番. 解説記事もおおい.
- 2020で更新が止まっているのは気になる.
kixi.stats
https://github.com/MastodonC/kixi.stats
基本はtransduceと組み合わせ関数を呼び出す.
(->> [{:x 2} {:x 4} {:x 4} {:x 4} {:x 5} {:x 5} {:x 5} {:x 7} {:x 9}]
(transduce (map :x) standard-deviation))
(->> [{:x 1 :y 3} {:x 2 :y 2} {:x 3 :y 1}]
(transduce identity (correlation :x :y)))
cgrand/xformsと連携させるには, x/reduceに関数を渡す.
(def sd (x/reduce kixi/standard-deviation))
Java Appatch Commons Math Interop
java.lang.Mathに満足できない人のためのJava用の数学関数とユーティリティの最大のオープンソースライブラリ.
- Math – Commons Math: The Apache Commons Mathematics Library
- Apache Commons Math - Wikipedia
- Apache Commons Mathの紹介 - 開発者ドキュメント
- https://github.com/clojure-interop/apache-commons-math
📝Clojure データフレーム
📝Clojure: データ可視化
Clojure: データラングリング
- 📝malli: 要素単位の変換.
- 🔧cgrand/xforms
🔧noprompt/meander
Mapの構造を変換するツール. 数学の写像に近い. f(X)->Y.
meander: strategies/rewriting
ある要素を別の要素に置換する. 一般的には📝項書き換え(Term Rewriting)と呼ばれる手法のClojure実装.
数学の等式変形みたいに, 右辺と左辺を定義して相互変換するように機構.
- meander/strategies.md at epsilon · noprompt/meander · GitHub
- Introduction to Term Rewriting with Meander
📝libpython-clj
ClojureからPythonのライブラリを呼び出す. 🔖Python
- github: https://github.com/clj-python/libpython-clj
- doc: https://clj-python.github.io/libpython-clj/index.html
- examples
Hello libpython-clj
;; 初期化
(require '[libpython-clj2.python :as py])
(py/initialize!)
;; pritty print moduleの読み込み
(require '[libpython-clj2.require :refer [require-python]])
(require-python '[pprint :as pp])
(pp/pprint "Hello,World.")
Anaconda(miniconda)をつかうにはこう書く.
(py/initialize! :python-executable
"~/miniconda3/envs/bakuchi/bin/python3.10"
:library-path
"~/miniconda3/envs/bakuchi/lib/libpython3.10.so")
✅モジュールのimport
py/from-import をつかう.
(require '[libpython-clj2.python :as py])
(py/from-import scipy.optimize curve_fit)
Clojure JSON Format Interop
JUXT Blog - Clojure’s JSON ecosystem
cheshireかdata.jsonかな.
Clojure JSON Interop: Cheshire
ClojureでJSONを扱う際のデファクトスタンダード.
https://github.com/dakrone/cheshire
Clojure data.json
ClojureとJSONのやり取り.
https://github.com/clojure/data.json
(ns example
(:require [clojure.data.json :as json]))
(json/write-str {:a 1 :b 2})
;;=> "{\"a\":1,\"b\":2}"
(defn json-read-str [s]
(json/read-str s :key-fn keyword))
Clojure->Java JSON Introp: org.json.JSONObject
JSON in Java.
https://mvnrepository.com/artifact/org.json/json/20180813
JavaのライブラリにInputとしてJsonを渡すときとか.
(defn clj->java-json
"Clojure Map -> Java JSONObject"
[m]
(-> m
(cheshire/generate-string)
(JSONObject.)))
(defn java-json->clj
"Java JSONObject -> Clojure Map"
[obj]
(-> obj
.toString
cheshire/parse-string))
Clojure csv Interop
Libralies
🔧clojure.data.csv
clojure.data.csvが2022のデファクトスタンダードになっている(cljure-csv.coreは更新されてない).
-
JSONからcsvへの変換(json->csv or edn->csv)
APIから取得したJSONデータをcsvにdumpしたい場合.
ref. clojure - Convert collection of hash maps to a csv file - Stack Overflow
(require '[clojure.data.csv :as csv] '[clojure.java.io :as io]) (defn write-csv "Takes a file (path, name and extension) and csv-data (vector of vectors with all values) and writes csv file." [file csv-data] (with-open [writer (io/writer file)] (csv/write-csv writer csv-data))) (defn maps->csv-data "Takes a collection of maps and returns csv-data (vector of vectors with all values)." [maps] (let [columns (-> maps first keys) headers (mapv name columns) rows (mapv #(mapv % columns) maps)] (into [headers] rows))) (defn write-csv-from-maps "Takes a file (path, name and extension) and a collection of maps transforms data (vector of vectors with all values) writes csv file." [file maps] (->> maps maps->csv-data (write-csv file)))
-
先頭行がカラムのデータのMapへの変換(csv -> list of maps)
READMEより.
(defn csv-data->maps [csv-data] (map zipmap (->> (first csv-data) (map keyword) repeat) (rest csv-data)))
🔧scicloj/tablecloth
データセットライブラリ, tableclothの依存を許すならば.
Clojure Data Science Topics
💡Clojure: Jupyter Notebook連携
Clojureで📝文芸的プログラミングをするならば, 流派としてはJupyter Notebookを使う方法とorg-modeをつかう方法の2つがある. org-modeは Clojure: 文芸的プログラミング with org-babel にまとめるので, ここではJupyter Notebookのノウハウをまとめる.
Org-modeに慣れていなければclojpyter, 慣れていればOrg-mode. または共有を前提にするならば, clojpyter.
📝Jupyter NotebookをClojureでつかう.
Clojure Data Science Insights
✨若手Clojureのセールスポイントがデータ分析だった
Python前夜のClojureの誕生初期のセールスポイントはなんとデータ分析だった. Clojureにとってのデータ分析はお笑い芸人の若手のときに売れた一発ギャグなのである. オリエンタルラジオの武勇伝なのである.
2011年のアンケートでは, Clojureをつかう理由の第2位はData Science(42%). しかし, 2019年にはそれも1/2まで落ちた. これはもちろんPythonの圧倒的な人気と良質な書籍とエコシステムにRも含めて淘汰されたから.
✨DataframeやCSVとはList of Mapsにすぎない
Clojureやるまで気づかなかった.
そうか, 🔖CSVとは, 単純にマップのリストか.
もっといえば, 🔖DataframeもList of mapsに過ぎない.
🌱機械学習の7割8割が前処理ならばデータを変幻自在に操るClojureの力は強い
Clojureの強いところは文法そのものの強さ.
💡preferring to build a large library of functions on a small set of types
Clojureは文法そのもののが素でマッチョなのだ. さらに, ここにREPLの力が加わる.
💭REPLがない時代にどうやって人類とわたしはプログラミングをしていたのか忘れた
さらに, スクレイピングにも優位性がある.
これらの条件が合わさったとき, 機械学習の前処理には強力な力を発揮するような予感がしている. 昔, 機械学習を勉強していたとき, ある人が, 実務ではxgboostとかlightgbmとかじゃなくてランダムフォレスト程度が一番使い勝手がいいんだよといっていた. 最先端のライブラリはPythonに比べればClojureは弱いかもしれないが, その問題も実践ではどうだろうか.
Clojureがなかなか普及しないのは, プロダクト開発で採用するとなると, 5年以上をメンテナンスし続ける必要があり, そのためにはClojureをメンテナンスできる人を組織でつねに保ち続ける必要がある. だから, RubyやPythonやJavaScriptのほうを選ぶ. 保守性において, ある人がClojureで開発してもその人が5年後もメンテしてくれない.
一方, データサイエンスは, コードは途中結果であり, 最終的にはデータを通じて意思決定をするためなので, メンテナンスとか必要ないのだ. ここにClojureとDSの相性の良さがある.
- ref. 📝Clojure データ前処理
- tags: 🌳データ分析 🌳Clojure
レコードデータを見やすく見るには?
表形式のレコードデータを見やすく見るには?
最も簡単なのは, clojure.pprint/print-table. REPLに結果を整理して出力.
clojure.core: tapと組み合わせた, Portalをつかうとブラウザでも表がみやすい. 遅延読み込みなので大きなデータも安心.
🔗References
Scicloj
ClojureでData Scienceをする人たちのコミュニティ.
定期的にyoutubeで勉強会動画がアップロードされているよう.
- visual-tools: データ可視化のための勉強会.
- data-recur: データラングリングの勉強会.
ds4clj
2022秋より始動するSciclojバックアップのもとのオンラインコース. 毎月コンテンツ更新.
ds4clj: a data science course for Clojure devs - Scicloj
Talks
- Machine Learning and Data Science in Clojure: Presented by Aria Haghighi - YouTube
- 2019年にDSコミュニティで行われたClojureによるデータサイエンス紹介.
- PythonとClojureのライブラリ比較がされている.