import gradio as gr import pandas as pd from slider import create_subset_ratios_tab from change_output import change_file import requests import os import shutil import json import pandas as pd import subprocess import plotly.express as px def on_confirm(dataset_radio, num_parts_dropdown, token_counts_radio, line_counts_radio, cyclomatic_complexity_radio, problem_type_radio): # 根据用户选择的参数构建文件路径 num_parts = num_parts_dropdown token_counts_split = token_counts_radio line_counts_split = line_counts_radio cyclomatic_complexity_split = cyclomatic_complexity_radio # 读取数据 dataframes = [] if token_counts_split=="Equal Frequency Partitioning": token_counts_df = pd.read_csv(f"E:/python-testn/pythonProject3/hh_1/dividing_into_different_subsets/{num_parts}/QS/token_counts_QS.csv") dataframes.append(token_counts_df) if line_counts_split=="Equal Frequency Partitioning": line_counts_df = pd.read_csv(f"E:/python-testn/pythonProject3/hh_1/dividing_into_different_subsets/{num_parts}/QS/line_counts_QS.csv") dataframes.append(line_counts_df) if cyclomatic_complexity_split=="Equal Frequency Partitioning": cyclomatic_complexity_df = pd.read_csv(f"E:/python-testn/pythonProject3/hh_1/dividing_into_different_subsets/{num_parts}/QS/CC_QS.csv") dataframes.append(cyclomatic_complexity_df) #以下改为直接从一个划分文件中读取即可 # if problem_type_radio: # problem_type_df = pd.read_csv(f"{num_parts}/problem_type_{problem_type_split}.csv") # dataframes.append(problem_type_df) # 如果所有三个radio都有value,将三个文件中的所有行拼接 if len(dataframes) > 0: combined_df = dataframes[0] for df in dataframes[1:]: combined_df = pd.merge(combined_df, df, left_index=True, right_index=True, suffixes=('', '_y')) combined_df = combined_df.loc[:, ~combined_df.columns.str.endswith('_y')] # 去除重复的列 return combined_df else: return pd.DataFrame() # 定义一个函数来返回数据 # def show_data(line_counts, token_counts, cyclomatic_complexity, problem_type, show_high, show_medium, show_low): # columns = ["Model"] # # if token_counts: # if show_high: # columns.append("Token Counts.I") # # if show_medium: # columns.append("Token Counts.II") # if show_low: # columns.append("Token Counts.III") # if line_counts: # if show_high: # columns.append("Line Counts.I") # if show_medium: # columns.append("Line Counts.II") # if show_low: # columns.append("Line Counts.III") # if cyclomatic_complexity: # if show_high: # columns.append("Cyclomatic Complexity.I") # if show_medium: # columns.append("Cyclomatic Complexity.II") # if show_low: # columns.append("Cyclomatic Complexity.III") # if problem_type: # columns.extend(["Problem Type_String", "Problem Type_Math", "Problem Type_Array"]) # return data[columns] #用于更新数据文件的部分 def execute_specified_python_files(directory_list, file_list): for directory in directory_list: for py_file in file_list: file_path = os.path.join(directory, py_file) if os.path.isfile(file_path) and py_file.endswith('.py'): print(f"Executing {file_path}...") try: # 使用subprocess执行Python文件 subprocess.run(['python', file_path], check=True) print(f"{file_path} executed successfully.") except subprocess.CalledProcessError as e: print(f"Error executing {file_path}: {e}") else: print(f"File {file_path} does not exist or is not a Python file.") # 定义一个函数来生成 CSS 样式 def generate_css(line_counts, token_counts, cyclomatic_complexity, problem_type, show_high, show_medium, show_low): css = """ #dataframe th { background-color: #f2f2f2 } """ colors = ["#e6f7ff", "#ffeecc", "#e6ffe6", "#ffe6e6"] categories = [line_counts, token_counts, cyclomatic_complexity] category_index = 0 column_index = 1 for category in categories: if category: if show_high: css += f"#dataframe td:nth-child({column_index + 1}) {{ background-color: {colors[category_index]}; }}\n" column_index += 1 if show_medium: css += f"#dataframe td:nth-child({column_index + 1}) {{ background-color: {colors[category_index]}; }}\n" column_index += 1 if show_low: css += f"#dataframe td:nth-child({column_index + 1}) {{ background-color: {colors[category_index]}; }}\n" column_index += 1 category_index += 1 # 为 Problem Type 相关的三个子列设置固定颜色 if problem_type: problem_type_color = "#d4f0fc" # 你可以选择任何你喜欢的颜色 css += f"#dataframe td:nth-child({column_index + 1}) {{ background-color: {problem_type_color}; }}\n" css += f"#dataframe td:nth-child({column_index + 2}) {{ background-color: {problem_type_color}; }}\n" css += f"#dataframe td:nth-child({column_index + 3}) {{ background-color: {problem_type_color}; }}\n" # 隐藏 "data" 标识 css += """ .gradio-container .dataframe-container::before { content: none !important; } """ return css # def update_dataframe(line_counts, token_counts, cyclomatic_complexity, problem_type, show_high, show_medium, # show_low): # df = show_data(line_counts, token_counts, cyclomatic_complexity, problem_type, show_high, show_medium, show_low) # css = generate_css(line_counts, token_counts, cyclomatic_complexity, problem_type, show_high, show_medium, # show_low) # return gr.update(value=df), gr.update(value=f"") def generate_file(file_obj, user_string, user_number,dataset_choice): tmpdir = 'tmpdir' print('临时文件夹地址:{}'.format(tmpdir)) FilePath = file_obj.name print('上传文件的地址:{}'.format(file_obj.name)) # 输出上传后的文件在gradio中保存的绝对地址 # 将文件复制到临时目录中 shutil.copy(file_obj.name, tmpdir) # 获取上传Gradio的文件名称 FileName = os.path.basename(file_obj.name) print(FilePath) # 获取拷贝在临时目录的新的文件地址 # 打开复制到新路径后的文件 with open(FilePath, 'r', encoding="utf-8") as file_obj: # 在本地电脑打开一个新的文件,并且将上传文件内容写入到新文件 outputPath = os.path.join('F:/Desktop/test', FileName) data = json.load(file_obj) print("data:", data) # 将数据写入新的 JSON 文件 with open(outputPath, 'w', encoding="utf-8") as w: json.dump(data, w, ensure_ascii=False, indent=4) # 读取文件内容并上传到服务器 file_content = json.dumps(data) # 将数据转换为 JSON 字符串 url = "http://localhost:6222/submit" # 替换为你的后端服务器地址 files = {'file': (FileName, file_content, 'application/json')} payload = { 'user_string': user_string, 'user_number': user_number, 'dataset_choice':dataset_choice } response = requests.post(url, files=files, data=payload) print(response) #返回服务器处理后的文件 if response.status_code == 200: # 获取服务器返回的 JSON 数据 output_data = response.json() # 保存 JSON 数据到本地 output_file_path = os.path.join('E:/python-testn/pythonProject3/hh_1/evaluate_result', 'new-model.json') with open(output_file_path, 'w', encoding="utf-8") as f: json.dump(output_data, f, ensure_ascii=False, indent=4) print(f"File saved at: {output_file_path}") # 调用更新数据文件的函数 directory_list = ['/path/to/directory1', '/path/to/directory2'] # 替换为你的目录路径列表 file_list = ['file1.py', 'file2.py', 'file3.py'] # 替换为你想要执行的Python文件列表 execute_specified_python_files(directory_list, file_list) return {"status": "success", "message": "File received and saved"} else: return {"status": "error", "message": response.text} # 返回服务器响应 return {"status": "success", "message": response.text} def update_radio_options(token_counts, line_counts, cyclomatic_complexity, problem_type): options = [] if token_counts: options.append("Token Counts in Prompt") if line_counts: options.append("Line Counts in Prompt") if cyclomatic_complexity: options.append("Cyclomatic Complexity") if problem_type: options.append("Problem Type") return gr.update(choices=options) def plot_csv(radio,num): # 读取本地的CSV文件 #token_counts_df = pd.read_csv(f"{num_parts}/QS/token_counts_QS.csv") if radio=="Line Counts in Prompt": radio_choice="line_counts" file_path = f'E:/python-testn/pythonProject3/hh_1/dividing_into_different_subsets/{num}/QS/{radio_choice}_QS.csv' elif radio=="Token Counts in Prompt": radio_choice="token_counts" file_path = f'E:/python-testn/pythonProject3/hh_1/dividing_into_different_subsets/{num}/QS/{radio_choice}_QS.csv' elif radio=="Cyclomatic Complexity": radio_choice="CC" file_path = f'E:/python-testn/pythonProject3/hh_1/dividing_into_different_subsets/{num}/QS/{radio_choice}_QS.csv' elif radio=="Problem Type": radio_choice="problem_type" file_path = f'E:/python-testn/pythonProject3/hh_1/dividing_into_different_subsets/cata_result.csv' print("test!") # file_path="E:/python-testn/pythonProject3/hh_1/dividing_into_different_subsets/3/QS/CC_QS.csv" df = pd.read_csv(file_path) # 将第一列作为索引 df.set_index('Model', inplace=True) # 转置数据框,使得模型作为列,横轴作为行 df_transposed = df.T # 使用plotly绘制折线图 fig = px.line(df_transposed, x=df_transposed.index, y=df_transposed.columns, title='Model Evaluation Results', labels={'value': 'Evaluation Score', 'index': 'Evaluation Metric'}, color_discrete_sequence=px.colors.qualitative.Plotly) # 设置悬停效果 fig.update_traces(hovertemplate='%{y}') return fig # 创建 Gradio 界面 with gr.Blocks() as iface: gr.HTML("""