python_for_asl/Code/2-simple-stat.py
2025-08-06 02:04:35 +08:00

93 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import openpyxl
import csv
import os.path
import glob
def read_value(patient_dir, atlas, data_type):
folder_name = os.path.basename(patient_dir)
csv_file_path = os.path.join(patient_dir, f"{data_type}_{atlas}_result", "result_atlas.csv")
result = [folder_name]
with open(csv_file_path, mode='r') as data_csv_file:
csv_reader = csv.DictReader(data_csv_file)
for row in csv_reader:
mean = float(row["meanValue"])
result.append(mean)
return result
def read_header(patient_dir, atlas, data_type):
header = ['编号']
csv_file_path = os.path.join(patient_dir, f"{data_type}_{atlas}_result", "result_atlas.csv")
with open(csv_file_path, mode='r') as data_csv_file:
csv_reader = csv.DictReader(data_csv_file)
for row in csv_reader:
region_name = row["Chinese Name"]
header.append(region_name)
return header
def generate_stats_row(name, region_size, function, patient_size):
result = [name]
for i in range(region_size):
letter = openpyxl.utils.cell.get_column_letter(i + 2)
result.append(f'={function}({letter}2:{letter}{patient_size + 1})')
return result
def write_to_work_sheet(work_sheet, patient_list, atlas, data_type):
if len(patient_list) == 0:
return
header = read_header(patient_list[0], atlas, data_type)
work_sheet.append(header)
for patient_dir in patient_list:
print(data_type, patient_dir)
patient_data = read_value(patient_dir, atlas, data_type)
work_sheet.append(patient_data)
region_size = len(header) - 1
work_sheet.append([])
work_sheet.append([])
work_sheet.append(generate_stats_row('均值', region_size, 'AVERAGE', len(patient_list)))
work_sheet.append(generate_stats_row('标准差', region_size, 'STDEV', len(patient_list)))
work_sheet.append(generate_stats_row('最小值', region_size, 'MIN', len(patient_list)))
# 请尝试在空格的位置添加 5% 25% 50% 75% 95% 分位数使用excel的PERCENTILE函数
work_sheet.append([])
work_sheet.append([])
work_sheet.append([])
work_sheet.append([])
work_sheet.append([])
work_sheet.append(generate_stats_row('最大值', region_size, 'MAX', len(patient_list)))
def main():
data_types = ['corr-CBF', 'ATT', 'ACBV', 'CBF1', 'CBF2', 'CBF3', 'CBF4', 'CBF5']
atlas_list = ['AnImage_WholeBrain', 'AnImage_BrainLobes', 'AnImage_AAL3']
output_file = r'..\Data\csv-simple-stat.xlsx'
patient_list = glob.glob(r'..\Data\csv-data\*')
work_book = openpyxl.Workbook()
work_book.remove(work_book.active)
for data_type in data_types:
for atlas in atlas_list:
work_sheet = work_book.create_sheet(title=f'{atlas}_{data_type}')
write_to_work_sheet(work_sheet, patient_list, atlas, data_type)
work_book.save(output_file)
main()