You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量处理多CSV文件:强度图峰尺寸均值与标准差合并问题

问题解决:批量处理强度图文件并准确合并统计结果

问题概述

现有代码可单独处理单个CSV强度图文件,计算特定峰的平均尺寸和标准差,但批量处理目录文件时失效,且合并多文件统计结果的方式无法得到准确值。由于数据重叠不能合并成大文件处理,需修复批量逻辑并修正统计合并方法。

代码中的核心问题及修复方案

1. 批量处理失效的原因及修复

问题点:

  • os.listdir(root_folder)会返回目录下所有文件/文件夹,包括非CSV文件,导致pd.read_csv读取失败
  • process_file函数中未定义N就返回,直接运行会抛出NameError
  • 循环处理文件时未过滤非CSV文件

修复后的批量处理逻辑:

root_folder = "C:\\Users\\Kyle\\Desktop\\test_test_test"
# 只筛选目录下的CSV文件
files = [f for f in os.listdir(root_folder) if f.lower().endswith('.csv')]
results = []
for file in files:
    try:
        avg, std, n = process_file(os.path.join(root_folder, file))
        results.append((avg, std, n))
        print(f"处理完成:{file}")
    except Exception as e:
        print(f"处理{file}失败:{str(e)}")

2. process_file函数的关键修复

必须在函数内计算N(每个文件中有效峰的数量,即size列表的长度),否则无法进行后续加权统计:

def process_file(file_name):
    df = pd.read_csv(file_name, skiprows=0)
    
    Distance = df.iloc[:, 0]
    intensity = df.iloc[:, 1]
    intensity_norm = (intensity - intensity.min()) / (intensity.max() - intensity.min())
          
    x = Distance
    y = intensity_norm
    y2 = np.full_like(intensity_norm, 0.5)  # FWHM阈值线
    
    # 批量处理时可注释绘图代码,如需可视化可单独处理
    # plt.plot(x, intensity_norm)
    # plt.axhline(y=0.5, color='r', linestyle='-')
        
    first_line = LineString(np.column_stack((x, y2)))
    second_line = LineString(np.column_stack((x, y)))
    intersection = first_line.intersection(second_line)
    
    # 处理交点可能是单个点的情况,避免报错
    if hasattr(intersection, 'geoms'):
        xValues = [p.x for p in intersection.geoms]
    else:
        xValues = [intersection.x]
    
    diff_list = []
    for i in range(1, len(xValues)):
        xV = xValues[i] - xValues[i-1]
        diff_list.append(xV)
        
    size = []
    for val in diff_list:
        if 35 < val < 70:
            size.append(val)
    
    # 计算当前文件的有效峰数量N
    N = len(size)
    if N == 0:
        return np.nan, np.nan, 0  # 无有效数据时返回空值,避免后续计算错误
    
    average = np.average(size)
    stdev = np.std(size, ddof=1)  # 使用样本标准差(除以N-1),更符合统计需求
    return average, stdev, N

3. 准确合并多文件统计结果的方法

直接加权方差的方式忽略了组间均值的差异,需使用**合并方差(Pooled Variance)**公式计算总标准差,步骤如下:

total_average = 0
total_sum_squares = 0
total_N = 0

for (average, std_dev, N) in results:
    if N == 0:
        continue  # 跳过无有效数据的文件
    total_average += average * N
    # 计算组内平方和:(N-1)*std_dev²
    total_sum_squares += (N - 1) * (std_dev ** 2)
    total_N += N

if total_N == 0:
    print("无有效数据可统计")
else:
    total_average = total_average / total_N
    # 合并方差 = 总平方和 / (总N - 有效文件数)
    num_valid_files = len([r for r in results if r[2] > 0])
    pooled_variance = total_sum_squares / (total_N - num_valid_files)
    total_std_dev = np.sqrt(pooled_variance)
    
    print(f"总平均尺寸:{total_average:.2f}")
    print(f"总标准差:{total_std_dev:.2f}")

关键说明

  • 批量处理时过滤CSV文件,避免读取非数据文件报错
  • 计算样本标准差时使用ddof=1,符合实验统计的样本估计需求
  • 合并方差公式同时考虑组内差异和组间差异,比单纯加权方差更准确
  • 增加异常处理,避免单个文件处理失败导致整个批量任务中断

内容的提问来源于stack exchange,提问作者kyle stegman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:54:51