特徴量エンジンKaskadaリファレンス~スライス

# はじめに

先日、以下の記事を発表しました。

https://qiita.com/yoshiyuki_kono/items/7dc7bdad5e02ff986f5d

新しいテクノロジーに触れる時はいつでも楽しいものです。
中でも新しいプログラミング言語（のパラダイム）を学ぶことは、特別に楽しいことです。

ということで、まだまだ勉強中ですが、公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。

本稿情報のソースとして、下記ドキュメントを参照ください。

https://kaskada.io/docs-site/kaskada/main/developing/slices.html

# スライスとは何か？

Kaskada は、データセットのスライスを操作する機能を提供します。スライス は、大きなデータセットをフィルタリングして小さなデータセットを作成する方法を表します。大規模なデータセットをスライスすることにより、データのサブセットにアクセスできるようになるため、クエリの実行が大幅に高速化されます。

スライスは、データセット全体の統計的プロパティを保存します。一般に、スライスには特定のエンティティのデータがすべて含まれるか、まったく含まれないかのどちらかです。サンプリングは個々のエンティティの粒度で行われます。

スライスは、生成された結果のセットにのみ影響を及ぼし、特定の結果を生成するために使用されたデータには影響しません。 その結果、`lookup` などの一部の式は、結果を生成するためにデータセット全体が必要になる可能性があるため、他の式ほど効率的にスライスできません。

# スライスの種類

## エンティティキーパーセントフィルタ
このフィルター タイプは、入力データセットをエンティティ キーのパーセンテージまでスライスします。Kaskada はテーブルでデータを管理し、テーブルの作成には`entity_key_column_name`が必要であることを思い出してください。エンティティ キーは、各行に関連付けられたキーです。エンティティは、各イベントに関連する世界の物事を特定する必要があります。

このフィルターは、すべての行を読み取り、エンティティ キー列に基づいて決定的かつスケーラブルな方法で行を削除します。フィルターは、テーブルにデータを追加するときにのみ、新しいデータに対して実行されます。以前にスライスされたデータを再計算する必要はありません。

以下は、Python でエンティティ キー フィルターを作成する例です。

```python
from kaskada.slice_filters import EntityPercentFilter

filter_percentage = 12.34
entity_filter = EntityPercentFilter(filter_percentage)
```

上の例では、フィルタリング率 12.34% で Kaskada Compute モジュールから新しい`EntityPercentFilter`モジュールを作成しています。

### エンティティ キー パーセント フィルタ詳細
 - 指定するフィルターの割合は 0.1% ～ 100% の範囲にする必要があります。
 - パーセンテージが大きいスライスには、パーセンテージが小さいエンティティが含まれます。例えば：
     - エンティティ A、B、C からの結果が 10% 含まれているスライスがあるとします。
     - 20% のスライスには、少なくとも A、B、C に加えて、追加のエンティティ D、E、F が含まれます。
 - 新しいデータがテーブルに追加されると、以前にスライスされたエンティティ キーも最新のデータに含まれ、新しいエンティティ キーが追加される可能性が高くなります。例えば：
     - エンティティ A と B からの結果が 10% 含まれているスライスがあるとします。
     - 新しいデータは、エンティティ A、C、D、E とともにテーブルにアップロードされます。A は自動的にスライスに含まれます。C、D、E はすべて、スライスに含まれる可能性が 10% あります。



## エンティティキーフィルター
エンティティ キー フィルターは、入力データセットを提供されたエンティティ キーにスライスします。フィルターが適用されると、指定されたエンティティ キーにエンティティ キーを持つデータのみがクエリ可能になります。現在、数値および文字列エンティティ キー フィルタリングのみがサポートされています。

エンティティ キー フィルターの作成例を次に示します。

```python
from kaskada.slice_filters import EntityFilter

entity_keys = ["customer_01", "customer_03"]
entity_filter = EntityFilter(entity_keys)
```

上の例では、「customer_01」と「customer_03」のエンティティ キー フィルターを使用して新しいモジュール`EntityFilter`を作成します。

### エンティティ キー フィルタ詳細
 - 指定されたキーはテーブルのエンティティ キー タイプと一致する必要があり、数値/文字列タイプのみがサポートされます。


## 使用法
スライスの使用はクエリ時にのみ適用され、 クエリごとに適用できるフィルターは1 つだけです。クエリにフィルターを適用するには、Kaskada モジュール メソッド`set_default_slice`を使用します。

スライスを設定すると、後続のすべてのクエリで同じセッション上のスライス フィルターが使用されます。

以下は、Pythonコードの例です。

```python
from kaskada import compute
from kaskada.api.session import LocalBuilder
from kaskada.slice_filters import EntityPercentFilter

session = LocalBuilder().build()

filter_percentage = 12.34
entity_filter = EntityPercentFilter(filter_percentage)
kda.set_default_slice(entity_filter)

query = '''
{
    time: Purchase.purchase_time,
    entity: Purchase.customer_id,
    max_amount: last(Purchase.amount) | max(),
    min_amount: Purchase.amount | min()
}
'''

compute.query(query=query)
```

IPython (Jupyter) の場合、以下のようにコードセルの後に、Fenl式を直接実行することもできます。

```python
from kaskada.slice_filters import EntityPercentFilter

filter_percentage = 12.34
entity_filter = EntityPercentFilter(filter_percentage)
kda.set_default_slice(entity_filter)
```

```javascript
%%fenl
{
    time: Purchase.purchase_time,
    entity: Purchase.customer_id,
    max_amount: Purchase.amount | max(),
    min_amount: Purchase.amount | min(),
}
```