Spotfire:将交叉表中的列输入数据函数

时间:2017-07-21 07:03:47

标签: ironpython spotfire

我有一个名为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 =业务单位)我可以用作我的时间序列。

1 个答案:

答案 0 :(得分:0)

以下是我解决问题的方法:

我写了一个包含我需要的所有信息的CSV字符串,并重写了我的数据函数,只有一个参数(csv字符串),它解析它以提取所需的所有信息。我这样做的方法是设置一个名为csv的String类型的document属性,并使用ironpython将document属性设置为等于计算出的csv字符串。