Python批量处理晶圆测试数据,零基础也能学会
周五下午四点,产线送来本周80片晶圆的测试数据。你要做bin map分布、良率趋势、失效模式归类,还要在周一早会前给老板出报告。打开Excel那一刻,你就知道今晚又要加班——80个文件,手动打开、复制、整理、作图,一套流程下来至少三四个小时。
在半导体厂干了10年PE,我太熟悉这个场景了。后来我用Python写了个不到100行的脚本,处理这80片晶圆数据只要2分钟。今天把方法拆开讲,你完全不需要会编程。
解决方案概览
核心思路:用Python的pandas库读取所有CSV/测试文件,自动合并计算bin良率、生成bin map和趋势图,一键导出Excel报告。你只需要装一次环境,之后每个礼拜都是复制粘贴。
分步实操
第一步:安装Python环境(5分钟)
去 python.org[1] 下载Python 3.11+,安装时一定要勾选"Add Python to PATH"。装完后打开命令行,依次运行:
pip install pandas openpyxl matplotlib numpy
看到 "Successfully installed" 就说明环境装好了。这一步只有第一次要做。
第二步:整理你的数据文件
把所有晶圆测试数据放在同一个文件夹里,比如 D:\wafer_data。不管是CSV、TXT还是Excel导出的表格,只要每个文件里都有这几列就行:WaferID(片号)、Bin(测试bin号)、Die_X(芯片X坐标)、Die_Y(芯片Y坐标)。
不同厂商设备导出的文件格式五花八门,这一步的关键是:先打开一个原始文件,看看列名长什么样,记下来,后面脚本里要用。
第三步:写主脚本(复制即可用)
新建一个文本文件,粘贴以下代码,另存为 wafer_analysis.py:
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport globimport os# ===== 配置区:改成你自己的路径和列名 =====DATA_DIR = r"D:\wafer_data"# 数据文件夹OUTPUT = r"D:\wafer_data\报告"# 输出文件夹COL_MAP = {"wafer": "WaferID", # 实际列名 -> 标准列名"x": "Die_X","y": "Die_Y","bin": "Bin"}# =======================================os.makedirs(OUTPUT, exist_ok=True)# 1. 读取所有文件并合并files = glob.glob(os.path.join(DATA_DIR, "*.csv"))dfs = []for f in files: df = pd.read_csv(f) df = df.rename(columns=COL_MAP) dfs.append(df)all_data = pd.concat(dfs, ignore_index=True)# 2. 计算每片晶圆的bin分布和良率bin_stats = all_data.groupby(["WaferID", "Bin"]).size().unstack(fill_value=0)bin_stats["总芯数"] = bin_stats.sum(axis=1)bin_stats["良率"] = bin_stats.get(1, 0) / bin_stats["总芯数"] * 100# 3. 生成趋势图:每片晶圆良率折线plt.figure(figsize=(10, 5))plt.plot(bin_stats["良率"], marker="o")plt.title("Wafer Yield Trend")plt.xlabel("Wafer ID")plt.ylabel("Yield (%)")plt.grid(True)plt.savefig(os.path.join(OUTPUT, "yield_trend.png"), dpi=150)# 4. 生成bin map图(取第一片晶圆示例)sample_wafer = all_data[all_data["WaferID"] == all_data["WaferID"].iloc[0]]plt.figure(figsize=(6, 6))scatter = plt.scatter(sample_wafer["Die_X"], sample_wafer["Die_Y"], c=sample_wafer["Bin"], cmap="tab20", s=10)plt.colorbar(scatter, label="Bin")plt.title(f"Bin Map - {sample_wafer['WaferID'].iloc[0]}")plt.savefig(os.path.join(OUTPUT, "bin_map.png"), dpi=150)# 5. 导出Excel报告with pd.ExcelWriter(os.path.join(OUTPUT, "wafer_report.xlsx")) as writer: bin_stats.to_excel(writer, sheet_name="Bin分布") all_data.pivot_table(index="Bin", values="Die_X", aggfunc="count").to_excel(writer, sheet_name="Bin汇总")print("完成!共处理", len(files), "片晶圆")print("报告已保存到:", OUTPUT)
第四步:运行脚本
在命令行里执行:
cd D:\wafer_datapython wafer_analysis.py
跑完你会得到三样东西:
wafer_report.xlsx:所有晶圆的bin分布和良率总表
两分钟,完事。 剩下时间你可以去复核异常片,而不是在Excel里点复制粘贴。
关键参数说明
| | |
|---|
COL_MAP | | |
get(1, 0) | | |
glob("*.csv") | | 有TXT或xlsx文件就改后缀,或再加一行*.txt |
| | 在pd.read_csv(f)里加encoding="gbk"试一下 |
常见问题和避坑提醒
1. 列名对不上,脚本报KeyError
这是90%的初学者会碰到的问题。Excel导入的CSV经常有\ufeff(BOM头)或前后空格,列名看起来一样但对不上。排查方法:先跑一行print(pd.read_csv("你的文件").columns),把打印出来的列名原样复制到COL_MAP里。不要手打,容易出全角空格这种隐形错误。
2. 良率算错:忘了bin=0可能是"未测试"
很多厂的数据里,bin=0表示划片道或未测试,不是失效。直接把所有非bin1都当不良,良率会虚低。正确做法:先print(all_data["Bin"].value_counts())看一眼bin的分布,确认哪些bin代表有效失效,再决定计算公式。
3. 一次性读几百个文件,内存爆了
80片没问题,但如果你手上有几千片的历史数据,pd.concat会占大量内存。正确做法:读文件时只保留需要的列,pd.read_csv(f, usecols=["WaferID", "Die_X", "Die_Y", "Bin"]),或者分批处理、只保留统计结果。
4. 把测试数据用文件名里的版本号混淆了
同款产品可能有多个工程版本,文件名里带V1、V2,直接全读进来会把不同版本混在一起。正确做法:在读取时用文件名生成一列,df["版本"] = os.path.basename(f),后面按版本分组分析。
5. 复制代码时缩进错了
Python对缩进极其敏感,代码块里每一行的空格数不能变。正确做法:不要手动重新排版,直接整体复制;如果报IndentationError,检查第20-25行的循环体缩进是否一致(都是4个空格)。
总结
这套脚本的核心价值,是把每周重复的"读文件—算良率—画图—做表"从3小时压缩到2分钟,而且不会有手动抄错的数字。你不需要成为程序员,只要会改三处配置(路径、列名、bin定义),就能跑起来。
更重要的是,这个思路可以扩展到任何重复性数据处理:CPK计算、SPC汇总、批次对比——底层都是"读取→合并→统计→出图"这四步。学会一次,受用终身。
本文为半导体工程师AI/自动化提效系列第6篇,关注公众号获取更多测试数据处理、报告自动化的实用教程。
引用链接
[1]python.org: https://www.python.org/downloads/