Overview
Clojure Tips の中でも Data Scienceの前処理に特化したものをまとめる.
PythonやRとの比較も.
フレームワークではなく, Clojureの素の文法でどうやるかについて.
References
- 数値そのものの扱い: 📝Clojure Number
- 文字列操作: 📝Clojure String
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))))
- refs.
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 - Sliding window over seq - Stack Overflow
- https://techascent.github.io/tech.ml.dataset/tech.v3.dataset.rolling.html
- https://cnuernber.github.io/dtype-next/tech.v3.datatype.functional.html#var-fixed-rolling-window
Clojure: binning処理
もしくは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つまでは順番を覚えるという謎仕様もあるらしい.