我有一个名为ARIMA的Spotfire数据功能可以很好地工作。它主要需要两个大小相等的输入:一列均匀分布的日期和一列订单值。我的数据函数可以处理乱序或需要聚合的输入,但是为了提高性能,我想利用Spotfire将相同数据放入交叉表的速度。
因此,我需要一种方法将Cross表中的值输入到我的数据函数中。以下是我到目前为止在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 =业务单位)我可以用作我的时间序列。
答案 0 :(得分:0)
以下是我解决问题的方法:
我写了一个包含我需要的所有信息的CSV字符串,并重写了我的数据函数,只有一个参数(csv字符串),它解析它以提取所需的所有信息。我这样做的方法是设置一个名为csv的String类型的document属性,并使用ironpython将document属性设置为等于计算出的csv字符串。