• 検索結果がありません。

Python によるクラウドサービスを用いた システムの構築

N/A
N/A
Protected

Academic year: 2021

シェア "Python によるクラウドサービスを用いた システムの構築"

Copied!
7
0
0

読み込み中.... (全文を見る)

全文

(1)

c オペレーションズ・リサーチ

Python によるクラウドサービスを用いた システムの構築

呉 偉,菊池 健吾

本稿ではナーススケジューリング問題のためのスケジューリングシステム開発事例を通して,クラウドサービ

ス上にPythonによるWebアプリケーションを構築する手法を紹介する.サーバやOS,データベースを統合し

PaaS環境「Heroku」を利用し,Webアプリケーション向けフレームワークDash+Plotlyを用いることで,

グラフィカルなWebアプリケーションを作成する.先述のDashのほか,数理モデリングパッケージPuLP,

ORMパッケージSQLAlchemyなど,本開発に利用したさまざまなパッケージの利用方法も適宜解説する.

キーワード:クラウドサービス,ナーススケジューリング,Heroku

1.

はじめに

本稿ではナーススケジューリング問題のためのスケ ジューリングシステム開発の事例を通して,クラウド サービス上にPythonによるWebアプリケーションを 構築する手法を紹介する.個人あるいは小さなスター トアップを想定開発者として,Python Webアプリケー ションを低コスト・短期間で開発するためのクラウド サービス・Pythonパッケージの説明を行う.

2. IT

システム構築環境の最新事情

2.1 クラウドサービス

クラウドサービスの台頭により,ITシステムの開発 環境は大きく変化している.従来のITシステム開発 では,ハードウェアの調達や各種ミドルウェアの設定 作業,セキュリティ対策,運用管理対応などが必要で あったが,クラウドサービスを用いると,物理的な構 成と各種の煩雑な設定を気にせずに必要なコンピュー ティングリソースを効率よく調達することができる.

これにより,システム構築にかかるリソース・コスト を大幅に節約することができ,個人やスタートアップ などの小規模な開発グループでも短時間でWebサー ビスを公開することが可能になっている.

なお,クラウドサービスは提供形態として SaaS (Software as a Service),IaaS/HaaS (Infrastruc- ご い

成蹊大学理工学部

180–0001 東京都武蔵野市吉祥寺北町3–3–1 [email protected]

きくち けんご

株式会社朝日新聞社開発部

104–8011 東京都中央区築地5–3–2 [email protected]

ture/Hardware as a Service),PaaS (Platform as a Service)などが挙げられるが1,本稿で取り上げるのは PaaS環境のHerokuである.PaaSとはソフトウェア を構築・稼働させる環境をインターネット経由で提供 するサービスであり,以下に挙げるようなWebアプ リケーションのためのリソースを瞬時に稼働させるこ とができる:

インフラストラクチャ(サーバー,ストレージ,

ネットワーク)

Operating System (OS)

データベース(DB)

開発ツール,プログラミング言語の実行環境

その他のリソース

PaaSを利用することで,Webアプリケーションの開 発,テスト,デプロイ,というサイクルを無駄なく回 すことができ,スムーズなアプリケーション構築が可 能となる.なお,HerokuではPythonを含む多くの 言語をサポートしており,Python以外にもNode.js, Go,Rubyなどの言語で同様の開発サイクルを実現で きる.

2.2 PythonのWebフレームワーク

Python の代表的な Web フレームワークとして Django,Bottle,Flaskなどが挙げられるが,本稿で はDashを使用し,より迅速にWebアプリケーショ ンを開発することを目指す.DashはFlaskをベース に,グラフ描画,Webアプリケーション向けコンポー ネントなどの機能が追加されたWebフレームワークで あり,グラフィカルなインターフェースを前提とした Webアプリケーションに特化した機能をもっている.

1 https://ja.wikipedia.org/wiki/クラウドコンピューティ ング#提供サービスによる分類

(2)

1 3交替制勤務表の例

3.

ナーススケジューリング

本節では,開発するナーススケジューリングのサポー トシステムについて説明する.

ナーススケジューリングとは,病棟で働くナースに 対するシフト勤務表を作成する業務である.池上[1]の 調査によれば,病棟の現場において勤務表の作成には 平均6.8時間を要し,長いときには30時間を費す場合 もあると言われている.また,病院の師長が勤務表を 作成するために,休日や勤務終了後のプライベート時 間を利用する事例もよく問題視される.

日本の多くの病院では,2交替制あるいは3交替制 によりナースのシフト勤務が組まれている.3交替制 では,日勤,準夜勤,深夜勤というシフトが存在する.

手作業で作成された3交替制勤務表を表1に示す.

ナーススケジューリングでは,以下のようなさまざ まな制約条件を考慮しなければならない.

1. 各日各シフトの各ナースグループ(ベテラング ループや新人グループなど)からの勤務人数を不 足・超過しないようにする.

2. 勤務シフトの回数の上限と下限を守る.

3. セミナーなどの特定勤務や休み希望を達成する.

4. 禁止されるシフトの並びを避ける.

また,制約4では具体的に,同一シフトの連続日数の 上下限を守る制約と,同一シフトが連続しない場合の 間隔日数の上下限を守る制約を含む.

ナーススケジューリングについてさらに詳しく知り

たい読者には,池上の書籍[1]を勧める.

4.

利用するサービス・ミドルウェアについて

本稿では以下の開発環境のもとで,Webアプリケー ションの開発を行う:

OS:macOS High Sierra 10.13.6 PythonPython 3.6.5

DB:PostgreSQL 10.4

バージョン管理システム:Git 2.17.1

MacPackage Manager:Homebrew 1.7.1 また,開発に用いる主なパッケージを表2に示す. 示し たすべてのPythonパッケージはPyPI (Python Pack- age Index)に登録されており,パッケージ管理システ ムpipを用いてインストールすることができる.

5.

開発の流れ

本節では,Herokuを用いたWebアプリケーション の開発の流れを紹介する.ここで,Herokuによって 生成されるクラウド上の環境をリモート環境,実際に 開発作業を行う手元の環境をローカル環境と呼ぶ.

5.1 環境設定

ローカル環境とHerokuによるリモート環境の連携 はGitを通じて行う.Gitがインストールされてない 場合は,Homebrewで以下のコマンドを利用してイン ストールしておく.

$ b r e w i n s t a l l g i t

Herokuを利用するために,Heroku.com2でアカウン ト登録を行う.登録完了後,ターミナルからHerokuを 利用できるようにするため,Heroku Command Line Interface (CLI)をインストールする:

$ b r e w i n s t a l l h e r o k u / b r e w / h e r o k u

Heroku CLIをインストールすると,以下のコマンド によりターミナル上からHerokuにログインできる.

$ h e r o k u l o g i n

Pythonパッケージの管理を容易にするため,仮想環 境を作成できるVirtualenvをインストールしておく:

$ p i p i n s t a l l v i r t u a l e n v

5.2 ローカル環境でのアプリケーション構築 作業ディレクトリ名を「nsp app」とする.まずは Gitの初期化と,Python仮想環境の構築を行う:

2 https://signup.heroku.com/dc

(3)

2 使用するPythonパッケージ

パッケージ名 バージョン 説明

dash 0.22.0 分析系Webアプリ構築用のPythonフレームワーク

dash-core-components 0.26.0 Dashアプリ用のUIコアコンポーネントセット

dash-html-components 0.11.0 Dashアプリ用のHTMLレイアウト構成コンポーネントセット

dash-renderer 0.13.0 Dashアプリのレンダリング用のパッケージ

gunicorn 2018.7.1 Unix OS用のWSGI HTTPサーバー

plotly 3.1.0 データ可視化のパッケージ

PuLP 1.6.8 数理モデリングのパッケージ

psycopg2 2.7.5 PostgreSQLデータベースのアダプタ

SQLAlchemy 1.2.10 PythonSQLツールキットとORM (Object-Relational Mapping)

virtualenv 16.0.0 仮想環境作成ツール

$ cd n s p _ a p p

$ g i t i n i t # 空 のg i tリ ポ ジ ト リ を 初 期 化 す る

$ v i r t u a l e n v v e n v # 仮 想 環 境 を 構 築 す る

$ s o u r c e v e n v / b i n / a c t i v a t e # 新 規 仮 想 環 境 を 有 効 に す る

なお,仮想環境を無効にしたい場合は,以下のコマン ドを実行する:

$ d e a c t i v a t e

続いて,表2で示しているパッケージを「pip install」 コマンドでインストールする.インストールが完了し たら,Pythonアプリのパッケージの依存関係を記述 するファイル「requirements.txt」を「pip freeze」コ マンドで生成する:

$ p i p f r e e z e > r e q u i r e m e n t s. t x t

このファイルをHerokuへのデプロイ対象に含めるこ とで,依存関係のあるパッケージのインストールがリ モート環境上で自動的に行われる.

また,Herokuで用いられる「Procfile」ファイルを 以下のように作成する:

w e b : g u n i c o r n a p p : s e r v e r

「Procfile」はHerokuに対してアプリ起動のために実 行するプロセスを伝えるための設定ファイルであるが,

ここでは詳しく説明しない.

5.3 ローカルデータベースの準備

Herokuでは,一つのアプリケーションにつき一つの

無料PostgreSQLデータベースを利用できる.リモー ト環境でこのPostgreSQLデータベースを利用するこ とを前提とし,ローカル環境にもPostgreSQLデータ ベースを導入しておく:

$ b r e w i n s t a l l p o s t g r e s q l

Macを起動するたびにPostgreSQLが自動起動するよ うに設定する:

$ b r e w s e r v i c e s s t a r t p o s t g r e s q l

以下のコマンドを実行するとPostgreSQLを停止で きる:

$ b r e w s e r v i c e s s t o p p o s t g r e s q l

ナーススケジューリングシステム用のデータベース

「nsp」を作成する:

$ c r e a t e d b n s p

作成したデータベースは以下のコマンドで確認するこ とができる:

$ p s q l - l

続 い て ,Python の オ ブ ジ ェ ク ト 関 係 マ ッ ピ ン グ (Object-Relational Mapping, ORM) で あ る SQLAlchemyを導入する.SQLAlchemyの導入によ り,関係データベースに格納されたデータをPython オブジェクトとして扱うことができる.まずはデータ ベースに接続するためのengineを作成する:

f r o m s q l a l c h e m y i m p o r t c r e a t e _ e n g i n e D B _ U R L = ’ p o s t g r e s : / / @ l o c a l h o s t : 5 4 3 2 / nsp ’ e n g i n e = c r e a t e _ e n g i n e( D B _ U R L , e c h o = T r u e )

関数create engineの入力パラメータechoをTrueに 設定すると,実行したすべてのSQLログが出力され る.続いて,作成したengineに命令を与えるための セッションを生成する.

(4)

3 Nurseテーブル Nurse +id: Integer +name: String(16) +email: String(128)

f r o m s q l a l c h e m y. o r m i m p o r t s c o p e d _ s e s s i o n , s e s s i o n m a k e r

s e s s i o n = s c o p e d _ s e s s i o n( s e s s i o n m a k e r( b i n d = e n g i n e ))

本稿ではナースの基本情報を保存するNurseテーブ ルを例に,SQLAlchemyによるテーブルの生成を行う.

説明の都合上,各ナースがid,名前(name)とemailを もつ簡略化したNurseテーブルを表3に示す.Nurse テーブルのモデルは以下のように作ることができる.

(SQLAlchemyに関する詳しい説明とチュートリアル はsqlalchemy.orgから確認できる3.)

f r o m s q l a l c h e m y. e x t . d e c l a r a t i v e i m p o r t d e c l a r a t i v e _ b a s e

f r o m s q l a l c h e m y i m p o r t C o l u m n , I n t e g e r , S t r i n g

B a s e = d e c l a r a t i v e _ b a s e () c l a s s N u r s e ( B a s e ):

# n u r s eテ ー ブ ル の 定 義 _ _ t a b l e n a m e _ _ = ’ n s p _ n u r s e ’

id = C o l u m n ( ’ id ’ , I n t e g e r , p r i m a r y _ k e y=

T r u e )

n a m e = C o l u m n ( ’ name ’ , S t r i n g (16) , n u l l a b l e = F a l s e )

e m a i l = C o l u m n ( ’ email ’ , S t r i n g ( 1 2 8 ) ) B a s e . m e t a d a t a . c r e a t e _ a l l( b i n d = e n g i n e )

4 行 目 の 関 数 declarative base() は 各 テ ー ブ ル のベースクラスを作成している.また,14 行目の Base.metadata.create all(bind=engine)により,

設定済みのデータベースにBaseを継承しているテー ブルが「CREATE TABLE」される.Nurseテーブル に対するCRUD (Create, Read, Update, Delete)操 作は以下のように行う.

# 生 成

n e w _ n u r s e = N u r s e ( n a m e = ’ H a n a k o ’) s e s s i o n . a d d ( n e w _ n u r s e)

s e s s i o n . c o m m i t ()

# 読 み 取 り

n u r s e s = s e s s i o n . q u e r y ( N u r s e ). a l l ()

n u r s e _ 1 = s e s s i o n . q u e r y ( N u r s e ). f i l t e r ( N u r s e . id == 1 ) . o n e _ o r _ n o n e ()

# 更 新

3 http://docs.sqlalchemy.org/en/latest/index.html

n u r s e _ 1 . e m a i l = ’ h a n a k o @ o r s j. or . jp ’ s e s s i o n . c o m m i t ()

# 削 除

s e s s i o n . d e l e t e ( n u r s e _ 1 ) s e s s i o n . c o m m i t ()

ナースのスケジュールを作成するには,スケジュー ル期間(開始日s date,終了日e date)などを保存す る対象データのテーブルや,制約条件の入力に関わる テーブルなどが必要となるが,紙面の都合上省略する.

また,SQLAlchemyでテーブル間の関係構築も簡単に 設定できる4

5.4 Herokuへのプログラムデプロイ

Herokuアプリのデプロイとは,ローカル環境のソー

スコードをネットワークを通じてサーバー上にアップ ロードし,実行環境を構成し,Webアプリを稼働させ ることである.本節では,WebアプリをHerokuにデ プロイする基本方法を記述する.

まずは,以下のコマンドでHeroku上にアプリ用の スペースを作成する:

$ h e r o k u c r e a t e

「heroku createアプリ名」としてアプリ名を指定する こともできる.デプロイ後のアプリは「https://アプリ 名.herokuapp.com」で確認できる.指定しない場合,

自動的にアプリ名が付けられる.

本稿のアプリではデータベースを利用するため,

Herokuのデータベースアドオンを追加する:

$ h e r o k u a d d o n s : c r e a t e h e r o k u - p o s t g r e s q l

$ h e r o k u c o n f i g

「heroku config」で 取 得 し た URL を 5.3 節 の SQLAlchemyの設定で利用したローカル URLと置 き換える.

# D B _ U R L = ’ p o s t g r e s : / / @ l o c a l h o s t : 5 4 3 2 / nsp ’ D B _ U R L = ’[ h e r o k u c o n f i gで 得 ら れ たU R L ] ’

これで,デプロイの準備が完了した.

5.5節から 5.7節で紹介する実装でWebアプリが ローカル環境で実装できているものとして,以下の手 順でデプロイを行う:

4 http://docs.sqlalchemy.org/en/latest/orm/relationsh ips.html

(5)

$ g i t a d d . # す べ て の フ ァ イ ル をg i tに 追 加

$ g i t c o m m i t - m ’ I n i t i a l a p p nsp ’ # ロ ー カ ル レ ポ ジ ト リ に コ ミ ッ ト

$ g i t p u s h h e r o k u m a s t e r # h e r o k uへ の デ プ ロ イ

Herokuプラットフォームは内部で「dyno」と呼ば れるアプリ実行のための仮想コンテナをもっている.

コンテナとは,コンピューティングリソース,メモリ,

OS,一時的なファイルシステムを備えた軽量の独立し た環境で,dynoのタイプや個数をアプリに応じて変更 することにより,アプリの規模や負荷に応じたリソー スを調達することができる.dynoの設定によっては Herokuの有料化が必要になるが,本稿では無料dyno を利用するために,コンテナ数を1に設定している:

$ h e r o k u ps : s c a l e w e b =1

稼働できたWebアプリは,

$ h e r o k u o p e n

を実行することでブラウザ上で確認できる.また,プ ログラムを修正した場合も,

$ g i t s t a t u s # 修 正 を 確 認 す る

$ g i t a d d . # す べ て の 修 正 を コ ミ ッ ト 対 象 に 追

$ g i t c o m m i t - m ’ a m e m o of t h e c h a n g e s ’ # 正 を ロ ー カ ル レ ポ ジ ト リ に コ ミ ッ ト

$ g i t p u s h h e r o k u m a s t e r

で再デプロイできる.なお,以下の「logs」コマンド によりリモート環境の実行ログをリアルタイムに確認 することもできる:

$ h e r o k u l o g s - - t a i l

上記の流れにより,ローカル開発,ローカルテスト,

デプロイ,改善という開発サイクルが低コスト,短時 間で実現できる.

5.5 DashによるWebフレームワークの作成 Dashアプリはレイアウトとインタラクティブな処 理から構成される.

最初にDashアプリのレイアウト設計について紹介 する.レイアウトオブジェクトはHTML要素や属性 を生成する「Dash HTML Components (DHC)」と Dash基本UIコンポーネントを含む「Dash Core Com- ponents (DCC)」で構成される.一般に,Webアプ リケーションのレイアウトの設計時にはHTMLなど の知識が必要になるが,UIコンポーネントを利用する 場合は,そのコンポーネントを表示するためのHTML を意識する必要がない.これにより,HTMLやCSS,

1 Dashで作成したスケジュール期間選択のレイアウト

Javascriptなどに精通していなくても,高度な機能を もつUIコンポーネントをWebアプリケーション内で 利用することができる.下に,スケジュール期間を選 択できるWebアプリケーションの例を示す.(Dash に関する詳しい説明はDashのホームページを参照さ れたい5.)

i m p o r t d a s h

i m p o r t d a s h _ c o r e _ c o m p o n e n t s as d c c i m p o r t d a s h _ h t m l _ c o m p o n e n t s as h t m l f r o m d a t e t i m e i m p o r t d a t e as Dt a p p = d a s h . D a s h ( _ _ n a m e _ _ ) s e r v e r = a p p . s e r v e r a p p . l a y o u t = h t m l . D i v ([

h t m l . H2 ( ’ナ ー ス ・ ス ケ ジ ュ ー ラ ー’ ) , d c c . D a t e P i c k e r R a n g e(

id = ’ date - range - p i c k e r ’ , s t a r t _ d a t e= Dt ( 2 0 1 7 , 7 , 1 ) , e n d _ d a t e = Dt ( 2 0 1 7 , 7 , 2 1 ) ) ,

h t m l . D i v ( id = ’ d i s p l a y - date ’) ])

if _ _ n a m e _ _ == ’ _ _ m a i n _ _ ’:

a p p . r u n _ s e r v e r( d e b u g = T r u e )

この例のlayoutには,DHC二つとDCC一つが含ま れている.このコードにより生成された画面を図 1に 示す.

続いて,Dashアプリにインタラクティブな処理を追 加する方法を簡単な例を用いて説明する.日付選択コ ンポーネントで日付を選択したときに,何らかの処理を リアルタイムで実行することを考えたい.Dashでは各 コンポーネントに対してidを定義でき,特定idをもつ コンポーネントに対しイベント処理のためのcallback

5 https://dash.plot.ly/

(6)

関数を紐づけることができる.ここでは,コンポーネ ント「date-range-picker」のstart dateとend date が変更されるたびに,「display-date」に指定の期間を 表示するという処理を実装することにする.この場合,

callback関数は以下のようになる:

f r o m d a s h . d e p e n d e n c i e s i m p o r t O u t p u t , I n p u t

@ a p p . c a l l b a c k ( O u t p u t ( ’ d i s p l a y - date ’ ,

’ c h i l d r e n ’) , [ I n p u t ( ’ date - range - p i c k e r ’ ,

’ s t a r t _ d a t e ’) , I n p u t ( ’ date - range - p i c k e r ’ ,

’ e n d _ d a t e ’ ) ] )

d e f s h o w _ s c h e d u l e( s _ d a t e , e _ d a t e ):

r e t u r n ’開 始 日 :’ + s _ d a t e + ’ 終 了 日 :’ + e _ d a t e

図1の選択を行う場合,「開始日:2017-07-01終了日:

2017-07-21」が日付選択コンポーネントの下にリアル タイムで表示される.

このようにして,ナーススケジューリング問題に関 してユーザーからの入力が求められる情報を,ユーザー フレンドリーなUIのもとで迷いなく入力できるよう に画面を作っていく.

5.6 PuLPによるモデリング

この節では,本稿のアプリケーションで扱う,ナース スケジューリング問題のモデリングと解法を解説する.

池上[1]は3節で紹介したナーススケジューリング 問題(NSP)を組合せ最適化問題として定式化した.紙 面の都合上,目的関数のみを示す.

記号

M:ナースの集合

N:スケジューリング対象日の集合

K:シフトの集合(例:日勤,夜勤,深夜勤,休み)

R:ナースグループの集合(グループ分けの基準は業 務のスキルレベルや担当患者)

Gr:グループrに属するナースの集合

arjk, brjk:グループrのナースが日jにシフトkを 勤務する人数の下限と上限

変数

xijk:ナースiが日jにシフトkを勤務する場合1,そ うでない場合0の0-1変数

αrjk, α+rjk:グループrのナースが日jにシフトkを 勤務する人数の不足数と超過数を表す変数 ここで,x= (xijk)とα= (αrjk),α+ = (α+rjk) の関係は,以下の制約式で表されている.

arjk−αrjk

i∈Gr

xijk≤brjk+α+rjk,

r∈R, j∈N, k∈K, (1) xijk∈ {0,1}, i∈M, j∈N, k∈K, (2) αrjk, α+rjk0, r∈R, j∈N, k∈K. (3)

目的関数

minimize

r∈R

j∈N

k∈K

(wrjk αrjk+w+rjkα+rjk) (4)

ここで,wrjkw+rjkはグループrのナースが日jに シフトkを勤務する人数の不足数αrjkと超過数α+rjk に対するペナルティ重みを表す.

NSPのほかの制約式は本稿では省略する.

定式化した問題をPuLPを用いてモデリングする.

PuLPの詳しい使用方法は久保らの書籍 [2]の11章 を参照されたい.本稿でモデリングに必要なパラメー タ(問題例)を「ins」とする.NSPで使う変数xを 以下のように生成する:

i m p o r t p u l p

f r o m d a t e t i m e i m p o r t t i m e d e l t a d e f s o l v e _ n s p( i n s ):

d a y _ d i f f = i n s . e _ d a t e - i n s . s _ d a t e

# 最 小 化 問 題 の オ ブ ジ ェ ク ト を 作 成 す る m o d e l = p u l p . L p P r o b l e m (" N S P " , p u l p .

L p M i n i m i z e)

# 変 数xの 定 義

s u f = [( i , i n s . s _ d a t e + j , k ) f o r i in i n s . n u r _ s e t f o r j in r a n g e ( d a y _ d i f f + 1 ) f o r k in i n s . s f t _ s e t ]

x = p u l p . L p V a r i a b l e. d i c t s (" x " , suf , c a t = p u l p . L p B i n a r y )

同様に,変数αα+を表すPython変数alpha m とalpha pも定義できる.

定義した変数を用いて,目的関数と制約条件を追加 する.PuLPでは,LpProblemの演算子「+=」を使っ て目的関数と制約条件を数理計画モデルに追加できる:

# 目 的 関 数 (4

m o d e l += s u m ( a l p h a _ p [ g r p _ i d , day , s f t ] f o r g r p _ i d , day , s f t in a l p h a _ p ) + s u m ( a l p h a _ m [ g r p _ i d , day , s f t ] f o r g r p _ i d , day , s f t in a l p h a _ m ) , " O b j "

# 制 約 条 件 (1

f o r r e q in i n s . g r p _ r e q s :

m o d e l += s u m ( x [ nur , r e q . date , r e q . s h i f t ] f o r n u r in g r p _ n u r s [ r e q . g r p _ i d ]) >=

r e q . lb - a l p h a _ m [ r e q . g r p _ i d , r e q . date , r e q . s h i f t ] , " C o n _ l b { : } { : } { : } " . f o r m a t ( r e q . g r p _ i d , r e q . date , r e q . s h i f t )

モデリングが完了した後,問題を解く(スケジューリン グする)段階に入るが,PuLPでは数理計画ソルバー を指定することができる.本稿では,PuLPに付属し

(7)

2 Plotlyのヒートマップによる生成されたスケジュール

ている無料ソルバーCBC (COIN Branch and Cut) を使用する.LpProblemのsolve関数で問題を解く:

s o l v e r = p u l p . s o l v e r s . P U L P _ C B C _ C M D () s t a t u s = m o d e l . s o l v e ( s o l v e r )

solve関数の戻り値(2 行目のstatus)で最適化の状 態が確認できる.また,各変数オブジェクトのvalue() 関数により解(最適解あるいは暫定解)の値が取得で きる.

5.7 Plotlyによるスケジュール描画

本稿のアプリではDashと同じ企業が開発したPlotly を用いて,NSPの計算結果を可視化する.Plotlyは,

静的なグラフ生成などに使われる Matplotlibと比べ て,よりインタラクティブなグラフが生成できるとい う特徴をもつ.

Plotlyは多数の基本チャートをサポートしている6. このうち,Annotated Heatmapを用いてナースのス ケジュールを描画する.Annotated Heatmapの詳し い説明と応用例はplot.lyから確認できる7

紙面の都合上,描画コードの一部のみを掲載する.

5.6節で紹介した問題入力と得られた解をもとに,

x text:日付のリスト(1次元list)

y text:ナースのリスト(1次元list)

z val:各セルの色を表す値の配列(2次元list)

z text:各セル表示するテキストの配列(2次元 list)

colorscale:色と値の対応表

を設定パラメータとしてヒートマップを生成する:

f i g = ff . c r e a t e _ a n n o t a t e d _ h e a t m a p( z_val , x = x _ t e x t , y = y _ t e x t , a n n o t a t i o n _ t e x t= z _ t e x t ,

c o l o r s c a l e= c o l o r s c a l e , f o n t _ c o l o r s =[ ’ black ’] , h o v e r i n f o= ’ none ’ , x g a p =2 , y g a p

= 2 )

6 https://images.plot.ly/plotly- documentation/imag es/python cheat sheet.pdf

7 https://plot.ly/python/annotated heatmap/

f i g . l a y o u t . m a r g i n . u p d a t e ( { " r ": 0 } ) f i g . l a y o u t . x a x i s . u p d a t e ( { " t i c k s ": ’ ’ , "

s h o w g r i d ": F a l s e })

f i g . l a y o u t . y a x i s . u p d a t e ( { " t i c k s ": ’ ’ , "

s h o w g r i d ": F a l s e })

また,2〜4 行のように軸のチックやマージンの設定 ができる.生成した「fig」を用いて,5.5節で紹介し たDCCのGraphコンポーネントをそのまま生成で きる:

d c c . G r a p h ( id =" s c h e d u l e " , f i g u r e = f i g )

ヒートマップで可視化したスケジュールを図 2に 示す.

6.

まとめ

本稿では,Pythonによるクラウドサービスを用い たシステムの構築と題して,PaaS環境のHerokuを用 いた高速な開発サイクルのもとでアプリ開発を行う方 法を示した.また,スケジューリングシステムの構築 時に必要となるであろうさまざまなPythonパッケー ジを紹介した.本稿が,スタッフスケジューリングシ ステムなどのWebアプリケーションを効率的に開発 する助けとなれば望外の喜びである.

参考文献

[1] 池上敦子,『ナース・スケジューリング―問題把握とモデ リング―』,近代科学社,2018.

[2] 久保幹雄,小林和博,斉藤努,並木誠,橋本英樹,『Python 言語によるビジネスアナリティクス―実務家のための最適 化・統計解析・機械学習―』,近代科学社,2016.

表 1 3 交替制勤務表の例 3. ナーススケジューリング 本節では,開発するナーススケジューリングのサポー トシステムについて説明する. ナーススケジューリングとは,病棟で働くナースに 対するシフト勤務表を作成する業務である.池上 [1] の 調査によれば,病棟の現場において勤務表の作成には 平均 6.8 時間を要し,長いときには 30 時間を費す場合 もあると言われている.また,病院の師長が勤務表を 作成するために,休日や勤務終了後のプライベート時 間を利用する事例もよく問題視される. 日本の多くの病院
表 2 使用する Python パッケージ
表 3 Nurse テーブル Nurse +id: Integer +name: String(16) +email: String(128) f r o m s q l a l c h e m y

参照

関連したドキュメント

採 点システムの構築には , XHTML, CSS, JavaScript を 用い,どのような端末でも使用可能とするためにブラ

代表的なブースティング手法の一つにAdaBoost【1】があ  

我々は、 Web3D とストリーミング技術を核とした

したがって, HeadFinder が検出 した情報を活用したシステムを構築することによ り, HeadFinder

したがって, HeadFinder が検出 した情報を活用したシステムを構築することによ り, HeadFinder

ResNet モデルで学習させた時の学習曲線 偽陽性・偽陰性となった画像の内訳を AlexNet モ デルで検討した。偽陽性となった 18

プログラミング用テキストの構成 Python による計測・制御システムのプログラミン

統合パッケージによる情報システム構築のアプローチ