python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
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 返回图片
2.4.3 返回的数据
另外说明: 目前项目环境上用的是8核16G的虚拟机,执行数据量是30万,运行状况良好。
I’m 「软件老王」,如果觉得还可以的话,关注下呗,后续更新秒知!欢迎讨论区、同名公众号留言交流!
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)的更多相关文章
- python相关性算法解决方案(rest/数据库/json/下载)
1. 场景描述 一直做java,因项目原因,需要封装一些经典的算法到平台上去,就一边学习python,一边网上寻找经典算法代码,今天介绍下经典的相关性算法,算法原理就不介绍了,只从代码层面进行介绍,包 ...
- python聚类算法实战详细笔记 (python3.6+(win10、Linux))
python聚类算法实战详细笔记 (python3.6+(win10.Linux)) 一.基本概念: 1.计算TF-DIF TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库 ...
- Python聚类算法之基本K均值实例详解
Python聚类算法之基本K均值实例详解 本文实例讲述了Python聚类算法之基本K均值运算技巧.分享给大家供大家参考,具体如下: 基本K均值 :选择 K 个初始质心,其中 K 是用户指定的参数,即所 ...
- python爬虫数据-下载图片经典案例
'''Urllib 模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据.首先,我们定义了一个getHtml()函数: urllib.urlopen()方法用于打开 ...
- Vue学习笔记十三:Vue+Bootstrap+vue-resource从接口获取数据库数据
目录 前言 SpringBoot提供后端接口 Entity类 JPA操作接口 配置文件 数据库表自动映射,添加数据 写提供数据的接口 跨域问题 前端修改 效果图 待续 前言 Vue学习笔记九的列表案例 ...
- 机器学习(十)—聚类算法(KNN、Kmeans、密度聚类、层次聚类)
聚类算法 任务:将数据集中的样本划分成若干个通常不相交的子集,对特征空间的一种划分. 性能度量:类内相似度高,类间相似度低.两大类:1.有参考标签,外部指标:2.无参照,内部指标. 距离计算:非负性, ...
- 机器学习Sklearn系列:(五)聚类算法
K-means 原理 首先随机选择k个初始点作为质心 1. 对每一个样本点,计算得到距离其最近的质心,将其类别标记为该质心对应的类别 2. 使用归类好的样本点,重新计算K个类别的质心 3. 重复上述过 ...
- 机器学习:Python实现聚类算法(一)之AP算法
1.算法简介 AP(Affinity Propagation)通常被翻译为近邻传播算法或者亲和力传播算法,是在2007年的Science杂志上提出的一种新的聚类算法.AP算法的基本思想是将全部数据点都 ...
- 机器学习:Python实现聚类算法(三)之总结
考虑到学习知识的顺序及效率问题,所以后续的几种聚类方法不再详细讲解原理,也不再写python实现的源代码,只介绍下算法的基本思路,使大家对每种算法有个直观的印象,从而可以更好的理解函数中参数的意义及作 ...
随机推荐
- Excel催化剂开源第7波-VSTO开发中Ribbon动态加载菜单
在VS开发环境中,特别是VSTO的开发,微软已经现成地给开发者准备了设计器模式的功能区开发,相对传统的VBA.ExcelDna和其他方式的COM加载项开发来说,不需要手写xml功能区,直接类似拖拉窗体 ...
- 个人永久性免费-Excel催化剂功能第18波-在Excel上也能玩上词云图
这年头数据可视化日新月异,在Excel上做数据分析,最后一步,难免要搞个图表输出高大上一回,微软也深知此道,在Excel2016上更新了一大波图表功能,市场上很耀眼的词云图还是没加进来,虽然在各大的在 ...
- Python学习3——Python的简单推导
列表推导是一种从其他列表创建列表的方式,类似于数学中的集合推导,列表推导的工作原理非常简单,类似于for循环.(以下代码均在IDLE实现) 最简单的列表推导: >>>[x*x for ...
- [PTA] 1001. 害死人不偿命的(3n+1)猜想 (Basic)
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Sc ...
- 浅谈hosts文件
1.什么是hosts文件?这个文件在哪? hosts文件(域名解析文件)是将主机名映射到IP地址的一个纯文本文件,原始名称是HOSTS.TXT(IP,Internet Protocol,Interne ...
- 针对Nginx日志中出现的漏洞扫描与爬虫的三种措施
0x001 使用fail2ban工具结合防火墙(iptables | firewalld),将大量404请求的IP地址封了.(详见fail2ban使用说明:https://www.cnblogs.co ...
- 今天来聊Java ClassLoader
背景 类加载机制作为一个高频的面试题经常会在面试中被问到,前几天一个电话面试就问到,之前有了解过,但是没有梳理成自己的体系,所以说的有点凌乱,今天花点时间整理一下,分享给大家同时自己也好好梳理一下,顺 ...
- 开发者福音!面向Web场景的云开发服务正式开放!
导 语 继支持小程序开发之后,云开发也支持Web使用啦!开发者们可以使用云开发提供的云端能力,直接开发网站应用,如PC端网页.公众号中的网页等.由此开发者可以在网站应用中借助云函数实现业务逻辑,通过与 ...
- C++ 过滤出字符串的中文(GBK,UTF-8)
最近在处理游戏敏感词之类的东西,为了加强屏蔽处理,所以需要过滤掉字符串中的除汉字之外的是其他东西如数字,符号,英文字母等. 首先我查阅资料并写了个函数: 示例:返回输入字符串中汉字的个数: std:: ...
- Python(简单图形和文件处理)编程
Python确实是一门很简洁而且功能有强大的语言,我觉得开始学习很容易理解,说到熟练和精通还是不容易的,还需不断学习. 从最基础的语法学习,有些部分各种语言是相同的,让人很好理解.编程也是从最简单语法 ...