116 lines
3.9 KiB
Python
116 lines
3.9 KiB
Python
|
from threading import Lock
|
|||
|
|
|||
|
import pandas as pd
|
|||
|
import requests
|
|||
|
from flask import Flask, send_file, make_response, session, request
|
|||
|
from matplotlib import rcParams
|
|||
|
from redis import Redis
|
|||
|
|
|||
|
from pca import plot_pca_scatter
|
|||
|
from radarref import plot_radar
|
|||
|
from similarity import row_correlations, row_euclidean_distances, calculate_similarity, plot_similarity_heatmap, \
|
|||
|
plot_similarity_network
|
|||
|
|
|||
|
# 全局设置中文字体
|
|||
|
rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体
|
|||
|
rcParams['axes.unicode_minus'] = False # 解决坐标轴负号显示问题
|
|||
|
|
|||
|
app = Flask(__name__)
|
|||
|
redis_client = Redis(host='localhost', port=6379, db=0, password="7ZH2jxM1")
|
|||
|
lock = Lock()
|
|||
|
|
|||
|
|
|||
|
def handleGetData(taskId, ids):
|
|||
|
# 获取键对应的值
|
|||
|
content = redis_client.get(f'{taskId}:{ids}')
|
|||
|
if content:
|
|||
|
print(f"获取到了{{taskId}}数据---------------")
|
|||
|
return content
|
|||
|
if ids.find(",") != -1:
|
|||
|
new_ids = [int(item) for item in ids.split(",")]
|
|||
|
else:
|
|||
|
new_ids = [] if ids == '' else [int(ids)]
|
|||
|
resp = requests.post(f"http://localhost:8069/prod-api/ggpx/TaskData/toEXCEL2",
|
|||
|
{"taskId": taskId,
|
|||
|
'ids': new_ids})
|
|||
|
# 设置键值对
|
|||
|
redis_client.set(f'{taskId}:{ids}', resp.content, 5)
|
|||
|
return resp.content
|
|||
|
|
|||
|
|
|||
|
@app.route('/')
|
|||
|
def index():
|
|||
|
return 'Hello World'
|
|||
|
|
|||
|
|
|||
|
@app.route('/statistics/radar/<id>')
|
|||
|
def radar(id):
|
|||
|
ids = request.args.get('ids', '')
|
|||
|
# 一个行名为样本名,列名为指标名的pd.dataframe
|
|||
|
data = pd.read_excel(handleGetData(id, ids), index_col=0)
|
|||
|
# 任务设置的每个指标的最大值
|
|||
|
max_values = [10, 15, 15, 10, 15, 5, 10, 10, 5, 5] # 示例最大值向量
|
|||
|
while True:
|
|||
|
with lock:
|
|||
|
# 使用这个函数
|
|||
|
img_bytes = plot_radar(data, max_values)
|
|||
|
# 创建响应对象
|
|||
|
response = make_response(img_bytes.read())
|
|||
|
response.headers['Content-Type'] = 'image/png'
|
|||
|
return response
|
|||
|
|
|||
|
|
|||
|
@app.route('/statistics/pca/<id>')
|
|||
|
def pca(id):
|
|||
|
ids = request.args.get('ids', '')
|
|||
|
# 一个行名为样本名,列名为指标名的pd.dataframe
|
|||
|
data = pd.read_excel(handleGetData(id, ids), index_col=0)
|
|||
|
while True:
|
|||
|
with lock:
|
|||
|
# 生成散点图,带上标签
|
|||
|
img_bytes = plot_pca_scatter(data, labels=data.index)
|
|||
|
# 创建响应对象
|
|||
|
response = make_response(img_bytes.read())
|
|||
|
response.headers['Content-Type'] = 'image/png'
|
|||
|
return response
|
|||
|
|
|||
|
|
|||
|
@app.route('/statistics/similarity/<id>')
|
|||
|
def similarity(id):
|
|||
|
ids = request.args.get('ids', '')
|
|||
|
# 一个行名为样本名,列名为指标名的pd.dataframe
|
|||
|
matrix = pd.read_excel(handleGetData(id, ids), index_col=0)
|
|||
|
# 调用函数
|
|||
|
correlation_result = row_correlations(matrix)
|
|||
|
while True:
|
|||
|
with lock:
|
|||
|
# 绘制相关系数热力图
|
|||
|
img_bytes = plot_similarity_heatmap(correlation_result)
|
|||
|
# 创建响应对象
|
|||
|
response = make_response(img_bytes.read())
|
|||
|
response.headers['Content-Type'] = 'image/png'
|
|||
|
return response
|
|||
|
|
|||
|
|
|||
|
@app.route('/statistics/similarity2/<id>')
|
|||
|
def similarity2(id):
|
|||
|
ids = request.args.get('ids', '')
|
|||
|
# 示例矩阵,和之前的扇形图要求一样
|
|||
|
matrix = pd.read_excel(handleGetData(id, ids), index_col=0)
|
|||
|
# 调用函数
|
|||
|
correlation_result = row_correlations(matrix)
|
|||
|
distance_result = row_euclidean_distances(matrix)
|
|||
|
similarity_result = calculate_similarity(correlation_result, distance_result)
|
|||
|
while True:
|
|||
|
with lock:
|
|||
|
# 绘制相似度网络图
|
|||
|
img_bytes = plot_similarity_network(similarity_result, threshold=0.5)
|
|||
|
# 创建响应对象
|
|||
|
response = make_response(img_bytes.read())
|
|||
|
response.headers['Content-Type'] = 'image/png'
|
|||
|
return response
|
|||
|
|
|||
|
|
|||
|
if __name__ == '__main__':
|
|||
|
app.run(threaded=True, host='0.0.0.0')
|