• 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 「软件老王」,如果觉得还可以的话,关注下呗,后续更新秒知!欢迎讨论区、同名公众号留言交流!

  • 相关阅读:
    算法导论
    深度探索C++对象模型
    git 介绍及其使用总结
    前端跨域常见的几种方式
    前端面试angular 常问问题总结
    低版本浏览器支持HTML5标签的方法
    理解 angular 的路由功能
    Angular 新手容易碰到的坑
    Angular 新手容易碰到的坑
    一 Unicode和UTF-8的异同
  • 原文地址:https://www.cnblogs.com/ruanjianlaowang/p/11424252.html
Copyright © 2020-2023  润新知