ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

flaskを使ってpythonでWebAPIを提供する

2018-01-29 10:37:30 | Weblog
前にPythonで、アソシエーション分析を行ったけど、
これを、WebAPIとして提供する方法。




■お題
 指定されたデータに対して、あらかじめ、アソシエーション分析を行い、
 ある商品(以下、対象商品という)が指定されたら、
 その商品をlhsに含むアソシエーションルールを返すWebAPIを提供する

※「○○を買っている人は、XXも買っているとき」
  ○○をlhs
  XXをrhs
 と、以下述べる。lhs,rhsは、1商品とは限らない
 「A,Bを買っている人は、C,D,Eも買う」という組み合わせもOK




■今回の実装の仕様
・入力ファイルは、Rのアソシエーション分析パッケージarulesのなかにある
 GroceriesをCSV書き出ししたものを使う(拡張子を.basketにする)
・サーバー立ち上げ時に上記ファイルを読み込み、アソシエーション分析する
・WebAPIの仕様は、以下の通り
  エンドポイント/getList/対象商品名
 エンドポイントは今回 http://127.0.0.1:5000
・結果はJSON形式でルールのリストの形で返す
 各ルールは、以下の項目の連想配列とする
   lhs
   rhs
   support 支持度
   lift  リフト
   confidence 確信度

【詳細仕様】
・WebAPIを作成するのに、flaskを使う
・基本的に以下のエントリのプログラムを修正して使う

Pythonでのアソシエーション分析
http://blog.goo.ne.jp/xmldtp/e/73fa1d4da410cb2f1cd3eb0f88dc1a54

 また、このエントリで書いた、インストール、データファイル作成はされているものとする
・Windows7に入れたPythonで実行している。実行環境の作り方は
Windowsでのpythonとgitインストール
http://blog.goo.ne.jp/xmldtp/e/38be875ddbd9ebf826fb4821db3b7317
 を参照




■手順
・flaskインストール
・プログラム作成
・起動




■flaskインストール
コマンドラインから
pip install flask
を実行する




■プログラム作成
ソースコードは、以下の通り
# -*- coding: utf-8 -*-
from flask import Flask, jsonify
import Orange
from orangecontrib.associate.fpgrowth import *

#共通変数
datafname = "C:\\Users\\Panasonic\\Desktop\\zikken\\assoc\\source.basket"  # データファイル
assoclist = []   # 結果格納

######################################
# アソシエーション分析を立ち上げ時に行う

print("アソシエーション分析開始")

#データの読み込み
tbl = Orange.data.Table(datafname)

#分析実行
X, mapping = OneHot.encode(tbl)
itemsets = dict(frequent_itemsets(X, 5))
rules = association_rules(itemsets, 0.7)
stats = rules_stats(rules, itemsets, len(X))

def decode_onehot(d):
	items = OneHot.decode(d, tbl, mapping)
	return list(map(lambda v: v[1].name, items))

#結果保存
for s in stats :
	lhs = decode_onehot(s[0])
	rhs = decode_onehot(s[1])
	rec = {"lhs":lhs,"rhs":rhs,"support":s[2],"confidence":s[3],"lift":s[6]}
	assoclist.append(rec)

print("アソシエーション分析終了")


######################################
# REST API

api = Flask(__name__)

# アソシエーションルール取得
# 引数は、対象とする商品
@api.route('/getList/<string:shohin>')
def getList(shohin):
	kekka = []
	for rec in assoclist :
		if shohin in rec["lhs"] :
			kekka.append(rec)
	return jsonify(kekka)

#エラー時のリターン
@api.errorhandler(404)
def not_found(error):
    return jsonify({'error': 'Not found'}), 404

#サーバー起動
if __name__ == '__main__':
    api.run()


これを、今回は、assoctest1.pyという名前で保存した。

※注意
 flask.pyという名前で保存しないこと。
 この名前で保存すると、以下のエラーになる

Traceback (most recent call last):
File "flask.py", line 2, in <module>
from flask import Flask, jsonify
File "C:\Users\Panasonic\Desktop\zikken\assoc\flask.py", line 2, in <module>
from flask import Flask, jsonify
ImportError: cannot import name 'Flask'

 くわしくは
https://qiita.com/AkiyoshiOkano/items/3108d1b7dac9437979c2
 参照




■実行
 データファイルを上記プログラムのdatafnameで指定したところにおいて
 (注意:拡張子は必ず.basketのこと)

コマンドラインから
・assoctest1.pyがあるフォルダにcdして
・python assoctest1.py
を実行する。メッセージがでて、とまるので、そうしたら、ブラウザで
getListを呼び出す。
たとえば
 http://127.0.0.1:5000/getList/tidbits
など

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする