git_issue/get_analysis_result.py

203 lines
8.2 KiB
Python

import helper
import csv
import dao
__author__ = 'mac'
def analysis_process(project_id,method):
project_name = project_id
path = 'result/'+project_name+'/'+method+'/'
path_analysis = path + 'analysis/'
# path_data = path + 'data/'
csv_result = file(path_analysis + 'precision_method.csv', 'rb')
result_reader = csv.reader(csv_result)
csv_analysis = file(path_analysis + 'analysis.csv', 'wb')
writer_analysis = csv.writer(csv_analysis)
# writer_classifier.writerow(['classifier infomation for project:',repr(project_name)])
break_count = 20 # cut the different, len(threshold)
change_break = 20 # cut the condition for changing class
count_base = [0]*break_count
right_base = [0]*break_count
count_base2 = [0]*break_count
right_base2 = [0]*break_count
right_mine1 = [([0] * change_break) for i in range(break_count)]
right_mine2 = [([0] * change_break) for i in range(break_count)]
right_mine3 = [([0] * change_break) for i in range(break_count)]
right_mine4 = [([0] * change_break) for i in range(break_count)]
result_set = [count_base,right_base,count_base2,right_base2,right_mine1,right_mine2,right_mine3,right_mine4]
status = [-1,0]
# get data from line according to status
def get_data_from_line(line_info,status):
if status[0] == 0:
result_set[0] = [each for each in line_info]
elif status[0] == 1:
result_set[1] = [each for each in line_info]
elif status[0] == 2:
result_set[2] = [each for each in line_info]
elif status[0] == 3:
result_set[3] = [each for each in line_info]
elif status[0] == 4:
result_set[4][status[1]] = [each for each in line_info]
elif status[0] == 5:
result_set[5][status[1]] = [each for each in line_info]
elif status[0] == 6:
result_set[6][status[1]] = [each for each in line_info]
elif status[0] == 7:
result_set[7][status[1]] = [each for each in line_info]
def handle_line(line, status):
if line[0] == "base count for all:":
status[0]=0
status[1]=0
elif line[0]=="base right count for all:":
status[0]=1
status[1]=0
elif line[0]=="base count for threshold:":
status[0]=2
status[1]=0
elif line[0]=="base right count for threshold:":
status[0]=3
status[1]=0
elif line[0]=="right count of mine method 1 for each threshold:":
status[0]=4
status[1]=0
elif line[0]=="right count of mine method 2 for each threshold:":
status[0]=5
status[1]=0
elif line[0]=="right count of mine method 3 for each threshold:":
status[0]=6
status[1]=0
elif line[0]=="right count of mine method 4 for each threshold:":
status[0]=7
status[1]=0
else:
get_data_from_line(line,status)
status[1]=status[1]+1
for line in result_reader:
handle_line(line,status)
# print(result_set[4])
right_max = []
right_max_index = []
right_max_methold_index = []
final_threshold = 0
for ind_threshold in range(break_count):
count_base_temp = result_set[2][ind_threshold]
right_base_temp = result_set[3][ind_threshold]
index_for_methold = []
right_methold_1 = max([int(i) for i in result_set[4][ind_threshold]])
index_for_methold.append([int(i) for i in result_set[4][ind_threshold]].index(right_methold_1))
right_methold_2 = max([int(i) for i in result_set[5][ind_threshold]])
index_for_methold.append([int(i) for i in result_set[5][ind_threshold]].index(right_methold_2))
right_methold_3 = max([int(i) for i in result_set[6][ind_threshold]])
index_for_methold.append([int(i) for i in result_set[6][ind_threshold]].index(right_methold_3))
right_methold_4 = max([int(i) for i in result_set[7][ind_threshold]])
index_for_methold.append([int(i) for i in result_set[7][ind_threshold]].index(right_methold_4))
# get max right count
right_methold_max = max([right_methold_1,right_methold_2,right_methold_3,right_methold_4])
# record max right count
right_max.append(right_methold_max)
# record methold index of max right count
right_max_methold_index.append([right_methold_1,right_methold_2,right_methold_3,right_methold_4].index(right_methold_max))
# record index of methold for max right count
right_max_index.append(index_for_methold[right_max_methold_index[ind_threshold]])
if right_methold_max > int(right_base_temp):
final_threshold = ind_threshold
diff = [0]*break_count
temp = 0
final_threshold_temp = 0
max_temp = 0
hard_count = helper.read_hard_count(project_id,method)[0]
for ind_threshold in range(final_threshold+1):
temp = temp +int(right_max[ind_threshold]) - int(result_set[3][ind_threshold])
diff[ind_threshold] = temp
# if int(result_set[2][ind_threshold]) == 0 or (int(right_max[ind_threshold]) - int(result_set[3][ind_threshold]))*1.0/int(result_set[2][ind_threshold]) >= 0.05:
# final_threshold_temp = ind_threshold
if int(result_set[0][ind_threshold]) < int(hard_count):
final_threshold_temp = ind_threshold + 1
count_improve = max(diff[0:final_threshold_temp+1])
final_threshold = final_threshold_temp
writer_analysis.writerow(['precision improve:', count_improve*1.0/int(result_set[0][-1])])
writer_analysis.writerow(['count improve:', count_improve])
writer_analysis.writerow(['final threshold:', final_threshold])
writer_analysis.writerow(['final method right count:'])
writer_analysis.writerow([i for i in right_max])
writer_analysis.writerow(['final methold index for right count:'])
writer_analysis.writerow([i for i in right_max_methold_index])
writer_analysis.writerow(['final index of methold for right count:'])
writer_analysis.writerow([i for i in right_max_index])
if int(result_set[0][final_threshold]) == 0:
r1 = 0
else:
r1 = count_improve*1.0/int(result_set[0][final_threshold])
return count_improve*1.0/int(result_set[0][-1]),r1,\
result_set[0][-1],result_set[0][final_threshold]
def handle_project(line,method):
# method = 'svm2'
final_path = 'final2/'
helper.mkdir(final_path)
f_all_precision = file(final_path + 'precision_'+method+'.csv','a')
writer_final = csv.writer(f_all_precision)
precision_improve = []
precision_machine = []
p_id = []
print(line[0])
p_id.append(line[0])
temp = analysis_process(line[0],method)
precision_improve.append(temp)
precision_machine.append(helper.get_precision(line[0],method))
proj_infos = dao.get_proj_name_by_id(line[0])
for proj_info in proj_infos:
proj_name = proj_info[0]
# nb = helper.get_result_by_classifier('nb-result',line[0])
# rf = helper.get_result_by_classifier('rf-result',line[0])
# lrl1 = helper.get_result_by_classifier('lrl1-result',line[0])
# lrl2 = helper.get_result_by_classifier('lrl2-result',line[0])
# et = helper.get_result_by_classifier('nb-result',line[0])
# et_1000 = helper.get_result_by_classifier('nb-result',line[0])
# adaboost = helper.get_result_by_classifier('nb-result',line[0])
# data = (line[0],line[1],proj_name,analysis_process(line[0]),helper.get_precision(line[0]),et,et_1000,rf,nb,lrl1,lrl2,adaboost)
data = (line[0],line[1],proj_name,temp[0],temp[1],helper.get_precision(line[0],method),temp[2],temp[3])
writer_final.writerow(data)
# classifier_process(line[0])
f_all_precision.close()
f_proj_id = file('proj_id.csv', 'r')
reader = csv.reader(f_proj_id)
# line = ['6','500']
method = 'svm'
final_path = 'final2/'
helper.mkdir(final_path)
f_all_precision = file(final_path + 'precision_'+method+'.csv','a')
writer_final = csv.writer(f_all_precision)
writer_final.writerow(['proj_id','issue_count','proj_name','improve_prec','improve_prec_part','mechine_prec','num_sample','num_hard'])
f_all_precision.close()
for line in reader:
writer_final = csv.writer(f_all_precision)
handle_project(line,method)
f_proj_id.close()