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

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

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

次の例では、スクリプトは標準の IBM® SPSS® Modeler druglearn.str フローに従い、各フィールドについて、 1 つの入力フィールドをドロップしたモデルを作成します。 これは、以下のように行われます。

  1. データ型ノードから出力データ・モデルにアクセスする。
  2. 出力データ・モデルの各フィールドをループする。
  3. 各入力フィールドのフィルター・ノードを変更する。
  4. 構築中のモデルの名前を変更する。
  5. モデル構築ノードを実行する。
注: druglean.str フローでスクリプトを実行する前に、フローが旧バージョンの IBM SPSS Modeler デスクトップで作成され、そのスクリプト言語がレガシーに設定されている場合は、必ずスクリプト言語を 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) Boolean 指定された名前の列がこの DataModel に存在する場合はTrue、存在しない場合はFalseを返します。
d.getColumn(name) 指定された名前の列を戻します。
d.getColumnGroup(name) ColumnGroup 指定された列グループを返すか、そのような列グループが存在しない場合はNoneを返します。
d.getColumnGroupCount() int このデータ・モデル内の列グループの数を返します。
d.columnGroupIterator() イテレーター 各列グループを順番に返すイテレーターを返します。
d.toArray() Column[] データ・モデルを列の配列として返します。 列は「ファイル順」の挿入順序になります。

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

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

列に関する情報にアクセスするほとんどのメソッドには、DataModelオブジェクト自体に定義された同等のメソッドがあることに注意してください。 例えば、以下の 2 つのステートメントは同等です。

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