python相關性演算法解決方案(rest/資料庫/json/下載)
1. 場景描述
一直做java,因專案原因,需要封裝一些經典的演算法到平臺上去,就一邊學習python,一邊網上尋找經典演算法程式碼,今天介紹下經典的相關性演算法,演算法原理就不介紹了,只從程式碼層面進行介紹,包含:rest介面、連線mpp資料庫、回傳json資料、下載圖片及資料。(python聚類演算法解決方案(rest介面/連線mpp資料庫/回傳json資料/下載圖片及資料))
2. 解決方案
2.1 專案套路
(1)python經典演算法是單獨的伺服器部署,提供rest接口出來,供java平臺呼叫,互動的方式是http+json;
(2)資料從mpp資料庫-Greenplum中獲取;
(3)返回的資料包括三個:1是生成相關性圖片的地址;2是相關性專案完整資料地址;3是返回給前端的200條json預覽資料。
2.2 restapi類
分兩個類,第一個是restapi類,封裝rest介面類,其他的經典演算法在這裡都有對應的方法,是個公共類。
完整程式碼:
# -*- coding: utf-8 -*- from flask import Flask, request, send_from_directory from relation import execRelation import logging app = Flask(__name__) #1. 伺服器上更改為伺服器地址,用於存放資料 dirpath = 'E:\\ruanjianlaowang' #2. 測試連通性,軟體老王 @app.route('/') def index(): return "Hello, World!" #3. 相關性演算法 @app.route('/getRelationInfoByLaowang', methods=['POST']) def getRelationInfoByLaowang(): try: result = execRelation(request.get_json(), dirpath) except IndexError as e: logging.error(str(e)) return 'exception:' + str(e) except KeyError as e: logging.error(str(e)) return 'exception:' + str(e) except ValueError as e: logging.error(str(e)) return 'exception:' + str(e) except Exception as e: logging.error(str(e)) return 'exception:' + str(e) else: return result #4.檔案下載(圖片及csv) @app.route("/<path:filename>") def getImages(filename): return send_from_directory(dirpath, filename, as_attachment=True) #5.啟動 if __name__ == '__main__': app.run(host="0.0.0.0", port=5000, debug=True)
程式碼說明:
使用的是第三方的flask提供的rest服務
(1)伺服器上更改為伺服器地址,用於存放資料
(2)測試連通性,軟體老王
(3)相關性演算法 軟體老王
(4)檔案下載(圖片及csv)
(5)啟動
2.3 相關性演算法類
完整程式碼:
import matplotlib.pyplot as plt import seaborn as sns import dbgp as dbgp plt.switch_backend('agg') from pandas.io import json import numpy as np # 執行 軟體老王 def execRelation(params, dirpath): # 1.獲取引數,軟體老王 sql = params.get("sql") url = params.get("url") name = params.get("name") grouplinesname = params.get("grouplinesname") #2. 校驗是否為空,軟體老王 flag = checkparam(sql) if not flag is None and len(flag) != 0: return flag # 3. 從資料庫獲取資料,軟體老王 try: new_data = dbgp.queryGp(sql) except IndexError: return sql except KeyError: return sql except ValueError: return sql except Exception: return sql if new_data.empty: return "exception:此資料集無資料,請到資料處理或視覺化確認後重試" # 4 相關性呼叫,軟體老王 if not grouplinesname is None and len(grouplinesname) != 0: new_data.columns = grouplinesname.split(',') corr = new_data.corr() # 5.生成匯出excel 軟體老王 outputfile = dirpath + name + '.csv' corr.to_csv(outputfile, encoding='utf_8_sig') # 儲存結果 #6.生成圖片及返回json,軟體老王 # 6.1 中文處理,軟體老王 plt.rcParams['font.sans-serif'] = ['simhei'] plt.rcParams['font.family'] = 'sans-serif' plt.rcParams['axes.unicode_minus'] = False # 6.2 畫圖,生成圖片,軟體老王 f, ax = plt.subplots(figsize=(14, 10)) mask = np.zeros_like(corr) mask[np.triu_indices_from(mask)] = True cmap = sns.cubehelix_palette(n_colors=6, start=0, rot=0.4, gamma=1.0, hue=0.8, light=0.85, dark=0.15, reverse=False, as_cmap=False) sns.heatmap(corr, cmap=cmap, square=False, linewidths=0.05, ax=ax, annot=True) # 6.3 返回json資料給前端展示,軟體老王 ax.set_title(name) image = dirpath + name + '.jpg' f.savefig(image, dpi=150, bbox_inches='tight') plt.clf() plt.close(0) # 6.3 返回json資料給前端展示,軟體老王 result = {} result['image_url'] = url + '/' + name + '.jpg' result['details_url'] = url + '/' + name + '.csv' result['data'] = corr[:200] result = json.dumps(result, ensure_ascii=False) result = result.replace('\\', '') return result def checkparam(sql): if sql is None or sql.strip() == '' or len(sql.strip()) == 0: return "資料集或資料列,不能為空"
程式碼說明:
(1)獲取引數,軟體老王;
(2)校驗是否為空,軟體老王;
(3)從資料庫獲取資料,軟體老王;
(4)相關性呼叫,軟體老王;
(5)生成匯出excel 軟體老王
(6)生成圖片及返回json,軟體老王
(6.1) 中文處理,軟體老王
(6.2) 畫圖,生成圖片,軟體老王
(6.3) 返回json資料給前端展示,軟體老王
2.4 執行效果
2.4.1 json返回
{"image_url":"http://10.192.168.1:5000/relation-軟體老王-5656556111.jpg","details_url":"http://10.192.168.1:5000/relation-軟體老王-5656556111.csv","data":{"老王1":{"老王1":1.0,"老王2":-0.4202351976,"老王3":0.2285667348,"老王4":-0.4980851314,"老王5":-0.3329292459},"老王2":{"老王1":-0.4202351976,"老王2":1.0,"老王3":-0.4460527829,"老王4":-0.091612708,"老王5":-0.033863611},"老王3":{"老王1":0.2285667348,"老王2":-0.4460527829,"老王3":1.0,"老王4":-0.2253017703,"老王5":-0.451881358},"老王4":{"老王1":-0.4980851314,"老王2":-0.091612708,"老王3":-0.2253017703,"老王4":1.0,"老王5":0.3636169126},"老王5":{"老王1":-0.3329292459,"老王2":-0.033863611,"老王3":-0.451881358,"老王4":0.3636169126,"老王5":1.0}}}
2.4.2 返回圖片
2.4.3 返回的資料
另外說明: 目前專案環境上用的是8核16G的虛擬機器,執行資料量是30萬,執行狀況良好。
I’m 「軟體老王」,如果覺得還可以的話,關注下唄,後續更新秒知!歡迎討論區、同名公眾號留言交流