Содержание


Проверенные методики IBM Business Analytics

Создание сценариев на языке Python в IBM SPSS Modeler

Продукт: IBM SPSS Modeler; область интересов: сценарии

Comments

Серия контента:

Этот контент является частью # из серии # статей: Проверенные методики IBM Business Analytics

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Проверенные методики IBM Business Analytics

Следите за выходом новых статей этой серии.

Назначение

В документе представлена вводная информация о создании сценариев на языке Python в IBM SPSS Modeler.

Применимость

Для использования описанных в документе примеров требуется IBM SPSS Modeler версии 16 и выше. Примеры протестированы с решением IBM SPSS Modeler 16, использующим Jython 2.5.1 для поддержки языка Python.

Исключения

Документ включает общий обзор создания сценариев в IBM SPSS Modeler 16, не предлагая полного описания всех доступных функциональных возможностей.

Допущения

Предполагается, что читатель имеет опыт работы в среде IBM SPSS Modeler. В идеале читатель также должен иметь опыт разработки сценариев на унаследованном языке сценариев Modeler и/или некоторый опыт использования языка Python.

Обзор

В течение многих лет IBM SPSS Modeler поддерживает использование сценариев для обеспечения улучшенного контроля над конфигурированием и выполнением потоков, а также управления результатами. Python стал языком сценариев по умолчанию начиная с Modeler версии 16, заменив унаследованный специальный язык (который по-прежнему доступен для целей совместимости).

Документ включает общий обзор создания сценариев на языке Python в Modeler 16, демонстрируя разработку более сложного примера на основе базового сценария потока. Содержание документа охватывает API-интерфейс сценариев, а также среду разработки сценариев в пользовательском интерфейсе Modeler.

Типы сценариев

Modeler поддерживает три типа сценариев:

  • сценарий потока— используется для контроля выполнения одного потока и хранится в этом потоке
  • сценарий надузла— используется для контроля поведения надузла и хранится в этом надузле
  • автономный сценарий (или сценарий сеанса) — может использоваться для координирования выполнения нескольких потоков и хранится в текстовом файле.

В данном руководстве мы преобразуем стандартный пример потока druglearn, чтобы использовать сценарий для выполнения потока, а затем расширим функциональность этого сценария для выполнения дополнительных задач.

Этап 1: Преобразование потока druglearn для использования сценария

Сначала нужно открыть пример потока druglearn.

  1. В главном окне Modeler в меню File (Файл) выберите Open Stream... (Открыть поток) и перейдите в подкаталог Demos/streams каталога установки Modeler.
  2. Найдите и выберите файл druglearn.str, нажмите OK.

В пользовательском интерфейсе Modeler вы увидите поток, показанный на рисунке 1.

Рисунок 1. Поток druglearn
Figure 1: The 'druglearn' Stream
Figure 1: The 'druglearn' Stream

Теперь мы хотим изменить этот поток, чтобы использовать сценарий вместо непосредственного выполнения конечных узлов.

  1. В главном окне Modeler в меню Tools (Инструменты) найдите подменю Stream Properties (Свойства потоков) и выберите Execution... (Выполнение…). Вы увидите окно, содержащее область сценария и область вывода с вкладками Messages (Сообщения) и Debug (Отладка), как показано на рисунке 2.
    Рисунок 2. Вкладка Execution
    Figure 2: The Execution Tab
    Figure 2: The Execution Tab
  2. Убедитесь в том, переключатель языков над областью сценария установлен на Python. Поскольку поток druglearn был создан в более ранней версии Modeler, он по умолчанию будет использовать унаследованный язык сценариев.
  3. Сгенерируйте сценарий по умолчанию для выполнения конечных узлов в потоке. Для этого найдите кнопку Insert Default Script (Присоединить сценарий по умолчанию) на панели инструментов над областью сценария (эта кнопка выделена на рисунке 3).
    Рисунок 3. Кнопка Insert Default Script
    Figure 3: The 'Insert Default Script' Button
    Figure 3: The 'Insert Default Script' Button

    Щелкните по этой кнопке, и вы увидите, что в область сценария добавлен сценарий по умолчанию (см. рисунок 4).
    Рисунок 4. Сценарий по умолчанию в области сценария
    Figure 4: The Default Script Inserted In The Script Area
    Figure 4: The Default Script Inserted In The Script Area
  4. Чтобы этот сценарий использовался как стандартный метод выполнения потока, в нижней части вкладки Execution выберите вариант Run this script (Запускать этот сценарий). Затем в диалоговом окне щелкните по кнопке OK для внесения изменений и закройте окно.

Теперь мы можем запустить поток, выбрав Run (Запустить) в меню Tools. Сценарий будет выполнен, и как прежде будут созданы новые модели.

Если вы хотите сохранить этот поток под другим именем, в меню File выберите Save As... (Сохранить как…).

Проверка сценария

Перед тем как идти дальше, стоит проверить сценарий.

diagram = modeler.script.diagram()

Эта строка сохраняет диаграмму, с которой связан сценарий, в локальной переменной diagram. Обратите внимание, модуль modeler.script автоматически импортируется в любой сценарий Modeler и предоставляет функции, позволяющие сценариям получать доступ к их операционному контексту. Для сценария потока функция diagram() возвращает поток, в котором выполняется сценарий потока.

diagram.findByID("id5IKMPB9VL87").run(None)	# "Drug":c50
diagram.findByID("id8Z7NXVQQMR8").run(None)	# "Drug":neuralnetwork

Эти две строки выполняют поиск в диаграмме узлов с конкретными идентификаторами. В данном случае такими узлами являются два построителя модели в конце потока.

Вместо того чтобы искать по идентификаторам, можно выполнять поиск по типу узла, например:

diagram.findByType("c50", None).run(None)
diagram.findByType("neuralnetwork", None).run(None)

Первый параметр определяет тип узла, который нужно найти, а второй — метку узла. Примечание: будьте осторожны при поиске с использованием метки узла. Такие узлы, как узлы поиска, построители модели и узлы графика, поддерживают автоматическое присвоение меток, а значит метки могут меняться при изменении значений в узле. Кроме того, иногда сценарий нужно запускать во множестве регионов, и метки узлов по умолчанию могут транслироваться по-разному. В таких ситуациях либо выполняйте поиск с использованием идентификатора узла, либо задайте специальную метку с использованием функции setLabel(), например:

node.setLabel("Node1")

Затем узлы выполняются с использованием функции run().

Использование вкладки Debug

Вкладка Debug позволяет оценить состояние сценария, который был запущен с использованием кнопки Run Script, выделенной на рисунке 5.

Рисунок 5. Кнопка Run Script
Figure 5: The ‘Run Script’ Button
Figure 5: The ‘Run Script’ Button

Если вы запускаете сценарий по умолчанию с использованием этой кнопки, а не выполняете поток через основное окно, то среда сценария (то есть объекты и переменные, созданные в ходе такого выполнения) сохраняется и может оцениваться с использованием командной строки на вкладке Debug (см. рисунок 6).

Рисунок 6. Командная строка оценки
Figure 6: The Evaluation Command Line
Figure 6: The Evaluation Command Line

Например, сценарий по умолчанию создает новую переменную diagram. Мы можем вывести значение этой переменной, набрав в командной строке команду Python:

print diagram

и затем нажав клавишу ВВОД. Команда выводится в текстовой области над командной строкой (с символами приглашения >>>), вместе с результатом ее выполнения, как показано на рисунке 7.

Рисунок 7. Результаты оценки выражения
Figure 7: The Results Of Evaluating An Expression
Figure 7: The Results Of Evaluating An Expression

Мы можем продолжить оценку выражений Python для отладки сценария или для проверки того, что добавления в сценарий будут работать как ожидалось.

Обратите внимание, командная строка сохраняет историю команд, поэтому можно выбирать предыдущие команды клавишами вверх/вниз и редактировать их.

Другие инструменты для создания сценариев

Перед тем как переходить к модификации сценария, стоит упомянуть несколько дополнительных функций, которые могут быть полезны при создании сценариев.

Поиск/замена

Диалоговое окно Find/Replace (Найти/Заменить) позволяет выполнять поиск и замену текстовых элементов. Это окно можно вызвать через меню Edit Options (Опции редактирования), выделенное на рисунке 8.

Рисунок 8. Кнопка Edit Options
Figure 8: The ‘Edit Options’ Menu Button
Figure 8: The ‘Edit Options’ Menu Button

или сочетанием клавиш CTRL+F.

Если вы уже задали текст для поиска, то можно нажать F3, чтобы найти следующее появление этого текста.

Автозаполнение

Функция автозаполнения позволяет быстро просматривать имена и синтаксис возможных функций. Набрав несколько первых букв и нажав CTRL+Пробел, вы увидите всплывающий список вариантов функций, начинающихся с введенных символов. Например, если вы хотите получить список функций, начинающихся с find, то вы можете ввести find и нажать CTRL+Пробел. Появится всплывающий список, показанный на рисунке 9.

Рисунок 9. Всплывающий список вариантов автозаполнения
Figure 9: The Auto-suggest Popup Menu
Figure 9: The Auto-suggest Popup Menu

Затем можно использовать клавиши вверх/вниз для перемещения по списку. Выбрав нужную команду, нажмите ВВОД. Всплывающий список можно убрать, нажав ESC.

Обратите внимание, всплывающий список автозаполнения показывает любые команды и функции, начинающиеся с указанных символов, даже если команды неприменимы к конкретному объекту в сценарии. Имя после дефиса указывает тип объекта, для которого определена функция, чтобы помочь вам определить нужные функции.

Отступы блоков

В языке Python отступы значимы для определения блоков кода. В области сценария можно сдвигать выбранные строки текста для увеличения или уменьшения отступа. Вы можете выбрать блок текста Python, чтобы он был выделен, как показано на рисунке 10.

Рисунок 10. Выделение блока текста для изменения отступа
Figure 10: Highlighting A Block Of Text To Indent
Figure 10: Highlighting A Block Of Text To Indent

Затем нажатием клавиши Пробел можно увеличить отступ (см. рисунок 11).

Рисунок 11. Текст с отступом
Figure 11: After Indenting The Text
Figure 11: After Indenting The Text

Чтобы уменьшить отступ, нажмите SHIFT+TAB.

Комментарии

Иногда полезно временно заменить или исключить фрагмент кода. Для этого выделите соответствующие строки, как показано на рисунке 12.

Рисунок 12. Выделение блока текста, который нужно закомментировать
Figure 12: Highlighting A Block Of Text To Comment Out
Figure 12: Highlighting A Block Of Text To Comment Out

Затем нажмите CTRL+T, чтобы пометить этот фрагмент как комментарий (см. рисунок 13).

Рисунок 13. Закомментированный текстовой блок
Figure 13: After Commenting Out The Text Block
Figure 13: After Commenting Out The Text Block

Изменение подсветки синтаксиса

Если вы хотите изменить отображение сценария и выражений CLEM, то в главном окне в меню Tools выберите Options (Опции), затем User Options... (Опции пользователя). На вкладке Syntax (Синтаксис) можно менять цвета и шрифты, используемые для подсветки синтаксиса.

Рисунок 14. Выбор подсветки синтаксиса
Figure 14: Syntax Highlighting Preferences
Figure 14: Syntax Highlighting Preferences

В области предварительного просмотра можно видеть, как повлияют изменения на отображение синтаксиса.

Этап 2: Оценка данных с использованием построенной модели

Ранее мы сгенерировали сценарий по умолчанию для потока druglearn. Поскольку это поток по умолчанию, он не предлагает никаких дополнительных функций, то есть он просто выполняет каждый конечный узел. Следующий этап включает захват построенных моделей, создание узла применения результатов моделирования и затем вывод итогов оценки в виде таблицы.

Объекты, созданные при выполнении потока, можно собрать в список, передаваемый в функцию run. Например:

c50node = diagram.findByType("c50", None)
results = []
c50node.run(results)

Если выполнение завершилось корректно, результаты теперь будут содержать объект итогов моделирования, созданный алгоритмом. Соответствующий узел применения модели может быть добавлен к потоку и подключен к предшествующему построителю модели, а затем к нему можно присоединить узел таблицы.

Python включает функцию len, которая возвращает длину последовательности (такой как список), которую может использовать сценарий для проверки того, что результаты были произведены.

if len(results) > 0:
    ...

Примечание: уровень отступа текста в Python значим для определения блоков кода. В области сценария Modeler отступы делаются с использованием пробелов, поэтому если код скопирован из другого источника, убедитесь в том, что в отступах также используются пробелы, а не табуляторы. Если в скопированном коде используются табуляторы, это приведет к ошибке при выполнении сценария Python, даже если вставленный код выглядит так, как будто имеет такой же отступ.

Бывает полезно размещать узлы таким образом, чтобы их можно было легко просматривать в пользовательском интерфейсе Modeler. Поэтому новый узел применения модели мы поместим под построителем модели. Можно использовать функции узла getXPosition() и getYPosition(), чтобы узнать позицию построителя модели, и затем задать смещение для узла применения модели:

if len(results) > 0:
    x = c50node.getXPosition()
    y = c50node.getYPosition()
    label = c50node.getLabel()
    applyc50 = diagram.createModelApplierAt(results[0], label, x, y+96)

Затем присоединяем узел применения модели к предшествующему построителю модели. Поскольку большинство узлов, не являющихся источниками, могут соединяться только с одним входным узлом, используем функцию диаграммы predecessorAt для доступа к предшествующему узлу:

    pred = diagram.predecessorAt(c50node, 0)

Затем можно присоединить к нему узел применения модели:

    diagram.link(pred, applyc50)

И наконец создадим новый узел таблицы, подключенный к узлу применения модели, поместив его сразу после узла применения модели:

    y = applyc50.getYPosition()
    tablenode = diagram.createAt("table", "ScoreOutput", x+96, y)
    diagram.link(applyc50, tablenode)

Весь сценарий выглядит следующим образом:

diagram = modeler.script.diagram()
c50node = diagram.findByType("c50", None)
results = []
c50node.run(results)
if len(results) > 0:
    x = c50node.getXPosition()
    y = c50node.getYPosition()
    label = c50node.getLabel()
    applyc50 = diagram.createModelApplierAt(results[0], label, x, y+96)
    pred = diagram.predecessorAt(c50node, 0)
    diagram.link(pred, applyc50)
    y = applyc50.getYPosition()
    tablenode = diagram.createAt("table", "ScoreOutput", x+96, y)
    diagram.link(applyc50, tablenode)

После запуска сценария итоговый поток должен выглядеть так, как показано на рисунке 15.

Рисунок 15. Поток после выполнения сценария
Figure 15: The Stream After Script Execution
Figure 15: The Stream After Script Execution

Этап 3: Агрегация предсказанных значений

В этом примере мы сосредоточимся на узле построителя C5.0. Сначала удалим узел нейронной сети и поместим узел построителя C5.0 после узла определения типов, используя пользовательский интерфейс.

Затем модифицируем сценарий, чтобы поток агрегировал среднее, минимальное и максимальное доверие для каждого из спрогнозированных значений и сортировал результаты в предсказуемом порядке.

Поток, который мы намерены создать, показан на рисунке 16.

Рисунок 16. Целевой поток
Figure 16: The Target Stream
Figure 16: The Target Stream

Поскольку мы собираемся создать последовательность подключенных узлов, размещенных друг за другом, имеет смысл определить функции, позволяющие сделать сценарий компактнее и проще в сопровождении.

Сначала определим вспомогательные функции для реализации более краткого метода поиска предшествующего узла, а также для связывания узла и его размещения либо под другим узлом, либо после другого узла. Функция predecessor выглядит следующим образом:

def predecessor(node):
    return node.getProcessorDiagram().predecessorAt(node, 0)

Как мы уже видели, предшествующий узел доступен через диаграмму, которой принадлежит узел, и доступ можно получить с использованием функции узла getProcessorDiagram.

Затем определим функцию, которая помещает узел со смещением относительно некоторого другого узла и связывает эти узлы вместе:

def addRelative(pred, node, xdiff, ydiff):
    x = pred.getXPosition()
    y = pred.getYPosition()
    node.setXYPosition(x+xdiff, y+ydiff)
    pred.getProcessorDiagram().link(pred, node)

Затем создаем две вспомогательные функции, которые добавляют узел либо после узла, либо под ним:

def addAfter(pred, node):
    addRelative(pred, node, 96, 0)

def addBelow(pred, node):
    addRelative(pred, node, 0, 96)

Теперь приступаем к основной части сценария. Сценарий, который контролирует построение исходной модели и добавляет узел применение модели почти такой же, что и прежде, за исключением того, что мы присваиваем результат моделирования переменной и используем функции predecessor и addBelow, которые только что определили:

diagram = modeler.script.diagram()
c50node = diagram.findByType("c50", None)
results = []
c50node.run(results)
if len(results) > 0:
    c50model = results[0]
    pred = predecessor(c50node)
    label = c50node.getLabel()
    applyc50 = diagram.createModelApplier(c50model, label)
    addBelow(pred, applyc50)

Обратите также внимание, что мы используем createModelApplier, а не createModelApplierAt, поскольку позиция узла будет устанавливаться функцией addBelow.

Затем добавим узел агрегации, который будет использоваться для вычисления среднего, минимального и максимального доверия для каждого значения, прогнозируемого моделью. Для моделей C5.0 предсказанное значение будет в поле $C-Drug, а доверие будет в поле $CC-Drug:

    # Создаем узел агрегации.
    aggregate = diagram.create("aggregate", "Aggregate")
    # Группируем по предсказанным значениям
    aggregate.setPropertyValue("keys", ["$C-Drug"])
    # Агрегируем доверие для предоставления среднего, 
	# минимального и максимального показателей
    aggregate.setKeyedPropertyValue("aggregates", "$CC-Drug", ["Mean", "Min", "Max"])
    # Нам не нужен столбец с количеством записей 
    aggregate.setPropertyValue("inc_record_count", False)

Затем добавляем новый узел после узла применения модели:

    addAfter(applyc50, aggregate)

Присоединяем узел сортировки. Он сортирует предсказанные значения, чтобы обеспечить согласованный порядок вывода. Хотя в сортировке нет строгой необходимости, она позволяет поддерживать упорядоченность разных наборов данных:

    # Создаем узел сортировки.
    sort = diagram.create("sort", "Sort")
    # Сортируем данные по предсказанному значению
    sort.setPropertyValue("keys", [["$C-Drug", "Ascending"]])
    addAfter(aggregate, sort)

Затем добавляем табличный вывод:

    # Создаем узел таблицы и запускаем его
    tablenode = diagram.create("table", "AggregateOutput")
    addAfter(sort, tablenode)
    tablenode.run(None)

Запустив сценарий, мы получаем объект табличного вывода, показанный на рисунке 17.

Рисунок 17. Табличный вывод с агрегированными значениями
Figure 17: Table Output Showing The Aggregated Values
Figure 17: Table Output Showing The Aggregated Values

Весь сценарий показан ниже:

def predecessor(node):
    return node.getProcessorDiagram().predecessorAt(node, 0)

def addRelative(pred, node, xdiff, ydiff):
    x = pred.getXPosition()
    y = pred.getYPosition()
    node.setXYPosition(x+xdiff, y+ydiff)
    pred.getProcessorDiagram().link(pred, node)

def addAfter(pred, node):
    addRelative(pred, node, 96, 0)

def addBelow(pred, node):
    addRelative(pred, node, 0, 96)

diagram = modeler.script.diagram()
c50node = diagram.findByType("c50", None)
results = []
c50node.run(results)
if len(results) > 0:
    c50model = results[0]
    pred = predecessor(c50node)
    label = c50node.getLabel()
    applyc50 = diagram.createModelApplier(c50model, label)
    addBelow(pred, applyc50)
    # Создаем узел агрегации.
    aggregate = diagram.create("aggregate", "Aggregate")
    # Группируем по предсказанным значениям
    aggregate.setPropertyValue("keys", ["$C-Drug"])
    # Агрегируем доверие для предоставления среднего, 
	# минимального и максимального показателей
    aggregate.setKeyedPropertyValue("aggregates", "$CC-Drug", ["Mean", "Min", "Max"])
    # Нам не нужен столбец с количеством записей 
    aggregate.setPropertyValue("inc_record_count", False)
    addAfter(applyc50, aggregate)

    # Создаем узел сортировки.
    sort = diagram.create("sort", "Sort")
    # Сортируем данные по предсказанному значению
    sort.setPropertyValue("keys", [["$C-Drug", "Ascending"]])
    addAfter(aggregate, sort)

    # Создаем узел таблицы и запускаем его
    tablenode = diagram.create("table", "AggregateOutput")
    addAfter(sort, tablenode)
    tablenode.run(None)

Этап 4: Проверка модели

Сгенерировав таблицу с различными показателями агрегации, мы обновим сценарий, чтобы определить, удовлетворяют ли эти показатели нашим пороговым значениям качества.

Первым шагом является захват табличного вывода так же, как мы захватывали исходную модель, то есть путем передачи списка результатов в функцию run узла таблицы, заменяя:

    tablenode.run(None)

на:

    results = []
    tablenode.run(results)

Результатом является объект табличного вывода. Объекты табличного вывода включают модель данных набора строк, которую мы можем использовать для доступа к разным значениям в таблице. Из конфигурации узла агрегации мы знаем, что таблица будет содержать четыре столбца:

  • предсказанное значение (поле ключа агрегации)
  • среднее доверие
  • минимальное доверие
  • максимальное доверие

Мы также знаем, что используемый нами набор данных имеет пять отдельных значений, которые можно предсказывать. Однако мы не можем гарантировать, что набор данных будет обязательно содержать строки со всеми этими значениям, поэтому нам нужно использовать количество строк в табличном выводе для ограничения цикла:

    results = []
    tablenode.run(results)
    # Теперь обрабатываем выходные данные потока
    tableoutput = results[0]    # предполагается, что таблица была сгенерирована
    rowset = tableoutput.getRowSet()
    rowcount = rowset.getRowCount()

Обратите внимание, набор строк хранится как отдельный объект в табличном выводе.

Затем мы проходим по строкам в наборе данных, извлекая требуемые значения.

    isvalid = True
    row = 0
    while row < rowcount:
        predicted = rowset.getValueAt(row, 0)
        meanval = rowset.getValueAt(row, 1)
        minval = rowset.getValueAt(row, 2)
        maxval = rowset.getValueAt(row, 3)

Если значения не удовлетворяют нашим требованиям, то сценарий устанавливает флаг индикатора и немедленно выходит из цикла:

        # Произвольным образом решаем, что среднее значение должно быть
        # больше 0,85, в противном случае отвергаем модель
        if meanval > 0.85:
            row += 1
        else:
            isvalid = False
            break

После завершения цикла сценарий должен проверить флаг статуса, и если модель допустима, то она сохраняется:

    # Если модель допустима, сохраняем ее в файл
    if isvalid:
        taskrunner = modeler.script.session().getTaskRunner()
        path = "c:/temp/models/" + c50model.getLabel() + ".gm"
        taskrunner.saveModelToFile(c50model, path)

При использовании стандартного демонстрационного набора данных Modeler DRUG1n два из предсказанных значений меньше 0,85, поэтому модель не будет сохранена. Если вы все же хотите, чтобы модель была сохранена, можете уменьшить пороговое значение, например до 0,80.

Весь сценарий показан ниже:

def predecessor(node):
    return node.getProcessorDiagram().predecessorAt(node, 0)

def addRelative(pred, node, xdiff, ydiff):
    x = pred.getXPosition()
    y = pred.getYPosition()
    node.setXYPosition(x+xdiff, y+ydiff)
    pred.getProcessorDiagram().link(pred, node)

def addAfter(pred, node):
    addRelative(pred, node, 96, 0)

def addBelow(pred, node):
    addRelative(pred, node, 0, 96)

diagram = modeler.script.diagram()
c50node = diagram.findByType("c50", None)
results = []
c50node.run(results)
if len(results) > 0:
    c50model = results[0]
    pred = predecessor(c50node)
    label = c50node.getLabel()
    applyc50 = diagram.createModelApplier(c50model, label)
    addBelow(pred, applyc50)
    # Создаем узел агрегации.
    aggregate = diagram.create("aggregate", "Aggregate")
    # Группируем по предсказанным значениям
    aggregate.setPropertyValue("keys", ["$C-Drug"])
    # Агрегируем доверие для предоставления среднего, 
	# минимального и максимального показателей
    aggregate.setKeyedPropertyValue("aggregates", "$CC-Drug", ["Mean", "Min", "Max"])
    # Нам не нужен столбец с количеством записей
    aggregate.setPropertyValue("inc_record_count", False)
    addAfter(applyc50, aggregate)

    # Создаем узел сортировки.
    sort = diagram.create("sort", "Sort")
    # Сортируем данные по предсказанному значению
    sort.setPropertyValue("keys", [["$C-Drug", "Ascending"]])
    addAfter(aggregate, sort)

    # Создаем узел таблицы и запускаем его
    tablenode = diagram.create("table", "AggregateOutput")
    addAfter(sort, tablenode)
    results = []
    tablenode.run(results)
    # Теперь обрабатываем выходные данные потока
    tableoutput = results[0]    # предполагается, что таблица была сгенерирована
    rowset = tableoutput.getRowSet()
    rowcount = rowset.getRowCount()
    isvalid = True
    row = 0
    while row < rowcount:
        predicted = rowset.getValueAt(row, 0)
        meanval = rowset.getValueAt(row, 1)
        minval = rowset.getValueAt(row, 2)
        maxval = rowset.getValueAt(row, 3)
        # Произвольным образом решаем, что среднее значение должно быть
        # больше 0,85, в противном случае отвергаем модель
        if meanval > 0.85:
            row += 1
        else:
            isvalid = False
            break

    # Если модель допустима, сохраняем ее в файл
    if isvalid:
        taskrunner = modeler.script.session().getTaskRunner()
        path = "c:/temp/models/" + c50model.getLabel() + ".gm"
        taskrunner.saveModelToFile(c50model, path)

Заключение

В документе представлен краткий обзор некоторых возможностей создания сценариев Python в Modeler. Будем надеяться, что вы стали лучше понимать функции, доступные в сценарии, а также инструменты в Modeler, позволяющие создавать такие сценарии.


Ресурсы для скачивания


Похожие темы


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Information Management
ArticleID=985292
ArticleTitle=Проверенные методики IBM Business Analytics: Создание сценариев на языке Python в IBM SPSS Modeler
publish-date=10062014