У меня есть функция данных 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), которые я могу использовать в качестве временных рядов.