Чтобы циклически проходить по строкам данных и вычислять текущий результат, вы можете использовать скрипт 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 в этом случае действует как выражение строки и вычисляет максимальное значение по строке заданных столбцов.