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では、最小二乗法により線形回帰モデルを作成し、 統計値の出力を行います。
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の実行サンプル |