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/') 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/') 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/') 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/') 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')