【发布时间】:2017-07-21 07:03:47
【问题描述】:
我有一个名为 ARIMA 的 Spotfire Data 函数,它运行良好。它主要需要两个大小相等的输入:一列均匀间隔的日期和一列订单值。我的数据函数可以处理无序或需要聚合的输入,但出于性能考虑,我想利用 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)
所以我在 2 个 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 = 业务单位),我可以将其用作我的时间序列。
【问题讨论】:
标签: ironpython spotfire