2.2. ライブラリー

GridData Analytics Studioは、PythonのディストリビューションであるAnaconda(Anaconda3-5.2.0)をベースに、 Python3、R、Scala、PySparkの実行環境とライブラリーをそれぞれ同梱しています。 これにより、ノートブック上で言語ごとに様々なライブラリーを利用できます。

注釈

GridData Analytics Studioの実行環境は完全なAnacondaディストリビューションを包含しておりますが、 インストールされていないライブラリーを使用したい場合、お客さま自身で新たなPythonやRのライブラリーを追加することもできます。 追加する手順はGridData Analytics 管理者ガイドを参照してください。

また主要なライブラリーごとに、基本的な使い方を記載した、ノートブックのサンプルを同梱しています。 各サンプルは管理者ユーザーにより、あらかじめユーザーのexamplesディレクトリーに配布されます。

2.2.1. 分析ライブラリー

GridData Analytics Studioで利用できる、主なPythonのライブラリーについて説明します。また、ノートブックのサンプルについても併せて説明します。

bokeh

bokehはデータを可視化するためのライブラリーです。 データを様々な形式の図に出力できるほか、マウスによる移動や縮小など、インタラクティブな効果を図に持たせることができます。

サンプルノートブックsample_bokehでは、ローレンツ方程式の計算結果をインタラクティブなグラフで可視化します。 サンプルノートブックを実行すると、計算結果を描写した図が出力されます。なお、この図はマウスで表示を操作できます。

cupy

cupyはGPU環境で動作する、後述するnumpyに類似した数値計算用のライブラリーです。 numpyと同様のAPIを持つため、numpyの呼び出しと計算部分をcupyに置き換えることで、計算処理をGPU上で高速に実行できます。

サンプルノートブックsample_cupy+matplotlibでは、numpyの代わりにcupyを用いて、 numpyのサンプルノートブックであるsample_numpy+matplotlibと同様、正弦波の描画や乱数の生成を行っています。

注釈

cupyの実行には、あらかじめGPU環境のセットアップとcupyのインストールが必要です。詳しくはGridData Analytics 管理者ガイドを参照してください。

chainer

chainerはニューラルネットワークを記述するためのライブラリーです。 他のニューラルネットワーク用のライブラリーに比べ、より直感的にネットワーク構造を記述できます。

サンプルノートブックsample_chainerでは、手書き数字画像のデータセットであるmnistを学習データに用い、 数字画像の分類モデルを作成します。 サンプルノートブックを実行すると、エポック(学習のイテレーション)ごとに進捗のプログレスバーが表示され、 学習結果である分類モデルがサンプルノートブックのあるディレクトリー以下に出力されます。

注釈

本サンプルノートブックはデフォルトではCPUのみを用いて処理を行う設定になっているため、 完了するまでに時間がかかる場合があります。GPUを利用する場合は、ノートブック内にある設定項目を変更してください。

ipywidgets

ipywidgetsはJupyter Notebookでインタラクティブな操作を実現するためのライブラリーです。 スライドバーやテキストボックスなど様々なウィジェット(UIの部品)により、データの変更をGUI上で操作することができます。

サンプルノートブックsample_ipywidgetsでは、基本的なウィジェットの使用方法とデータの取得方法を記載しています。 また、動的にデータの変更操作を実行結果に反映する方法を記載しています。

lifelines

lifelinesは生存分析と呼ばれる、あるイベントが起きるまでの時間とその発生率を推定する分析のためのライブラリーです。

サンプルノートブックsample_lifelinesでは、肺がん患者に関するサンプルデータから、 Kaplan-Meier法を用いて時間経過によるがん患者の生存率を推定し、またその結果をmatplotlibでグラフに描画します。

matplotlib

matplotlibはグラフ描画用のライブラリーです。 棒グラフ、折れ線グラフなどに加え、散布図や箱ひげ図、3Dグラフなど様々な図やグラフを描画することができます。

サンプルノートブック sample_numpy+matplotlibでは、 正弦波のグラフを表示する例と、乱数により生成したデータをヒストグラムで表示する例の二つを記載しています。

mecab

mecabは日本語の文章を形態素と呼ばれる基礎単位で解析するエンジンです。 文章を形態素ごとに分割し、形態素の品詞名、動詞の原型、読みなどを併せて出力できます。

サンプルノートブックsample_mecabでは、 「すもももももももものうち」という文章に対し、形態素解析した例を紹介しています。 mecabのデフォルトの出力は可読性が悪いため、別の形態素解析エンジンであるchasen互換のフォーマットで出力した例を紹介しています。

サンプルノートブック内の文章を変更して実行することで、様々な日本語の文章を形態素解析できます。

nltk

nltkは自然言語処理用のツールキットです。単語の正規化、構文解析、意味解析などを行います。 本来は英文処理用のツールキットですが、mecabと組み合わせることで日本語も処理できます。

サンプルノートブックsample_nltkでは、青空文庫のテキストを読み込み、分かち書きを行います。

numpy

numpyは数値計算用のライブラリーです。 多彩なメソッドを利用でき、また配列計算など繰り返しや多量の計算が伴う処理を、ネイティブなPythonコードよりも高速に実行できます。

サンプルノートブックsample_numpy+matplotlibでは、正弦波や乱数を生成するためにnumpyを使用しています。

pandas

pandasはデータ分析のためのデータ構造と演算を提供するライブラリーです。 DataFrameというデータ構造を導入し、分析の対象となるデータにテーブル構造を定義します。 またDataFrameの変換やDataFrame同士の結合・抽出を行うことで、大量のデータの操作や分析を容易に行うことができます。

サンプルノートブックsample_pandasでは、小規模のDataFrameを新規作成し、データの抽出や表示を行います。

scikit-image

scikit-imageは画像処理用のライブラリーです。 画像の変換のほか、特徴量や輪郭の抽出などの画像に関する処理を行います。

サンプルノートブックsample_scikit-imageでは、ハフ変換を用いサンプル画像から円を抽出します。 コーヒーカップの画像からカップの輪郭部分を楕円として抽出し、表示します。

scikit-learn

scikit-learnはPythonの機械学習ライブラリーです。 回帰、分類、クラスタリングなど、主要な機械学習のアルゴリズムを利用することができます。

サンプルノートブックsample_scikit-learnでは、データの読み込みと、k-meansによるクラスタリングを行います。

scipy

scipyはnumpyをベースとした、数学や工学などで使用する数値解析ライブラリーです。 微分積分、信号処理、統計処理といった、各種の計算を行うことができます。

サンプルノートブックsample_scipyでは、ベッセル関数を例に、ある区間内における関数の最大値を求めます。 ベッセル関数のグラフとその最大値をmatplotlibを用いて表示します。

seaborn

seabornはmatplotlibのラッパーであり、グラフ描画ライブラリーです。 matplotlibよりもグラデーションの豊かなグラフを描画できます。

サンプルノートブックsample_seabornでは、ヒストグラムと散布図を描画しています。 このとき、sample_numpy+matplotlibのヒストグラムとは異なるスタイルで描画します。

statsmodels

statsmodelsは、さまざまな統計モデルの推定、統計テスト、統計データの調査を行うライブラリーです。

サンプルノートブックsample_statsmodelsでは、最小二乗法により線形回帰モデルを作成し、 統計値の出力を行います。

sympy

sympyは記号計算を行うライブラリーです。

サンプルノートブックsample_sympyでは、記号xとyをシンボルとして定義し、xとyを使った数式を展開します。

2.2.2. WebAPI作成ライブラリー

GridData Analyticsはノートブック上でWebAPIを開発するために、Flaskを同梱しています。 FlaskはPythonのWebアプリケーションフレームワークで、小規模なWebアプリケーションの開発に適しており、 少ない記述でアプリケーションサーバーを作成し起動することができます。

サンプルノートブックsample_flaskでは、Flaskを用いて基本的なWebAPIを作成します。 ノートブック編集画面でサンプルノートブックを実行すると、APIサーバーが起動します。 APIサーバー起動中にノートブック内に記載したURLにアクセスすれば、その機能を外部から呼び出すことができます。

注釈

ノートブック編集画面から起動したsample_flaskのAPIサーバーを停止するには、ノートブックのカーネルを停止します。

ここでは、Flaskを使用してノートブックをAPIサーバー化する方法について説明します。

以下はFlaskを用いたWebAPIのひな形です。

from flask import Flask
import sys
sys.stdout.writable=None

api = Flask(__name__)

@api.route("/")
def hello():
        return "Hello World!"

if __name__ == '__main__':
        # ホスト名とポートを指定して起動開始
        api.run(host='localhost', port=3001)

このとき、末尾にあるlocalhostはGridData Analytics ServerをインストールしたマシンのIPアドレスまたはホスト名に変更してください。 このPythonコードをJupyter上で実行するとAPIサーバーが起動します。 ブラウザからhttp://localhost:3001/にアクセスすることで、helloメソッドの返り値である "Hello World!" が表示されます。

注釈

ノートブック上でのAPIサーバー起動はAPIの動作テストのために利用することを推奨します。 本番環境では、 APIサーバーを起動する に記載したGridData Analytics Server上でのAPIサーバー起動を推奨します。

以下、このひな形を用いて、FlaskによるWebAPI開発の基本的な方法を説明します。

■ APIの戻り値をJSONに変更する

APIのひな形に、追加でjsonifyとmake_responseをインポートします。 JSONを返すようにhelloメソッドを修正します。

from flask import Flask, jsonify, make_response
import json
import sys
sys.stdout.writable=None

api = Flask(__name__)

@api.route("/")
def hello():
        result = {"result":True, "data":{"string":"hello,world!"}}
        return make_response(jsonify(result))

if __name__ == '__main__':
        api.run(host='localhost', port=3001)

上記のAPIサーバーを起動してhttp://localhost:3001/にアクセスすると、以下のJSONが返却されます。

{"result":true,"data":{"string":"hello,world!"}}

■ APIのURLを変更する

APIのURLを変更するには、@api.routeアノテーションの記述を修正します。

@api.route("/my-api")
def hello():

この例では、APIのURLがhttp://localhost:3001/my-apiに変更されます。

なお、以下のようにひとつのAPIに複数のURLを指定することもできます。

@api.route("/my-api")
@api.route("/my-api/api2")
def hello():

■ APIのHTTPメソッドを変更する

APIのHTTPメソッドを変更するには、@api.routeアノテーションに新たな引数を追加します。

@api.route("/my-api", methods=['GET','PUT','POST']))
def hello():

上記の例の場合、GET、PUT、POSTメソッドそれぞれから呼び出されるAPIになります。なお、methodsを指定しない場合はGETになります。

■ クエリー文字列を受信する

APIのひな形に、追加でrequestをインポートします。

from flask import Flask, jsonify, make_response,request
import json
import sys
sys.stdout.writable=None

api = Flask(__name__)

@api.route("/my-api")
def hello():
        message = request.args.get('query')
        message = "default message" if message is None else echo_message(message)
        result = {"result":True,"data":{"string":message}}
        return make_response(jsonify(result))

def echo_message(message):
        return "message is "+str(message)

if __name__ == '__main__':
        api.run(host='localhost', port=3001)

request.args.get()を用いて、クエリー文字列から指定した名前の値を取得します。上記の例では、クエリー文字列がない場合はデフォルト値を設定しています。

上記のAPIサーバーを起動してhttp://localhost:3001/my-api?query=helloにアクセスすると、以下のJSONが返却されます。

{"result":true,"data":{"string":"message is hello"}}

■ URLの一部を取得する

URLの一部分をパラメーターとしてAPIに渡すことができます。

@api.route('/my-api/<string:username>/')
def hello(username='defaultname'):
        result = {"result":True,"data":{ "string":username } }
        return make_response(jsonify(result))

URLの一部に変数名を定義し、その変数をメソッドの引数にすると、アクセスしたURLからパラメーターを取得します。

上記のAPIサーバーを起動してhttp://localhost:3001/my-api/USER1/にアクセスすると、以下のJSONが返却されます。

{"result":true,"data":{"string":"USER1"}}

■ HTMLを返す

APIのひな形に、追加でrender_templateをインポートします。 あらかじめノートブックの実行場所にtemplatesまたはstaticというディレクトリーを作成し、内部にHTMLファイル(ここではhello.html)を配置します。

from flask import Flask, jsonify, make_response,request,render_template
import json
import sys
sys.stdout.writable=None

api = Flask(__name__)

@api.route("/my-api")

def hello():
        return render_template('hello.html', title='flask')
if __name__ == '__main__':
        api.run(host='localhost', port=3001)

render_templateはtemplatesディレクトリーとstaticディレクトリーを自動的に読み込み、指定したファイルがある場合にそれを返却します。

上記のAPIサーバーを起動してhttp://localhost:3001/my-api/にアクセスすることでhello.htmlが表示されます。

■ htmlの変更結果を反映する

render_templateで返却するHTMLの変更結果を動的に反映する場合、TEMPLATES_AUTO_RELOADを設定します。

if __name__ == '__main__':
        api.jinja_env.auto_reload = True
        api.config['TEMPLATES_AUTO_RELOAD'] = True
        api.run(host='localhost', port=3001)

■ HTMLを動的に作成する

FlaskはPythonのテンプレートエンジンであるjinja2を利用できます。 これにより、動的にHTMLを生成することができます。

以下のHTMLとPythonコードの例では、APIサーバはクエリー文字列とサーバが保持する辞書型オブジェクトによってHTMLを生成し、返却します。

<html lang="ja">
<head>
<title>sample</title>
</head>
<body>
<p>Hello, {{message1}}!</p>
<p>これは{{dictionary.key1}}と{{dictionary.key2}}のテストです。</p>
</body>
</html>
from flask import Flask, jsonify, make_response,request,render_template
import json
import sys
sys.stdout.writable=None

api = Flask(__name__)

@api.route("/")
def hello():
        message = request.args.get('query')
        message = "default message" if message is None else str(message)
        mydic = {}
        mydic['key1'] = 'flask'
        mydic['key2'] = 'jinja2'
        return render_template('hello.html', message1=message,dictionary=mydic)
if __name__ == '__main__':
        # ホスト名とポートを指定して起動開始
        api.jinja_env.auto_reload = True
        api.config['TEMPLATES_AUTO_RELOAD'] = True
        api.run(host='localhost', port=3001)

上記のAPIサーバーを起動してhttp://localhost:3001/my-api?message=griddataにアクセスすると、ブラウザに以下の文章が表示されます。

Hello, griddata!
これはflaskとjinja2のテストです。

■ エラーの返却

エラー処理を定義するには、@api.errorhandlerアノテーションを使用し、HTTPステータスごとのエラー処理を記述します。

以下の例では、存在しないURLが指定されると404 not foundを返却します。

@api.errorhandler(404)
def page_not_found(error):
        return "404 not found"

その他の例については、 Flaskの公式ドキュメント を参照してください。

2.2.3. 外部データソース接続ライブラリー

GridData Analytics Studioでは、以下のDBを外部データソースとして利用できます。

  • PostgreSQL
  • MySQL
  • OracleDB
  • HDFS
  • GridDB

利用可能な言語はPython3、Scala(GridDBのみ)、R(PostgreSQL,MySQL,HDFSのみ)です。 また、OracleDBへの接続にはあらかじめOracle instant clientのインストールと設定が必要です。 詳しくはGridData Analytics 管理者ガイドを参照してください。 なお、HDFSや関連するSparkの利用方法については、 HDFSを操作するSparkクラスター上で処理を実行する を参照してください。

Python用PostgreSQL接続ライブラリー

PythonスクリプトからPostgreSQLへ接続するには、psycopg2を使用します。

import psycopg2
# 接続情報の設定
connection = psycopg2.connect(
host='localhost',
user='postgres',
password='postgres'
port='5432'
dbname= 'testdb'
)
stmt=connection.cursor()
# SQLの発行
stmt.execute("select * from testtable;")
# 結果の取得
rows = stmt.fetchall()
for row in rows:
        print(row)
stmt.close();
connection.close();

Python用MySQL接続ライブラリー

PythonスクリプトからMySQLへ接続するには、pymysqlを使用します。

import pymysql
# 接続情報の設定
connection = pymysql.connect(
 host='localhost',
 user='user',
 password='password',
 db='testdb',
 cursorclass=pymysql.cursors.DictCursor
)
stmt = connection.cursor()
# SQLの発行
stmt.execute("select * from testtable;")
# 結果の取得
rows = stmt.fetchall()
for row in rows:
        print(row)
stmt.close();
connection.close();

Python用OracleDB接続ライブラリー

PythonスクリプトからOracleDBへ接続するには、cx_Oracleを使用します。

import cx_Oracle
# 接続情報の設定
connection = cx_Oracle.connect("username","password",
                       "localhost/dbname")
# SQLの発行
cur = connection.cursor()
cur.execute("select * from testtable")
# 結果の取得
rows = cur.fetchall()
for row in rows:
        print(row)
stmt.close();
connection.close();

Python用GridDB接続ライブラリー

PythonスクリプトからGridDBに接続するには、GridDB Pythonクライアントを使用します。

# ライブラリーのインポート
import griddb_python as griddb

# GridDBインスタンスの取得
factory = griddb.StoreFactory.get_instance()

# 接続情報の設定
gridstore = factory.get_store(
         notification_member="SERVER1:10001,SERVER2:10001,SERVER3:10001",
         cluster_name="griddataCluster",
         username="admin",
         password="admin"
         )

# 登録データの作成
import pandas as pd
values = [
    ["name01", 2018, 123, '2018-05-31T10:00:00.000Z', True, 1211.9232, bytearray([65,66])]
]
df = pd.DataFrame(values, columns=["name","lvalue","ivalue","tvalue","bvalue","dvalue","bivalue"])

# コンテナ情報の作成
containerInfo = griddb.ContainerInfo("col01",
     [["name", griddb.GS_TYPE_STRING],
     ["lvalue", griddb.GS_TYPE_LONG],
     ["ivalue", griddb.GS_TYPE_INTEGER],
     ["tvalue", griddb.GS_TYPE_TIMESTAMP],
     ["bvalue", griddb.GS_TYPE_BOOL],
     ["dvalue", griddb.GS_TYPE_DOUBLE],
     ["bivalue", griddb.GS_TYPE_BLOB]],
     griddb.ContainerType.COLLECTION, True)

# コンテナの生成、データ登録
container = gridstore.put_container(containerInfo)
container.multi_put(df.values.tolist())

# コンテナの取得
container = gridstore.get_container("col01")

# コンテナへのSQLの発行
query = container.query("select *")
rs = query.fetch()

# Pandas DataFrame形式で取得
rsdf = pd.DataFrame(list(rs), columns=rs.get_column_names())

# コンテナの削除
gridstore.drop_container("col01")

GridDB PythonクライアントのAPI仕様については、GridDBのドキュメントを参照してください。

R用PostgreSQL接続ライブラリー

RスクリプトからPostgreSQLへの接続にはRPostgreSQLを使用します。使用例は以下の通りです。

library(DBI)
library(RPostgreSQL)
dbconnector <- dbConnect(PostgreSQL(), host="localhost", port=5432, dbname="testdb", user="postgres", password="postgres")
dataset <- dbGetQuery(dbconnector,"select * from testtable")
print(dataset)

R用MySQL接続ライブラリー

RスクリプトからMySQLへの接続にはRMySQLを使用します。使用例は以下の通りです。

library(DBI)
library(RMySQL)
md <- dbDriver("MySQL")
dbconnector <- dbConnect(md, host="localhost", dbname="testdb", user="user", password="pass")
dataset <- dbGetQuery(dbconnector,"select * from testtable")
print(dataset)

2.2.4. 利用可能なライブラリー一覧

■ Pythonライブラリー

以下は、GridData AnalyticsのPython3環境にインストールされている主なライブラリーの一覧です。 なお、Anacondaに対し追加・アップデートしたライブラリーを太字で表記します。

全てのライブラリーのリストを参照する場合、GridData Analyticsをインストールしたマシン上でpip freezeコマンドを実行してください。

ライブラリー名 バージョン
bokeh 0.12.16
chainer 4.2.0
cupy 4.2.0
cx-Oracle 6.3.1
findspark 1.3.0
Flask 1.0.2
griddb-python-client 4.0.3
lifelines 0.15.0
matplotlib 2.2.2
mecab-python3 0.7
nltk 3.3.0
numpy 1.14.3
pandas 0.23.0
psycopg2 2.7.5
pyarrow 0.9.0
PyMySQL 0.9.1
scikit-image 0.13.1
scikit-learn 0.19.1
scipy 1.1.0
seaborn 0.8.1
sympy 1.1.1

■ Rライブラリー

以下は、GridData AnalyticsのR環境にインストールされている主なライブラリーの一覧です。 なお、r-essentials 3.4.3に対し、追加したライブラリーを太字で示します。

全てのライブラリーのリストを参照する場合、GridData Analyticsをインストールしたマシン上でRを起動後、library()コマンドを実行してください。

ライブラリー名 バージョン
car 2.1_4
gdata 2.18.0
gmodels 2.18.1
gplots 3.0.1
glmnet 2.0_16
gtools 3.8.1
qcc 2.7
rhdfs 1.0.8
RMeCab 1.00
RMySQL 0.10.15
RPostgreSQL 0.6-2

2.2.5. サンプルノートブック一覧

以下は、GridData Analytics Serverが同梱するサンプルノートブックの一覧です。 サンプルノートブックと、ノートブックが使用するサンプルデータは/home/griddata/analytics/examplesに用意されています。 サンプルノートブックやサンプルデータを各ユーザーの作業環境に配布する手順は、GridData Analytics 管理者ガイドを参照してください。

ファイル名 内容
sample_bokeh bokehの実行サンプル
sample_chainer chainerの実行サンプル
sample_cupy+matplotlib cupyとmatplotlibの実行サンプル
sample_flask flaskの実行サンプル
sample_gdac_nv ナイーブベイズを用いた、銀行の顧客契約予測サンプル
sample_gdac_svm サポートベクターマシンを用いた、電車の状態分類サンプル
sample_griddb_python3 GridDB Python クライアントの実行サンプル(Python3版)
sample_hdfs pyarrowを用いたHDFS接続サンプル
sample_ipywidget ipywidgetのサンプル集
sample_lifelines lifelinesの実行サンプル
sample_mecab mecabの実行サンプル
sample_nltk nltkの実行サンプル
sample_numpy+matplotlib numpyとmatplotlibの実行サンプル
sample_pandas pandasの実行サンプル
sample_pyspark pysparkによる分散処理の実行サンプル(pyspark_smallカーネル版)
sample_pyspark_python3 pysparkによる分散処理の実行サンプル(Python3版)
sample_r Rスクリプトの実行サンプル
sample_rdb PostgreSQL、MySQL、OracleDBの各接続サンプル
sample_scala Scalaスクリプトの実行サンプル
sample_scikit-image scikit-imageの実行サンプル
sample_scikit-learn scikit-learnの実行サンプル
sample_scipy scipyの実行サンプル
sample_seaborn seabornの実行サンプル
sample_statsmodels statsmodelsの実行サンプル
sample_sympy sympyの実行サンプル