Livebook の Smart Cell でノーコードデータ変換

## はじめに

Livebook の Smart Cell を使うと、ノーコードで様々なことができます

- Chart: グラフ表示
- Data transform: データ変換
- Database connection: データベース接続
- Map: 地図表示
- Neural Network Task: 機械学習モデルによる推論
- SQL query: データベースへの SQL クエリ発行
- Slack message: Slack へのメッセージ送信

今回は Data transform Smart Cell によるデータ変換を紹介します

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/explorer/data_transform.livemd

## セットアップ

Data transform Smart Cell を使うため、 [KinoExplorer](https://github.com/livebook-dev/kino_explorer) をインストールします

```elixir
Mix.install([
  {:kino_explorer, "~> 0.1"}
])
```

また、 Explorer の Query を使うため、以下のコードを実行しておきます

:::note info
実行しておかないと、一部の処理でエラーが発生します
:::

```elixir
require Explorer.DataFrame
```

## データの読込

今回は Explorer で準備されている化石燃料データセットを使います

2010年から2014年の期間で、国別の化石燃料によるCO2排出量を集計したデータです

データセットはそのままデータフレームとして読み込まれます

```elixir
df = Explorer.Datasets.fossil_fuels()
```

KinoExplorer をインストールしている場合、データフレームはテーブルとして表示されます

![スクリーンショット 2023-07-19 13.36.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/7132acc4-fdc9-3d1a-5719-8f7145672b6c.png)

## スマートセルの追加

"+ Smart" |> "Data transform" をクリックすると、データ変換用の Smart Cell が追加されます

![smart.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/67bf87e8-5086-767c-e438-62512a837593.gif)

例えば以下のような変換を行いたいとします

- 国毎に集計する
- 総排出量、液体燃料による排出量、気体燃料による排出量、固体燃料の平均を算出する
- 平均総排出量の少ない順に表示する

その場合、以下に示すような操作を実行します

- デフォルトで入っている "Filter by" の行を削除する（右端のゴミ箱アイコンをクリックする）
- "+ Group" をクリックし、追加された "Group by" に "country" を選択する
- "+ Summarise" をクリックし、追加された "Summarise using" に "mean" m "Of columns" に "total" "liquid_fuel" "gas_fuel" "solid_fuel" を選択する
- "+ Sort" をクリックし、追加された "Sort by" に "total_mean" を選択する
- セルの左上 "Evaluate" をクリックする

![transform.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f92aa74e-b2c6-64b0-3322-b7c7116db403.gif)

最終的な表示は以下のようになります

![スクリーンショット 2023-07-19 14.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/34fb3f02-79bb-d6c4-4a10-71ffbb322a9d.png)

また、セルの上段中央 "ASSIGN TO" に変数名を入れると、指定した変数にデータ変換結果が入ります

![スクリーンショット 2023-07-19 14.16.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/b272086a-34b8-4b73-981d-ad281f0910df.png)

別の例として、2011年以降の国別総排出量推移を取得してみましょう

- "Filter by" に "year (integer)" 、 "Operation" に "greater equal" を選択し、 "Value" に "2011"　と入力する
- "+ Discard" をクリックし、追加された "Columns to discard" （排除する列）に "year" "country" "total" 以外の全てを選択する
- "+ Pivot wider" をクリックし、追加された "Pivot names from" に "year" 、 "Values from" に "total" を選択する

![スクリーンショット 2023-07-19 14.02.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f2c853d5-e58a-c997-f42e-f3136de3b828.png)

ちょっとしたデータ変換であれば、この Smart Cell だけで、ノーコード実装可能になっています

下画像の赤枠アイコンをクリックすれば、変換結果をダウンロードすることも可能です

![スクリーンショット 2023-07-19 14.09.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/fbb5e0b9-8649-ca56-5e61-7bc88fc0e5fd.png)

また、セルの右上にある鉛筆アイコン（下画像の赤枠アイコン）をクリックすると、データ変換処理をコード化することができます

![スクリーンショット 2023-07-19 14.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d4d93a9a-90bc-7693-f84a-f5b526344065.png)

2番目の例のデータ変換処理をコード化すると、以下のようになります

```elixir
df
|> Explorer.DataFrame.to_lazy()
|> Explorer.DataFrame.filter(year >= 2011)
|> Explorer.DataFrame.discard([
  "bunker_fuels",
  "cement",
  "gas_flaring",
  "gas_fuel",
  "liquid_fuel",
  "per_capita",
  "solid_fuel"
])
|> Explorer.DataFrame.collect()
|> Explorer.DataFrame.pivot_wider("year", "total")
```

## まとめ

非常に直観的な操作でデータ変換が実装できました

Livebook によるデータ解析がますます捗りますね