在用Spotfire数据分析时,有时会需要将一些手动输入数据生成数据表,和分析中其他数据一起关联处理,本文整理了多种情况,一并实现,效果如下:
1. Ironpython脚本实现
输入区域中“生成表”对应IronPython脚本为:
from System.IO import MemoryStream, SeekOrigin, StreamWriter
from Spotfire.Dxp.Data.Import import TextDataReaderSettings,TextFileDataSource
from Spotfire.Dxp.Application.Visuals import Visualization
from Spotfire.Dxp.Data import AddRowsSettings
def loaddata(dataTableName, Input, Split, Firstascolname, Generatetype):
if Input == "": return
mySelection = Input.split("\n")
stream = MemoryStream()
csvWriter = StreamWriter(stream)
#csvWriter.WriteLine("col0\r\n")
for ID in mySelection:
csvWriter.WriteLine(ID+"\r\n")
csvWriter.Flush()
settings = TextDataReaderSettings()
if not Split == "":
settings.Separator = Split
if Firstascolname == "是":
settings.AddColumnNameRow(0)
settings.ClearDataTypes(False)
stream.Seek(0, SeekOrigin.Begin)
dataSource = TextFileDataSource(stream, settings)
if not Document.Data.Tables.Contains(dataTableName):
Document.Data.Tables.Add(dataTableName, dataSource)
elif Generatetype == "增加":
rowsettings=AddRowsSettings(Document.Data.Tables[dataTableName],dataSource)
Document.Data.Tables[dataTableName].AddRows(dataSource,rowsettings)
else:
Document.Data.Tables[newTableName].ReplaceData(dataSource)
newTableName = "InputdataTable"
Input = Document.Properties["inputid"].strip()
Split = Document.Properties["split"]
Firstascolname = Document.Properties["firstascolname"]
Generatetype = Document.Properties["generatetype"]
loaddata(newTableName, Input, Split, Firstascolname, Generatetype)
print('generate table success')
#自动在可视化图表中显示,其中showtable为选择参数(选择希望展示的可视化图表),如果不需要,可以不要下面这段
showtable = showtable.As[Visualization]() # 1. Change the data table
newTable = Document.Data.Tables.Item[newTableName]
showtable.Data.DataTableReference = newTable
showtable.TableColumns.Clear() #清空列
for i in newTable.Columns:
showtable.TableColumns.Add(i)
for i in showtable.TableColumns:
i.Width = 150
脚本中属性"inputid"、"generatetype"、"split"、"firstascolname"分别对应输入区域的文本输入框、“生成方式”、“拆分字符”、“将首行作为表头”所对应的文档属性。
输入区域中“删除表”对应IronPython脚本为:
try:
Document.Data.Tables.Remove(Document.Data.Tables["InputdataTable"])
except:
print("InputdataTable does not exists")
2. 自定义函数(Python)实现
输入区域中“自定义函数生成表”对应自定义函数代码为:
import pandas as pd
def loaddata(Input, Split, Firstascolname):
if Input == '':
return pd.DataFrame([['']])
data = [i.split(Split) if not Split=='' else [i] for i in Input.split('\n')]
if Firstascolname == '是':
colname = data[0]
data = data[1:]
return pd.DataFrame(data, columns=colname)
else:
return pd.DataFrame(data)
InputdataTable2 = loaddata(Input, Split, Firstascolname)
代码中属性Input、Split、Firstascolname分别对应输入区域的文本输入框、“生成方式”、“拆分字符”、“将首行作为表头”所对应的文档属性,需要手动添加函数输入参数。
自定义函数输出表默认为替换方式,要实现累加方式,需在输出参数选择“行”,并取消勾选“替换更新的行”
自定义函数不建议删除表,因为删除后重新生成的表无法自动展示,需要手动添加,当Input输入内容为空时,生成空表代替,如下图