LoginSignup
17
2

More than 1 year has passed since last update.

Elixir Explorer 0.4.0 でデータフレームと Nx テンソルをシームレスに変換できる

Last updated at Posted at 2022-12-01

はじめに

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()

スクリーンショット 2022-12-01 17.50.28.png

以下のように Series.to_tensor を使うだけでテンソルに変換されます

alias Explorer.Series
Series.to_tensor(sample_df["r"])

スクリーンショット 2022-12-01 17.52.40.png

逆も単純です

[0, 0.5, 1.0]
|> Nx.tensor(type: :f64)
|> Series.from_tensor()

スクリーンショット 2022-12-01 17.54.02.png

ただし、対応している型でない場合は cannot convert binary/tensor type {:f, 32} into dtype というようなエラーになります

スクリーンショット 2022-12-01 17.55.25.png

データフレームにテンソルを追加

テンソルを用意します

alpha =
  [255]
  |> Nx.tensor()
  |> Nx.tile([9])

DataFrame.put でデータフレーム、列名、テンソルを指定するだけで列として追加できます

先にテンソルからシリーズに変換する必要はありません

sample_df
|> DataFrame.put(:a, alpha)
|> Kino.DataTable.new()

スクリーンショット 2022-12-01 17.58.40.png

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()

スクリーンショット 2022-12-01 18.05.44.png

まとめ

今回の更新で飛躍的に使いやすくなったと思います

Explorer もっと流行れ!

17
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
2