はじめに
Elixir でデータ分析を行う Explorer の v0.4.0 がリリースされました
大きな変更は以下の2点です
- Query によってより直感的なデータ操作が可能になった
- Nx のテンソルとシームレスな変換が可能になった
この記事ではテンソル関連について紹介します
実装の全文はこちら
注意
シリーズとの相互変換を行う場合、 Nx をインストールしておく必要があります
Mix.install([
{:nx, "~> 0.4"},
{:explorer, "~> 0.4"},
{:kino, "~> 0.7"}
])
シリーズとテンソルの変換
適当なデータフレームを用意します
alias Explorer.DataFrame
sample_df =
[
r: [255, 127, 0, 255, 127, 0, 255, 127, 0],
g: [255, 255, 255, 127, 127, 127, 0, 0, 0],
b: [255, 255, 0, 0, 127, 127, 255, 127, 0],
]
|> DataFrame.new()
sample_df
|> Kino.DataTable.new()
以下のように Series.to_tensor
を使うだけでテンソルに変換されます
alias Explorer.Series
Series.to_tensor(sample_df["r"])
逆も単純です
[0, 0.5, 1.0]
|> Nx.tensor(type: :f64)
|> Series.from_tensor()
ただし、対応している型でない場合は cannot convert binary/tensor type {:f, 32} into dtype
というようなエラーになります
データフレームにテンソルを追加
テンソルを用意します
alpha =
[255]
|> Nx.tensor()
|> Nx.tile([9])
DataFrame.put
でデータフレーム、列名、テンソルを指定するだけで列として追加できます
先にテンソルからシリーズに変換する必要はありません
sample_df
|> DataFrame.put(:a, alpha)
|> Kino.DataTable.new()
defn による演算
Nx.Defn
をインポートします
import Nx.Defn
defn
で演算処理を定義しておきます
以下の例は RGB の平均を計算しています
defmodule Helper do
defn mean(tf) do
(tf[:r] + tf[:g] + tf[:b]) / 3
|> Nx.as_type(:f64)
end
end
DataFrame.put
で定義した関数を呼び出せば、そのままデータフレームに適用できます
sample_df
|> DataFrame.put(:mean, Helper.mean(sample_df))
|> Kino.DataTable.new()
まとめ
今回の更新で飛躍的に使いやすくなったと思います
Explorer もっと流行れ!