如何将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方法的唯一示例涉及添加从另一个文件读取的列,我无法看到如何使它们工作。
答案 0 :(得分: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)
这将创建一个名为“计算值”的新列。