Spotfire добавить столбец из списка python

Как добавить список 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, включают добавление столбца, прочитанного из другого файла, и я не понимаю, как заставить их работать.


person EddyTheB    schedule 03.12.2015    source источник


Ответы (1)


Я взломал его с некоторыми рекомендациями из этого связанного решения: Как создать таблицу данных на лету в Spotfire через 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)

И это создаст новый столбец под названием «Расчетное значение».

person EddyTheB    schedule 07.12.2015
comment
Я получаю следующую ошибку в последней строке: TypeError: AddColumns() принимает ровно 3 аргумента (2 заданных), что не имеет смысла, потому что в документации Spotfire функция AddColumns() действительно принимает два предоставленных вами аргумента :( Если это не изменилось с 7.7.х на 7.11.0 - person Alex Braksator; 21.07.2018
comment
@alex - это остальная часть кода в качестве моего примера? Принимает ровно N аргументов (дан N-1), как правило, связано с отсутствием собственного объекта объекта, поэтому мне интересно, пытались ли вы вызвать AddColumns() вместо DataTable.AddColumns()? - person EddyTheB; 22.07.2018