Spotfire: Как увеличить переменные для создания механизма оценки? - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь выяснить, как можно использовать переменные в Spotfire (онлайн-версия) для создания механизма оценки и заполнения вычисляемого столбца конечным результатом.

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

если столбец1 <10, то сегмент1 = сегмент1 + 1 </p>

если столбец1> 10, то сегмент2 = сегмент2 + 1

... ETC ...

В конце каждый «сегмент» должен иметь оценку, и я хотел бы просто отобразить название сегмента, который имеет наивысшую оценку.

Ex:

Сегмент1 имеет окончательное значение 10

Сегмент2 имеет окончательное значение 22 * ​​1017 *

Сегмент3 имеет окончательное значение 122

Я бы отобразил Сегмент3 в качестве значения для вычисляемого столбца

Использование только «IF» приведет меня к сложной структуре IF, поэтому я больше ищу что-то, что больше похоже на сценарий.

Есть ли способ добиться этого с помощью Spotfire?

Спасибо Laurent

1 Ответ

1 голос
/ 26 июня 2019

Чтобы циклически проходить по строкам данных и вычислять текущий результат, вы можете использовать скрипт IronPython. Сценарий ниже читает числовые данные из столбцов Col1 и Col2 таблицы данных с именем «Таблица данных». Он рассчитывает значение оценки для каждой строки и записывает его в текстовую строку с разделителями табуляции. Когда это сделано, он добавляет его в таблицу Spotfire с помощью функции Добавить столбцы. Обратите внимание, что существующие данные должны иметь уникальный идентификатор. Если нет, функцию RowId () можно использовать для создания вычисляемого столбца для уникального идентификатора строки.

from Spotfire.Dxp.Data import *
from System.IO import StringReader, StreamReader, StreamWriter, MemoryStream, SeekOrigin
from Spotfire.Dxp.Data.Import import *
from System import Array

def add_column(table, text, col_name):
    # read the text data into memory
    mem_stream = MemoryStream()
    writer = StreamWriter(mem_stream)
    writer.Write(text)
    writer.Flush()
    mem_stream.Seek(0, SeekOrigin.Begin)

    # define the structure of the text data
    settings = TextDataReaderSettings()
    settings.Separator = "\t"
    settings.SetDataType(0, DataType.Integer)
    settings.SetColumnName(0, 'ID')
    settings.SetDataType(1, DataType.Real)
    settings.SetColumnName(1, col_name)

    # create a data source from the in memory text data
    data = TextFileDataSource(mem_stream, settings)

    # define the relationship between the existing table (left) and the new data (right)
    leftColumnSignature = DataColumnSignature("Store ID", DataType.Integer)
    rightColumnSignature = DataColumnSignature("ID", DataType.Integer)
    columnMap = {leftColumnSignature:rightColumnSignature}
    ignoredColumns = []
    columnSettings = AddColumnsSettings(columnMap, JoinType.LeftOuterJoin, ignoredColumns)

    # now add the column(s)
    table.AddColumns(data, columnSettings)

#get the data table
table=Document.Data.Tables["Data Table"]

#place data cursor on a specific column
cursorCol1 = DataValueCursor.CreateFormatted(table.Columns["Col1"])
cursorCol2 = DataValueCursor.CreateFormatted(table.Columns["Col2"])
cursorColId = DataValueCursor.CreateFormatted(table.Columns["ID"])
cursorsList = Array[DataValueCursor]([cursorCol1, cursorCol2, cursorColId])

text = ""
rowsToInclude = IndexSet(table.RowCount,True)
#iterate through table column rows to retrieve the values
for row in table.GetRows(rowsToInclude, cursorsList):
    score = 0
    # get the current values from the cursors
    col1Val = cursorCol1.CurrentDataValue.ValidValue
    col2Val = cursorCol2.CurrentDataValue.ValidValue
    id = cursorColId.CurrentDataValue.ValidValue
    # now apply rules for scoring
    if col1Val <= 3:
        score -= 3
    elif col1Val > 3 and col2Val > 50:
        score += 10
    else:
        score += 5
    text += "%d\t%f\r\n" % (id, score)

add_column(table, text, 'Score_Result')

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

case 
when [Col1] > 100 then 10
when [Col1] < 100 and [Col2] > 600 then 20
end

Если у вас есть баллы, вы можете создать вычисляемый столбец, скажем, [MaxSegment]. Выражение для этого будет Макс ([Сегмент1], [Сегмент2], [Сегмент3] ...). Затем отобразите значение [MaxSegment].

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

...