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用の数学関数とユーティリティの最大のオープンソースライブラリ.

📝Clojure データフレーム

📝Clojure: データ可視化

Clojure: データラングリング

🔖DataWranging

🔧noprompt/meander

Mapの構造を変換するツール. 数学の写像に近い. f(X)->Y.

meander: strategies/rewriting

ある要素を別の要素に置換する. 一般的には📝項書き換え(Term Rewriting)と呼ばれる手法のClojure実装.

数学の等式変形みたいに, 右辺と左辺を定義して相互変換するように機構.


📝libpython-clj

ClojureからPythonのライブラリを呼び出す. 🔖Python

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

🔖CSV

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の相性の良さがある.


レコードデータを見やすく見るには?

表形式のレコードデータを見やすく見るには?

最も簡単なのは, clojure.pprint/print-table. REPLに結果を整理して出力.

clojure.core: tapと組み合わせた, Portalをつかうとブラウザでも表がみやすい. 遅延読み込みなので大きなデータも安心.

🔗References

Scicloj

ClojureでData Scienceをする人たちのコミュニティ.

定期的にyoutubeで勉強会動画がアップロードされているよう.

ds4clj

2022秋より始動するSciclojバックアップのもとのオンラインコース. 毎月コンテンツ更新.

ds4clj: a data science course for Clojure devs - Scicloj

Talks