python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)


Posted in Python onAugust 28, 2019

1. 场景描述

一直做java,因项目原因,需要封装一些经典的算法到平台上去,就一边学习python,一边网上寻找经典算法代码,今天介绍下经典的K-means聚类算法,算法原理就不介绍了,只从代码层面进行介绍,包含: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 k_means import exec
import logging
app = Flask(__name__)

#1.服务器上更改为服务器地址,用于存放数据
dirpath = 'E:\\ruanjianlaowang'

#2. 测试连通性,软件老王
@app.route('/')
def index():
  return "Hello, World!"


#3. k-means算法 软件老王
@app.route('/getKmeansInfoByLaowang', methods=['POST'])
def getKmeansInfoByLaowang():
  try:
     result = exec(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)k-means算法 软件老王

(4)文件下载(图片及csv)

(5)启动

2.3 k-means算法类

完整代码:

import pandas as pd
import dbgp as dbgp
from pandas.io import json
from numpy import *
import matplotlib.pyplot as plt
import numpy as np
plt.switch_backend('agg')
import logging

# 执行 软件老王
def exec(params, dirpath):

  #1.获取参数,软件老王
  sql = params.get("sql")
  xlines = params.get("xlines")
  ylines = params.get("ylines")
  xlinesname = params.get("xlinesname")
  ylinesname = params.get("ylinesname")
  grouplinesname = params.get("grouplinesname")

  times = int(params.get("times"))
  groupnum = int(params.get("groupnum"))
  url = params.get("url")
  name = params.get("name")

  #2. 校验是否为空,软件老王
  flag = checkparam(sql, xlines, ylines, times, groupnum)
  if not flag is None and len(flag) != 0:
    return flag

  #3. 从数据库获取数据,软件老王
  try:
    data = dbgp.queryGp(sql)
  except IndexError:
    return sql
  except KeyError:
    return sql
  except ValueError:
    return sql
  except Exception:
    return sql

  if data.empty:
    return "exception:此数据集无数据,请确认后重试"
  #4 调用第三方sklearn的KMeans聚类算法,软件老王
  # data_zs = 1.0 * (data - data.mean()) / data.std() 数据标准化,不需要标准话
  from sklearn.cluster import KMeans
  model = KMeans(n_clusters=groupnum, n_jobs=4, max_iter=times)
  model.fit(data) # 开始聚类

  return export(model, data, data, url, dirpath, name,grouplinesname,xlines, ylines,xlinesname,ylinesname)

  # 5.生成导出excel 软件老王
def export(model, data, data_zs, url, dirpath, name,grouplinesname,xlines, ylines,xlinesname,ylinesname):


  # #详细输出原始数据及其类别
  detail_data = pd.DataFrame().append(data)
  if not grouplinesname is None and len(grouplinesname) != 0:
    detail_data.columns = grouplinesname.split(',')

  r_detail_new = pd.concat([detail_data, pd.Series(model.labels_, index=detail_data.index)], axis=1) # 详细输出每个样本对应的类别
  r_detail_new.columns = list(detail_data.columns) + [u'聚类类别'] # 重命名表头
  outputfile = dirpath + name + '.csv'
  r_detail_new.to_csv(outputfile, encoding='utf_8_sig') # 保存结果


  #重命名表头
  r1 = pd.Series(model.labels_).value_counts() # 统计各个类别的数目
  r2 = pd.DataFrame(model.cluster_centers_) # 找出聚类中心
  r = pd.concat([r2, r1], axis=1) # 横向连接(0是纵向),得到聚类中心对应的类别下的数目
  r.columns = list(data.columns) + [u'类别数目'] # 重命名表头

  return generateimage(r, data_zs, url, dirpath, name,model,xlines, ylines,xlinesname,ylinesname)

#6.生成图片及返回json,软件老王
def generateimage(r, data_zs, url, dirpath, name,model,xlines, ylines,xlinesname,ylinesname):
  image = dirpath + name + '.jpg'

  #6.1 中文处理,软件老王
  plt.rcParams['font.sans-serif'] = ['simhei']
  plt.rcParams['font.family'] = 'sans-serif'
  plt.rcParams['axes.unicode_minus'] = False
  # 6.2 画图,生成图片,软件老王
  labels = model.labels_
  centers = model.cluster_centers_
  data_zs['label'] = labels
  data_zs['label'] = data_zs['label'].astype(np.int)
  # 图标集合
  markers = ['o', 's', '+', 'x', '^', 'v', '<', '>']
  colors = ['b', 'c', 'g', 'k', 'm', 'r', 'y']
  symbols = []
  for m in markers:
    for c in colors:
      symbols.append((m, c))
  # 画每个类别的散点及质心
  for i in range(0, len(centers)):
    df_i = data_zs.loc[data_zs['label'] == i]
    symbol = symbols[i]
    center = centers[i]

    x = df_i[xlines].values.tolist()
    y = df_i[ylines].values.tolist()

    plt.scatter(x, y, marker=symbol[0], color=symbol[1], s=10)
    plt.scatter(center[0], center[1], marker='*', color=symbol[1], s=50)

  plt.title(name)
  plt.xlabel(xlinesname)
  plt.ylabel(ylinesname)
  plt.savefig(image, dpi=150)
  plt.clf()
  plt.close(0)

  # 6.3 返回json数据给前端展示,软件老王
  result = {}
  result['image_url'] = url + '/' + name + '.jpg'
  result['details_url'] = url + '/' + name + '.csv'
  result['data'] = r[:200]  #显示200,多的话,相当于预览
  result = json.dumps(result, ensure_ascii=False)
  result = result.replace('\\', '')
  return result

def checkparam(sql, xlines, ylines, times, groupnum):
  if sql is None or sql.strip() == '' or len(sql.strip()) == 0:
    return "数据集或聚类数据列,不能为空"
  if xlines is None or xlines.strip() == '' or len(xlines.strip()) == 0:
    return "X轴,不能为空"
  if ylines is None or ylines.strip() == '' or len(ylines.strip()) == 0:
    return "Y轴,不能为空"
  if times is None or times <= 0:
    return "聚类个数,不能为空或小于等于0"
  if groupnum is None or groupnum <= 0:
    return "迭代次数,不能为空或小于等于0"

代码说明:

(1)获取参数,软件老王;

(2)校验是否为空,软件老王;

(3)从数据库获取数据,软件老王;

(4)第三方sklearn的KMeans聚类算法,软件老王;

(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/ruanjianlaowang_65652.jpg","details_url":"http://10.192.168.1:5000/ruanjianlaowang_65652.csv","data":{"empno":{"0":7747.2,"1":7699.625,"2":7839.0},"mgr":{"0":7729.8,"1":7745.25,"2":7566.0},"sal":{"0":2855.0,"1":1218.75,"2":5000.0},"comm":{"0":29.5110766,"1":117.383964625,"2":31.281453},"deptno":{"0":20.0,"1":25.0,"2":10.0},"类别数目":{"0":5,"1":8,"2":1}}}

2.4.2 返回图片

python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)

2.4.3 返回的数据

python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)

另外说明: 目前项目环境上用的是8核16G的虚拟机,执行数据量是30万,运行状况良好。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python操作MySQL数据库具体方法
Oct 28 Python
Python二维码生成库qrcode安装和使用示例
Dec 16 Python
Django实现自定义404,500页面教程
Mar 26 Python
浅谈python函数之作用域(python3.5)
Oct 27 Python
浅析Git版本控制器使用
Dec 10 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
python存储16bit和32bit图像的实例
Dec 05 Python
基于python3 的百度图片下载器的实现代码
Nov 05 Python
基于python图书馆管理系统设计实例详解
Aug 05 Python
Python+Xlwings 删除Excel的行和列
Dec 19 Python
Python 中数组和数字相乘时的注意事项说明
May 10 Python
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
Jun 08 Python
Numpy的简单用法小结
Aug 28 #Python
Python 通过截图匹配原图中的位置(opencv)实例
Aug 27 #Python
Python 转换文本编码实现解析
Aug 27 #Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 #Python
python定位xpath 节点位置的方法
Aug 27 #Python
python实现截取屏幕保存文件,删除N天前截图的例子
Aug 27 #Python
python自动化UI工具发送QQ消息的实例
Aug 27 #Python
You might like
如何设置mysql允许外网访问
2013/06/04 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
smarty自定义函数用法示例
2016/05/20 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
Laravel 5+ .env环境配置文件详解
2020/04/06 PHP
js中document.getElementByid、document.all和document.layers区分介绍
2011/12/08 Javascript
js日历功能对象
2012/01/12 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
Bootstrap网格系统详解
2016/04/26 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
2016/08/01 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
微信小程序movable view移动图片和双指缩放实例代码
2017/08/08 Javascript
JavaScript中call和apply方法的区别实例分析
2018/08/03 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
Python编程入门的一些基本知识
2015/05/13 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
django框架使用orm实现批量更新数据的方法
2019/06/21 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
Pytorch反向求导更新网络参数的方法
2019/08/17 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
计算机专业学生的自我评价
2013/12/15 职场文书
毕业生自荐书模版
2014/01/04 职场文书
大学生职业生涯规划书汇总
2014/03/20 职场文书
《开国大典》教学反思
2014/04/19 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
情况说明书格式及范文
2019/06/24 职场文书
各种货币符号快捷输入
2022/02/17 杂记
ubuntu下常用apt命令介绍
2022/06/05 Servers