up: 📝Clojure Data Science

Overview

Clojure Tips の中でも Data Scienceの前処理に特化したものをまとめる.

PythonやRとの比較も.

フレームワークではなく, Clojureの素の文法でどうやるかについて.

References

Clojure: 統計処理

partition-by, group-by, split-withを駆使しそう.

Clojure: partition-by, split-with, group-by, and juxt - DZone

max/min

ポイントは, すでにリストに格納されている場合は, applyをつかう.

(apply max xs)

sum

reduce と + で代用. これは頻出.

(reduce + '(1 2 3))

Clojure:等差数列(diff)

Numpyのdiff的ななやつ. delta, gradient計算.

(def prices '(2752052.0 2754854.0 2755412.0 2755972.0 2755661.0))
(->> prices
     (partition 2 1)
     ;; ((juxt drop-last rest))
     ;; (apply interleave)
     ;; (partition 2)
     (map (fn [[x y]] (- x y))))

Clojure:累積和(cumsum)

cumulative sequence, cumulative sum. pandasにおけるcumsum的な.

clojure.core/reductionsという関数がありこれをつかう.

https://clojuredocs.org/clojure.core/reductions

🔧tech.ml.datasetのcolumsに配列を変換すればcumsum関数が適用できる.

Clojure:度数分布(freq)

frequencies関数が役に立つので, 何らかの方法で決めたルールの階級ごとのカテゴリカルデータに変換した上でfrequenciesをつかう.

https://clojuredocs.org/clojure.core/frequencies

(defn freq-by-range [xs range]
  (sort (frequencies (map (fn [x] (* (quot x range) range)) xs))))

💡Sliding window Algorithm(Clojure)

Sliding Window AlgorithmをClojureでimplする方法.

partition関数をつかうのが多分簡単(リストを一定の個数ごとにまとめたい(partition: list of list, chunked list)).

user=> (partition 3 1 [3 1 4 1 5 9])
((3 1 4) (1 4 1) (4 1 5) (1 5 9))

Clojure: binning処理

ep43-data-science-kixi-stats/graphs.clj at master · lambdaisland/ep43-data-science-kixi-stats · GitHub

もしくはClojure for Data Scienceの書籍をみる(たぶん同じ作者かな?)

ビニング処理

Clojure: データフレーム操作

📝pandasで実施するような表形式データの扱いをまとめていく.

Clojureでは, ✨CSVとはマップのリストに過ぎないので素の文法を駆使してデータ変換をしていく. そのため, 他の部位に散らばるテクニックを集めていく.

データフレームに新しい列を追加するには?

(ある列同士の計算結果から), 新しい列を追加するには? pandasだとSeriesを結合したり, assignに相当する操作.

Mapを受け取ってMapを返すような無名関数を作成してmap関数でリストに適用.

ref. key-aとkey-bのvalの計算結果をkey-cにbind

Clojureデータ前処理Tips

💡filterしてからmapすると速い

データ操作でmapとfilterの両方を使うときに, filterをしてからmapするほうがmapしてからfilterよりも速い.

さらに, 必要な要素だけを取り出すときはmapとfilterを組み合わせるよりもkeepを使ったほうが速い.

Clojure: Better Collection Processing | by Cavan David | Analytics Vidhya | Medium

Clojure Mapsのkeyを指定順に並べ替えるときはselect-keysをつかう

Clojure Mapsはkeyの順番は保証されないので(追加や削除で狂う), 表示のためにclojure のkeysを指定した順に並べるときは select-keysをつかって明示的に指定する.

Clojure Maps, order of key value creation - Stack Overflow

hash-map(PersistentHashedMap)をつかうと8つまでは順番を覚えるという謎仕様もあるらしい.