python相關性演算法解決方案(rest/資料庫/json/下載)

  • 2019 年 10 月 3 日
  • 筆記

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 「軟體老王」,如果覺得還可以的話,關注下唄,後續更新秒知!歡迎討論區、同名公眾號留言交流!