メタデータ:データに関する情報

ノードはフローの中で互いに接続されているため、各ノードで利用可能な列やフィールドに関する情報は利用可能です。 例えば、 SPSS Modeler のユーザーインターフェースでは、これにより、ソートまたは集約の対象となるフィールドを選択することができます。 この情報はデータモデルと呼ばれます。

また、スクリプトは、ノードに入出力されるフィールドを調べることで、データモデルにアクセスすることもできます。 一部のノードでは、入力データモデルと出力データモデルは同じです(例えば、ソートノードはレコードを単純に並べ替えるだけで、データモデルは変更しません)。 Deriveノードなど、新しいフィールドを追加できるものもあります。 フィルタノードなど、他のノードでは、フィールドの名前を変更したり、フィールドを削除したりすることができます。

以下の例では、スクリプトは標準の IBM® SPSS® Modeler druglearn.str フローを取り、フィールドごとに、いずれかの入力フィールドがドロップされたモデルを作成します。 これは、次の方法で実現します

  1. タイプノードから出力データモデルにアクセスする。
  2. 出力データモデルの各フィールドをループ処理する。
  3. 各入力フィールドのフィルターノードを修正する。
  4. 構築中のモデルの名前を変更する。
  5. モデルビルドノードを実行中。
注: フローが旧バージョンの IBM SPSS Modeler デスクトップで作成され、そのスクリプト言語がレガシーに設定されている場合は、 druglean.str フローでスクリプトを実行する前に、スクリプト言語を Python に設定することを忘れないでください。
import modeler.api

stream = modeler.script.stream()
filternode = stream.findByType("filter", None)
typenode = stream.findByType("type", None)
c50node = stream.findByType("c50", None)
# Always use a custom model name
c50node.setPropertyValue("use_model_name", True)

lastRemoved = None
fields = typenode.getOutputDataModel()
for field in fields:
    # If this is the target field then ignore it
    if field.getModelingRole() == modeler.api.ModelingRole.OUT:
        continue

    # Re-enable the field that was most recently removed
    if lastRemoved != None:
        filternode.setKeyedPropertyValue("include", lastRemoved, True)

    # Remove the field
    lastRemoved = field.getColumnName()
    filternode.setKeyedPropertyValue("include", lastRemoved, False)

    # Set the name of the new model then run the build
    c50node.setPropertyValue("model_name", "Exclude " + lastRemoved)
    c50node.run([])

DataModel オブジェクトは、データモデル内のフィールドやカラムに関する情報にアクセスするためのさまざまなメソッドを提供します。 これらの方法は以下の表にまとめられています。

表 1. DataModel フィールドまたはカラムに関する情報にアクセスするためのオブジェクトメソッド
メソッド 戻りの型 説明
d.getColumnCount() int データモデルの列数を返します。
d.columnIterator() 反復子 「自然な」挿入順で各カラムを返すイテレータを返します。 イテレータは、 Column のインスタンスを返します。
d.nameIterator() 反復子 「自然な」挿入順で各カラムの名前を返すイテレータを返します。
d.contains(name) ブール値 指定した名前の列がこの DataModel, に存在する場合は True を、存在しない場合は False を返します。
d.getColumn(name) 指定した名前のカラムを返します。
d.getColumnGroup(name) ColumnGroup 指定した列グループを返します。そのような列グループが存在しない場合は、 None を返します。
d.getColumnGroupCount() int このデータモデルの列グループの数を返します。
d.columnGroupIterator() 反復子 各列グループを順番に返すイテレータを返します。
d.toArray() 列 [] データモデルをカラムの配列として返します。 列は「自然な」挿入順に並べられています。

各フィールド(Column オブジェクト)には、カラムに関する情報にアクセスするための複数のメソッドが含まれています。 以下の表に、これらの選択項目を示します。

表2. カラムに関する情報を取得するためのカラムオブジェクトのメソッド
メソッド 戻りの型 説明
c.getColumnName() ストリング カラムの名前を返します。
c.getColumnLabel() ストリング カラムのラベルを返します。カラムにラベルが関連付けられていない場合は、空文字列を返します。
c.getMeasureType() MeasureType カラムの測定タイプを返します。
c.getStorageType() StorageType カラムのストレージタイプを返します。
c.isMeasureDiscrete() ブール値 列が離散的である場合、 True を返します。 セットまたはフラグのいずれかである列は、離散的であるとみなされます。
c.isModelOutputColumn() ブール値 カラムがモデル出力カラムの場合、 True を返します。
c.isStorageDatetime() ブール値 カラムのストレージが時刻、日付、タイムスタンプ値の場合、 True を返します。
c.isStorageNumeric() ブール値 カラムのストレージが整数または実数である場合、 True を返します。
c.isValidValue(value) ブール値 指定された値がこのストレージで有効な場合は True を返し、有効なカラム値が既知の場合は valid を返します。
c.getModelingRole() ModelingRole カラムのモデリングロールを返します。
c.getSetValues() オブジェクト [] そのカラムの有効な値の配列を返します。値が不明であるか、カラムが設定されていない場合は、 None を返します。
c.getValueLabel(value) ストリング カラムの値のラベルを返します。値に関連付けられたラベルがない場合は、空文字列を返します。
c.getFalseFlag() オブジェクト その列の「偽」のインジケータ値を返します。値が不明であるか、または列がフラグでない場合は、 None を返します。
c.getTrueFlag() オブジェクト その列の「真」のインジケータ値を返します。値が不明であるか、列がフラグでない場合は、 None を返します。
c.getLowerBound() オブジェクト 列の値の下限値を返します。値が不明であるか、列が連続していない場合は、 None を返します。
c.getUpperBound() オブジェクト 列の値の上限値を返します。値が不明であるか、列が連続していない場合は、 None を返します。

列に関する情報を取得するメソッドのほとんどは、 DataModel オブジェクト自体にも同等のメソッドが定義されていることに注意してください。 例えば、次の2つの文は同等です

dataModel.getColumn("someName").getModelingRole()
dataModel.getModelingRole("someName")