前に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
を実行する
■プログラム作成
ソースコードは、以下の通り
これを、今回は、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
など
これを、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
など