2022/01/14
Python連携
このコンテンツでは、マークデータをDBへ書き込みする方法について説明していきます。なお、本コンテンツで利用したSpotfireのバージョンは10.10/11.4です。ご利用環境によって、一部画面構成が異なる可能性がありますので、ご了承ください。
本コンテンツで利用するサンプルデータは、こちらからダウンロードしてください。
Pythonを使って、Spotfireで解析して絞り込んだデータをデータベースに書き込みます。
Pythonとはデータ分析を実装する際によく使われるプログラミング言語です。Spotfireで使えるPythonには以下の2種類があります。
①テキストエリアなどで使えるironPython
②データ関数で使えるPython 3.7.5(ver10.10 LTS)
今回は、①のironPythonによる実装になります。
Pythonスクリプトを使用して、Spotfireのマーク済みのデータをSQL Serverに書き込みます。
具体的には、散布図でマークした範囲の選手名を、ボタンを押してSQL Serverのテーブルに書き込むという操作になります。
下図のように、サラリーが高いのにホームランをあまり打っていない人を選択して、DBに記録します。
ボタンを押すとPythonがSQL ServerにInsertして、処理内容をメッセージボックスで通知します。
実行後のデータテーブルを確認すると、4人分入っていることがわかります。
書き込み先のテーブルはBaseballRecordという名前で1カラムだけ用意しました。コードは下記になります。
テキストエリアでボタンの設定を行います。右上の鉛筆アイコンから「テキストエリアを編集」画面を表示します。
「アクションコントロールの挿入」ボタンを選択します。
スクリプト内で「コントロールのタイプ」を「ボタン」にして、「新規」を選択します。
「スクリプトの編集」画面で以下を入力します。
※データベースの接続情報は環境に合わせて変更してください。
import clr
clr.AddReference('System.Data')
from System.Data import *
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import MessageBox
from Spotfire.Dxp.Data import DataValueCursor
#SQL Server Setting
TheConnection = SqlClient.SqlConnection("server=[server名];database=[DB名];uid=[ユーザー名];password=[パスワード]")
TheConnection.Open()
#マークされた行からデータを抽出
myCursor = DataValueCursor.CreateFormatted(Document.Data.Tables["Baseball"].Columns["Player Name"])
markedRows = Document.Data.Markings["マーク"].GetSelection(Document.Data.Tables["Baseball"]).AsIndexSet()
totalCount = 0
#SQL Serverへアクセス
for row in Document.Data.Tables["Baseball"].GetRows(markedRows, myCursor):
print myCursor.CurrentValue
#処理SQLの作成と実行
sqlcmd = "insert into BaseballRecord values ( '" + myCursor.CurrentValue +"')"
MyAction = SqlClient.SqlCommand( sqlcmd, TheConnection)
totalCount += MyAction.ExecuteNonQuery()
TheConnection.Close()
MessageBox.Show( str(totalCount) + "人分追加しました。")
「スクリプトの実行」を選択して、下図のメッセージがポップアップされたら、OKを押します。
表示テキストに「DB書き込み」を設定し、「使用できるスクリプト」から対象を選択後、OKを押します。
「テキストエリアを編集」画面に戻り、保存することで設定は完了です。
散布図内で任意の範囲を選択後、DB書き込みボタンを押すことで、接続中のDBに選手名が書き込まれます。
Insert対象のBaseballRecordテーブルをデータテーブルとして追加し、ボタンを押した後にデータテーブルが更新されるようにスクリプトを改良します。
これにより、ボタンを押した後にSpotfire内で追加データを確認できます。
インDB接続でSQL Serverにある対象のデータテーブルを取得します。オーサリングバーの⊕ボタンより、接続先 >> Microsoft SQL Server >> 新規接続を選択します。
接続設定を行います。
接続内のビュー内でBaseballRecordを選択します。
新規データテーブルとして取得したBaseballRecordのテーブルを散布図の近くに配置します。
先ほどのスクリプトに数行(灰色でハイライトされた箇所)を追加します。
import clr
clr.AddReference('System.Data')
from System.Data import *
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import MessageBox
from Spotfire.Dxp.Data import DataValueCursor
#テーブルリフレッシュ用に追加
from Spotfire.Dxp.Data import *
from Spotfire.Dxp.Data.Import import *
#SQL Server Setting
TheConnection = SqlClient.SqlConnection("server=[server名];database=[DB名];uid=[ユーザー名];password=[パスワード]")
TheConnection.Open()
#マークされた行からデータを抽出
myCursor = DataValueCursor.CreateFormatted(Document.Data.Tables["Baseball"].Columns["Player Name"])
markedRows = Document.Data.Markings["マーク"].GetSelection(Document.Data.Tables["Baseball"]).AsIndexSet()
totalCount = 0
#SQL Serverへアクセス
for row in Document.Data.Tables["Baseball"].GetRows(markedRows, myCursor):
print myCursor.CurrentValue
#処理SQLの作成と実行
sqlcmd = "insert into BaseballRecord values ( '" + myCursor.CurrentValue +"')"
MyAction = SqlClient.SqlCommand( sqlcmd, TheConnection)
totalCount += MyAction.ExecuteNonQuery()
TheConnection.Close()
MessageBox.Show( str(totalCount) + "人分追加しました。")
# データテーブルの更新
Document.Data.Tables["BaseballRecord"].Refresh()
任意の範囲を選択してボタンを押し、少し待つとテーブルが更新され、選択したデータの選手名が追加されます。
前の記事
閾値の変更時にスクリプトを実行次の記事
16進数から10進数へ変換【Python連携】最新の記事
CREATE TABLE [dbo].[BaseballRecord](
[Name] [varchar](50) NULL
) ON [PRIMARY]
GO