2015-12-03 42 views
0

如何將python列表添加到Spotfire數據表中作爲新列。例如,我希望添加一個具有使用python計算的值的列。Spotfire從python列表中添加列

from Spotfire.Dxp.Data import * 

# Get the data table 
DataTable = Document.Data.Tables.TryGetValue("Table Name")[1] 

# define some cursors 
CursorA = DataValueCursor.CreateFormatted(DataTable.Columns["Column A"]) 
CursorB = DataValueCursor.CreateNumeric(DataTable.Columns["Column B"]) 
CursorC = DataValueCursor.CreateNumeric(DataTable.Columns["Column C"]) 

# define a list 
NewColumnValues = [] 

# Go row by row and calculate the values I want. 
for row in DataTable.GetRows(CursorA, CursorB, CursorC): 
    A = CursorA.CurrentValue 
    B = CursorB.CurrentValue 
    C = CursorC.CurrentValue 
    V = SomeComplicatedFunction(A, B, C) 
    NewColumnValues.append(V) 

# And now add that column to the datatable 
# If only it would work like this... 
DataTable.AddColumns('NewColumnName', NewColumnValues) 

有沒有辦法做到這一點?我可以看到使用AddColumns方法的唯一示例涉及添加從另一個文件讀取的列,並且我看不出如何使它們工作。

回答

1

我已經破解了,與此相關的解決方案提供一些指導:How to create a data table on the fly in Spotfire via python

簡短的回答是,你不能直接從一個Python列表中添加一列,但您可以直接創建一個文本對象和進口而不必將它保存在任何地方。

下面是腳本的外觀。

from Spotfire.Dxp.Data import * 
from System.IO import StringReader, StreamReader, StreamWriter, MemoryStream, SeekOrigin 
from Spotfire.Dxp.Data.Import import * 

# Get the data table 
DataTable = Document.Data.Tables.TryGetValue("Table Name")[1] 

# define some cursors 
CursorA = DataValueCursor.CreateFormatted(DataTable.Columns["Column A"]) 
CursorB = DataValueCursor.CreateNumeric(DataTable.Columns["Column B"]) 
CursorC = DataValueCursor.CreateNumeric(DataTable.Columns["Column C"]) 
CursorRowId = DataValueCursor.CreateNumeric(DataTable.Columns["Row ID"]) 
# Note that column "Row ID" must be a unique identifier, and it can't be a calculated field (even a frozen one). 

textData = "" 
# Go row by row and calculate the values I want. 
    for row in DataTable.GetRows(CursorA, CursorB, CursorC, CursorRowId): 
    A = CursorA.CurrentValue 
    B = CursorB.CurrentValue 
    C = CursorC.CurrentValue 
    V = SomeComplicatedFunction(A, B, C) 
    textData += "%d\t%f\r\n" % (CursorRowId, V) 

# So now textData is a two column text string containing all the data I need. 
# Turn it into an in-memory text data source. 

stream = MemoryStream() 
writer = StreamWriter(stream) 
writer.Write(textData) 
writer.Flush() 
stream.Seek(0, SeekOrigin.Begin) 

readerSettings = TextDataReaderSettings() 
readerSettings.Separator = "\t" 
readerSettings.SetDataType(0, DataType.String) 
readerSettings.SetColumnName(0, 'Row ID') 
readerSettings.SetDataType(1, DataType.Real) 
readerSettings.SetColumnName(1, 'Calculated Value') 

NewInfo = TextFileDataSource(stream, readerSettings) 

# Define the table relationship 
leftColumnSignature = DataColumnSignature("Row ID", DataType.Integer) 
rightColumnSignature = DataColumnSignature("Row ID", DataType.Integer) 
columnMap = {leftColumnSignature:rightColumnSignature} 
ignoredColumns = [] 
columnSettings = AddColumnsSettings(columnMap, JoinType.LeftOuterJoin, ignoredColumns) 

# Add the column 
DataTable.AddColumns(NewInfo, columnSettings) 

而且這將創建一個名爲「計算值」的新列。