Spotfire: ввод столбцов из кросс-таблицы в функцию данных

У меня есть функция данных Spotfire под названием ARIMA, которая прекрасно работает. В основном ему нужны два входа одинакового размера: столбец с равномерно распределенными датами и столбец значений порядка. Моя функция данных может обрабатывать ввод, который не соответствует порядку или требует агрегирования, но для повышения производительности я хочу воспользоваться скоростью, с которой Spotfire может получить те же данные в кросс-таблице.

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

from Spotfire.Dxp.Application.Visuals import CrossTablePlot
from Spotfire.Dxp.Data import IndexSet
from Spotfire.Dxp.Data import RowSelection
from Spotfire.Dxp.Data import DataValueCursor
from Spotfire.Dxp.Data import DataSelection
from datetime import date
from Spotfire.Dxp.Data.Expressions import ColumnExpression

crossTable = visual.As[CrossTablePlot]()
crossSource = crossTable.Data.DataTableReference

##Get a Row Count
rowCount = crossSource.RowCount

##Index Set of all our rows
allRows = IndexSet(rowCount,True)

##Empty Index Set to fill with our desired markings
rowsToMark = IndexSet(rowCount,False)

##Pick the column we're interested in examining for values.
##You can create multiple cursors to look at multiple columns.
##Specify the name of your column (or document property SelectBU).
colCurs = DataValueCursor.CreateFormatted(crossSource.Columns[SelectBU])
dateCurs = DataValueCursor.CreateFormatted(crossSource.Columns["Order Date"])
# Initialize OrderValue and OrderDate lists from cross table data
OrderValue = []
OrderDate = []

#ColumnExpression xColumnExpression = ColumnExpression.Create(context.XAxis.Expression);
OrderValueColumnExpression = ColumnExpression.Create(crossSource.Columns[SelectBU].NameEscapedForExpression)
OrderDateColumnExpression = ColumnExpression.Create(crossSource.Columns["Order Date"].NameEscapedForExpression)


for row in crossSource.GetRows(allRows, colCurs):
    OrderValue.append(colCurs.CurrentValue)
for row in crossSource.GetRows(allRows, dateCurs):
    dateStr = dateCurs.CurrentValue.split("/")
    d =(date(int(dateStr[2]),int(dateStr[0]),int(dateStr[1])))
    OrderDate.append(d)

Итак, у меня есть вся необходимая информация в двух списках Python. Но я не знаю, как использовать их в качестве входных данных для функции данных. Любые идеи? Вот что я пробовал:

from Spotfire.Dxp.Data.DataFunctions import DataFunctionExecutorService, DataFunctionInvocation, DataFunctionInvocationBuilder

    dataManager = Document.Data
    app = Application
    dataFunction = None
    for function in dataManager.DataFunctions:
        if function.Name == 'ARIMA':
            dataFunction = function
    inputParams = []

    inputCollection = dataFunction.Inputs.GetEnumerator()

    for inputs in dataFunction.DataFunctionDefinition.InputParameters:  
                if inputs.DisplayName=="OrderDate":
                    dataFunction.Inputs.SetInput(inputs, OrderDate)
                if inputs.DisplayName=="OrderValue":
                    dataFunction.Inputs.SetInput(inputs, OrderValue)


    dfes = app.GetService(DataFunctionExecutorService)
    context = app.ImportContext
    invocationBuilder = DataFunctionInvocationBuilder(dataFunction.DataFunctionDefinition, app.ImportContext)       
    dataFunctionInvocation = invocationBuilder.Build()
    print 'Executing...'
    dfes.Execute(dataFunctionInvocation)
    print 'Done'

Я понимаю, почему не работает: это из-за строчки dataFunction.Inputs.SetInput(inputs, OrderDate)

OrderDate - это переменная python для моего списка дат, но я считаю, что второй аргумент SetInput () ожидает нечто, называемое «выражением», которое я считаю выражением, подобным Spotfire. Не знаю, как это обойти, поэтому мне нужна помощь ».

Изменить. Я должен добавить, что в приведенном выше коде есть только два входных параметра: «visual», который является визуальным элементом перекрестной таблицы, и «SelectBU», который является свойством документа, которое указывает на разные числовые столбцы (BU = Business Units), которые я могу использовать в качестве временных рядов.


person Alex Braksator    schedule 21.07.2017    source источник


Ответы (1)


Вот как я решил проблему:

Я написал строку CSV со всей необходимой мне информацией и переписал свою функцию данных, чтобы у нее был только один параметр (строка csv), который она анализирует для извлечения всей необходимой информации. Я сделал это так, как установил свойство документа типа String с именем csv и использовал ironpython, чтобы установить свойство документа, равное вычисленной строке csv.

person Alex Braksator    schedule 22.07.2017