'PARAMETER_MAPPING', 'T_WAFER_ID', 'WAFER_TYPE','SITE',‘VALUE',遍历每个参数,按照T_WAFER_ID分组,横坐标为T_WAFER_ID,纵坐标为VALUE,画出每个T_WAFER_ID的box图,如果WAFER_TYPE为DRB_WAFER,则box图的颜色为绿色,如果WAFER_TYPE为NONE_DRB_WAFER,则box图的颜色为黄色

时间: 2025-06-22 12:30:30 浏览: 16
<think>好的,我现在需要帮用户解决一个新的数据可视化问题。首先,我需要仔细理解用户的需求。用户这次的请求是:遍历每个参数(PARAMETER_MAPPING),按照T_WAFER_ID分组,横坐标为T_WAFER_ID,纵坐标为VALUE,每个T_WAFER_ID画一个箱线图,并根据WAFER_TYPE设置颜色,DRB_WAFER用绿色,NONE_DRB_WAFER用黄色。 首先,我需要回顾用户之前的问题,之前是关于使用LOTNO和WAFER_NO作为横坐标,并且根据MEASURE_TIME排序。而这次的重点是T_WAFER_ID,并且需要按照不同的WAFER_TYPE来着色。这意味着数据结构可能不同,可能需要不同的预处理步骤。 接下来,我需要考虑用户可能的数据结构。用户提到的列包括PARAMETER_MAPPING、T_WAFER_ID、WAFER_TYPE、SITE、VALUE。看起来数据已经是长格式(每个站点值作为一行),可能已经经过melt处理,或者需要用户自己进行重塑。之前的回答中使用了melt来将站点列转换为长格式,所以这次可能需要确认数据是否已经是长格式,或者是否需要类似的预处理。 然后,我需要确保数据正确分组。用户希望按T_WAFER_ID分组,每个组对应一个箱线图。每个箱线图展示该T_WAFER_ID下的VALUE分布。颜色根据WAFER_TYPE决定,同一T_WAFER_ID可能有不同的WAFER_TYPE吗?可能需要确认这一点。假设每个T_WAFER_ID只有一个WAFER_TYPE,这样每个箱线图颜色单一,否则可能需要处理多颜色情况,但通常每个T_WAFER_ID应该对应唯一的WAFER_TYPE。 接下来,考虑使用Python的库,如seaborn或matplotlib。Seaborn的boxplot函数支持hue参数,可以按WAFER_TYPE着色,但需要确保每个T_WAFER_ID对应的WAFER_TYPE是单一的,否则可能会在同一位置出现多个箱线图,导致混乱。如果每个T_WAFER_ID对应一个WAFER_TYPE,那么可以直接用hue参数,但需要检查是否有重复的情况。 另外,横坐标需要是T_WAFER_ID,每个唯一的T_WAFER_ID对应一个箱线图。可能需要将T_WAFER_ID转换为分类变量并按某种顺序排列,比如按出现顺序或按测量时间排序,但用户没有提到排序的要求,所以可能只需要按数据中的自然顺序排列。 颜色映射方面,需要将DRB_WAFER设为绿色,NONE_DRB_WAFER设为黄色。在seaborn中可以通过palette参数传递颜色字典,或者在hue参数中指定颜色映射。 可能的步骤是: 1. 数据预处理:确保数据是长格式,每个站点对应的VALUE已经转换为行。 2. 遍历每个PARAMETER_MAPPING,过滤数据。 3. 对每个参数的数据,按T_WAFER_ID分组,绘制箱线图,颜色根据WAFER_TYPE设置。 4. 设置图表标题、坐标轴标签、颜色等。 需要处理的问题包括: - 数据是否需要提前排序? - 如何确保每个T_WAFER_ID对应的颜色正确? - 如何处理可能存在的多个WAFER_TYPE对应同一个T_WAFER_ID的情况? - 图表的美观性,如标签旋转、图例位置等。 此外,用户可能在之前的处理中已经有了melted_data,但这次可能需要不同的结构。例如,用户之前可能已经有了每个站点作为一行,但这里的SITE列可能已经存在,或者需要重新处理。 还需要考虑代码的效率和可读性,是否需要函数封装,如何处理大量参数时的性能问题,以及是否需要交互式可视化等优化建议,如用户之前提到的Plotly。 可能的错误点: - T_WAFER_ID和WAFER_TYPE之间的对应关系不唯一,导致颜色混乱。 - 数据中存在缺失值,影响箱线图的绘制。 - 横坐标标签过多导致重叠,需要旋转或调整布局。 总结下来,解决方案应包括数据预处理、颜色映射、循环绘制每个参数的图表,并处理可能出现的横坐标标签问题。同时,需要给出优化建议,如交互式可视化或处理大数据集的方法。</think>以下是针对该需求的完整实现方案,使用Python进行分步说明: --- ### **一、数据预处理** **目标**:准备符合绘图要求的长格式数据 ```python # 假设原始数据已包含以下列: # ['PARAMETER_MAPPING', 'T_WAFER_ID', 'WAFER_TYPE', 'SITE1_VAL'...'SITE25_VAL'] # 将宽格式转为长格式(若尚未转换) site_columns = [f'SITE{i}_VAL' for i in range(1, 26)] melted_data = data.melt( id_vars=['PARAMETER_MAPPING', 'T_WAFER_ID', 'WAFER_TYPE'], value_vars=site_columns, var_name='SITE', value_name='VALUE' ) ``` --- ### **二、可视化核心代码** ```python import matplotlib.pyplot as plt import seaborn as sns def plot_parameter_boxplots(parameter): # 筛选特定参数的数据 subset = melted_data[melted_data['PARAMETER_MAPPING'] == parameter] # 创建画布 plt.figure(figsize=(15, 6)) # 定义颜色映射规则 palette = { 'DRB_WAFER': '#00FF00', 'NONE_DRB_WAFER': '#FFFF00' } # 绘制箱线图 sns.boxplot( x='T_WAFER_ID', y='VALUE', hue='WAFER_TYPE', data=subset, palette=palette, dodge=False # 确保同一T_WAFER_ID不分离显示 ) # 美化图表 plt.title(f'{parameter} - 按晶圆ID分布') plt.xlabel('晶圆唯一标识 (T_WAFER_ID)') plt.ylabel('测量值') plt.xticks(rotation=45) plt.legend(title='晶圆类型') plt.tight_layout() plt.show() # 遍历所有参数生成图表 for param in melted_data['PARAMETER_MAPPING'].unique(): plot_parameter_boxplots(param) ``` --- ### **三、关键技术解析** 1. **数据关系映射** - 使用$T\_WAFER\_ID$作为唯一标识符,通过`sns.boxplot`的`x`参数实现分组 - 颜色映射逻辑: $$color = \begin{cases} \text{绿色} & \text{if } WAFER\_TYPE=DRB\_WAFER \\ \text{黄色} & \text{otherwise} \end{cases}$$ 2. **统计图形特性** - 每个箱线图展示: - 下限:$Q1 - 1.5IQR$ - 箱体:$Q1$(25%分位数)至$Q3$(75%分位数) - 中线:中位数(50%分位数) - 上限:$Q3 + 1.5IQR$ - 超出范围的离散点自动标记为异常值 3. **坐标轴处理** - 通过`rotation=45`解决长ID标签重叠问题 - `dodge=False`确保同一$T\_WAFER\_ID$不产生分组偏移 --- ### **四、优化建议** 1. **交互式可视化** ```python import plotly.express as px fig = px.box( subset, x='T_WAFER_ID', y='VALUE', color='WAFER_TYPE', color_discrete_map=palette ) fig.show() ``` 2. **异常值标注** ```python # 计算异常值 Q1 = subset['VALUE'].quantile(0.25) Q3 = subset['VALUE'].quantile(0.75) IQR = Q3 - Q1 subset['is_outlier'] = (subset['VALUE'] < (Q1 - 1.5*IQR)) | (subset['VALUE'] > (Q3 + 1.5*IQR)) # 在图上标注异常值数量 outliers = subset.groupby('T_WAFER_ID')['is_outlier'].sum() for idx, count in enumerate(outliers): plt.text(idx, subset['VALUE'].max()*1.02, f'异常值:{count}', ha='center') ``` 3. **性能优化策略** ```python # 内存优化(分类数据转换) melted_data['T_WAFER_ID'] = melted_data['T_WAFER_ID'].astype('category') melted_data['WAFER_TYPE'] = melted_data['WAFER_TYPE'].astype('category') ``` --- ### **五、典型分析场景** 1. **工艺一致性分析** - 对比不同$T\_WAFER\_ID$的中位数偏移 2. **设备稳定性监控** - 观察同一$T\_WAFER\_ID$的$IQR$范围变化 3. **异常批次追溯** - 通过颜色快速识别DRB_WAFER的分布特征 --- ### **六、常见问题处理** | 问题现象 | 解决方案 | |---------|----------| | 横坐标标签重叠 | 使用`plt.xticks(rotation=90)`或改用热力图 | | 颜色未正确映射 | 检查`WAFER_TYPE`分类是否包含未知类型 | | 图形渲染卡顿 | 使用`matplotlib`的`agg`后台:`plt.switch_backend('agg')` | 建议先对单个参数进行测试验证,再批量生成全参数图表。
阅读全文

相关推荐

import oracledb import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 数据库连接信息 dsn = ( "(DESCRIPTION=" "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.164.60)(PORT=1521)))" "(CONNECT_DATA=(SERVICE_NAME=YMSDB01)))" ) username = 'acme' password = 'acme' oracledb.init_oracle_client(lib_dir=r"C:\Users\Q06412\Downloads\instantclient-basic-windows.x64-21.17.0.0.0dbru\instantclient_21_17") # 创建连接 connection = oracledb.connect(user=username, password=password, dsn=dsn) try: # 创建一个游标 cursor = connection.cursor() # SQL 查询语句 sql_query = """ select WAFER_TYPE, LOTNO, T_WAFER_ID,WAFER_NO, MEASURE_TIME, PARAMETER_MAPPING, RANGE_INDEX, SITE_COUNT, AVERAGE, MAX_VAL,MIN_VAL, STD_DEV, SITE1_VAL, SITE2_VAL, SITE3_VAL, SITE4_VAL, SITE5_VAL, SITE6_VAL, SITE7_VAL, SITE8_VAL, SITE9_VAL, SITE10_VAL, SITE11_VAL, SITE12_VAL, SITE13_VAL, SITE14_VAL, SITE15_VAL, SITE16_VAL, SITE17_VAL, SITE18_VAL, SITE19_VAL, SITE20_VAL, SITE21_VAL, SITE22_VAL, SITE23_VAL, SITE24_VAL, SITE25_VAL FROM ACME.DRB_DATA """ # 执行查询 cursor.execute(sql_query) # 获取所有结果 results = cursor.fetchall() columns = [ 'WAFER_TYPE', 'LOTNO', 'T_WAFER_ID', 'WAFER_NO', 'MEASURE_TIME', 'PARAMETER_MAPPING', 'RANGE_INDEX' , 'SITE_COUNT', 'AVERAGE','MAX_VAL','MIN_VAL', 'STD_DEV', 'SITE1_VAL', 'SITE2_VAL', 'SITE3_VAL', 'SITE4_VAL', 'SITE5_VAL', 'SITE6_VAL','SITE7_VAL', 'SITE8_VAL', 'SITE9_VAL', 'SITE10_VAL', 'SITE11_VAL', 'SITE12_VAL', 'SITE13_VAL', 'SITE14_VAL', 'SITE15_VAL', 'SITE16_VAL', 'SITE17_VAL', 'SITE18_VAL', 'SITE19_VAL', 'SITE20_VAL', 'SITE21_VAL', 'SITE22_VAL', 'SITE23_VAL', 'SITE24_VAL', 'SITE25_VAL' ] drbdata = pd.DataFrame(results, columns=columns) data_sorted = drbdata.sort_values(by='MEASURE_TIME') data_sorted['LOT_WAFER'] = data_sorted['LOTNO']+'-'+data_sorted['WAFER_NO'].astype(str) site_columns = [f'SITE{i}_VAL' for i in range(1, 26)] # 宽表转长表 不需要考虑测了多少site,直接按wafer、para分组计算统计量 melted_data = data_sorted.melt( id_vars=['PARAMETER_MAPPING', 'LOT_WAFER', 'WAFER_TYPE'], value_vars=site_columns, var_name='SITE', value_name='VALUE' ) def plot_parameter_boxplots(parameter): # 筛选特定参数的数据 subset = melted_data[melted_data['PARAMETER_MAPPING'] == parameter] # 创建画布 plt.figure(figsize=(15, 6)) # 定义颜色映射规则 palette = { 'DRB_WAFER': '#00FF00', 'NONE_DRB_WAFER': '#FFFF00' } # 绘制箱线图 sns.boxplot( x='LOT_WAFER', y='VALUE', hue='WAFER_TYPE', data=subset, palette=palette, dodge=False # 确保同一T_WAFER_ID不分离显示 ) # 美化图表 plt.title(f'{parameter} - 按晶圆ID分布') plt.xlabel('') plt.ylabel('value') plt.xticks(rotation=45) plt.legend(title='WAFER_TYPE') plt.tight_layout() plt.show() # 遍历所有参数生成图表 for param in melted_data['PARAMETER_MAPPING'].unique(): plot_parameter_boxplots(param) except Exception as e: print(e) finally: # 关闭游标和连接 cursor.close() connection.close() 报错:local variable 'boxprops' referenced before assignment

columns = [ 'WAFER_TYPE', 'LOTNO', 'WAFER_NO', 'MEASURE_TIME', 'PARAMETER_MAPPING', 'RANGE_INDEX' , 'SITE_COUNT', 'AVERAGE','MAX_VAL','MIN_VAL', 'STD_DEV', 'SITE1_VAL', 'SITE2_VAL', 'SITE3_VAL', 'SITE4_VAL', 'SITE5_VAL', 'SITE6_VAL','SITE7_VAL', 'SITE8_VAL', 'SITE9_VAL', 'SITE10_VAL', 'SITE11_VAL', 'SITE12_VAL', 'SITE13_VAL', 'SITE14_VAL', 'SITE15_VAL', 'SITE16_VAL', 'SITE17_VAL', 'SITE18_VAL', 'SITE19_VAL', 'SITE20_VAL', 'SITE21_VAL', 'SITE22_VAL', 'SITE23_VAL', 'SITE24_VAL', 'SITE25_VAL' ] drbdata = pd.DataFrame(results, columns=columns) site_columns = [f'SITE{i}_VAL' for i in range(1, 26)] # 宽表转长表 不需要考虑测了多少site,直接按wafer、para分组计算统计量 melted_data = drbdata.melt( id_vars=['PARAMETER_MAPPING', 'LOTNO', 'WAFER_NO', 'MEASURE_TIME', 'WAFER_TYPE'], value_vars=site_columns, var_name='SITE', value_name='VALUE') grouped = melted_data.groupby('LOTNO') for LOTNO, lot_group in grouped: # 遍历每个参数 for param in lot_group['PARAMETER_MAPPING'].unique(): param_data = lot_group[lot_group['PARAMETER_MAPPING'] == param] # 生成坐标标签和颜色 x_labels = [] COLOR_MAP = { 'DRB_WAFER': '#00FF00', 'NONE_DRB_WAFER': '#FFFF00', 'default': '#0000FF' } sorted_data = param_data.sort_values('MEASURE_TIME') conditions = [ param_data['WAFER_TYPE'] == 'DRB_WAFER', param_data['WAFER_TYPE'] == 'NONE_DRB_WAFER' ] choices = [ param_data['LOTNO'] + '-' + param_data['WAFER_NO'].astype(str), param_data['LOTNO'] + '-' + param_data['WAFER_NO'].astype(str) ] x_labels = np.select(conditions, choices, default=param_data['WAFER_TYPE'] + '-' + param_data['WAFER_NO'].astype(str)) # 创建绘图 plt.figure(figsize=(20, 10)) boxplot = plt.boxplot( [sorted_data['VALUE']], # 根据实际数值列调整 labels=x_labels, patch_artist=True ) # 设置颜色 for patch, color in zip(boxplot['boxes'], COLOR_MAP): patch.set_facecolor(color) # 设置图表属性 plt.title(f"LOTNO: {LOTNO} - Parameter: {param}") plt.xticks(rotation=45) plt.grid(True) plt.show() 报错:Dimensions of labels and X must be compatible

columns = [ ‘DRB_ID’, ‘WAFER_TYPE’, ‘LOTNO’, ‘WAFER_NO’, ‘MEASURE_TIME’, ‘PARAMETER_MAPPING’, ‘RANGE_INDEX’ , ‘SITE_COUNT’, ‘AVERAGE’,‘MAX_VAL’,‘MIN_VAL’, ‘STD_DEV’, ‘SITE1_VAL’, ‘SITE2_VAL’, ‘SITE3_VAL’, ‘SITE4_VAL’, ‘SITE5_VAL’, ‘SITE6_VAL’,‘SITE7_VAL’, ‘SITE8_VAL’, ‘SITE9_VAL’, ‘SITE10_VAL’, ‘SITE11_VAL’, ‘SITE12_VAL’, ‘SITE13_VAL’, ‘SITE14_VAL’, ‘SITE15_VAL’, ‘SITE16_VAL’, ‘SITE17_VAL’, ‘SITE18_VAL’, ‘SITE19_VAL’, ‘SITE20_VAL’, ‘SITE21_VAL’, ‘SITE22_VAL’, ‘SITE23_VAL’, ‘SITE24_VAL’, ‘SITE25_VAL’ ] drbdata = pd.DataFrame(results, columns=columns) site_columns = [f'SITE{i}_VAL' for i in range(1, 26)] # 宽表转长表 不需要考虑测了多少site,直接按wafer、para分组计算统计量 melted_data = drbdata.melt( id_vars=['DRB_ID','PARAMETER_MAPPING', 'LOTNO', 'WAFER_NO', 'MEASURE_TIME', 'WAFER_TYPE'], value_vars=site_columns, var_name='SITE', value_name='VALUE') melted_data['VALUE'] = melted_data['VALUE'].astype(float) melted_data = melted_data.dropna(subset=['VALUE']) grouped = melted_data.groupby('LOTNO') for LOTNO, lot_group in grouped: # 遍历每个参数 for param in lot_group['PARAMETER_MAPPING'].unique(): param_data = lot_group[lot_group['PARAMETER_MAPPING'] == param] # 生成坐标标签和颜色 # x_labels = [] conditions = [ param_data['WAFER_TYPE'] == 'DRB_WAFER', param_data['WAFER_TYPE'] == 'NONE_DRB_WAFER' ] choices = [ param_data['LOTNO'].astype(str) + '-' + param_data['WAFER_NO'].astype(str), param_data['LOTNO'].astype(str) + '-' + param_data['WAFER_NO'].astype(str) ] tick_labels = np.select(conditions, choices, default=param_data['WAFER_TYPE'].astype(str) + '-' + param_data['WAFER_NO'].astype(str)) # 将标签添加到数据中并按标签分组 param_data['x_label'] = tick_labels sorted_data = param_data.sort_values('MEASURE_TIME').copy() grouped_by_label = sorted_data.groupby('x_label', sort=False) labels = list(grouped_by_label.groups.keys()) data = [group['VALUE'].values for name, group in grouped_by_label if not group['VALUE'].empty] # data = [] # labels = [] # for name, group in grouped_by_label: # if not group['VALUE'].empty: # 跳过空数据组 # data.append(group['VALUE'].values) # labels.append(name) # 创建绘图 plt.figure(figsize=(20, 10)) boxplot = plt.boxplot( data, tick_labels=labels, patch_artist=True ) # 设置颜色 COLOR_MAP = { 'DRB_WAFER': '#00FF00', 'NONE_DRB_WAFER': '#FFFF00', 'default': '#0000FF' } for i, (name, group) in enumerate(grouped_by_label): wafer_type = group['WAFER_TYPE'].iloc[0] color = COLOR_MAP.get(wafer_type, COLOR_MAP['default']) boxplot['boxes'][i].set_facecolor(color) # 设置图表属性 plt.title(f"LOTNO: {LOTNO} - Parameter: {param}") plt.xticks(rotation=90) plt.grid(True) plt.show() 在每一次遍历lotno及parameter时,计算boxplot的所有box值的mean及mean+-3sigma并在图上用红色线标注出来,y轴自适应

WITH para AS ( -- ----找到pie维护的需要check什么参数的值--------- SELECT DISTINCT b.* ,a.FAB ,a.TEST_PROGRAM ,wp.WAT_PARAMETER_ID ,wp.NAME AS PARAMETER_NAME FROM (SELECT DISTINCT DRB_ID,PRODUCT_ID,LOT_ID, trim(STAGE) trim_stage,STATUS,CREATE_TIME, TRIM(REGEXP_SUBSTR(WAFER_ID,'[^,]+',1,LEVEL)) AS WAFER_ID FROM DRB_INFO_CONFIG dic WHERE STATUS = '0' CONNECT BY TRIM(REGEXP_SUBSTR(WAFER_ID,'[^,]+',1,LEVEL)) IS NOT NULL AND PRIOR WAFER_ID = WAFER_ID AND PRIOR PRODUCT_ID = PRODUCT_ID AND PRIOR DRB_ID = DRB_ID AND PRIOR LOT_ID = LOT_ID AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL) b LEFT join ( SELECT DISTINCT FAB, PRODUCT_ID, PARAMETER_NAME, PARAMETER_MAPPING, LIMIT_FILE, TEST_PROGRAM, TRIM(REGEXP_SUBSTR(STAGE, '[^锛汸]+', 1, LEVEL)) AS STAGE_true FROM DRB_PARAMETER_MAPPING CONNECT BY LEVEL <= REGEXP_COUNT(STAGE, '锛汸') + 1 AND PRIOR PRODUCT_ID = PRODUCT_ID AND PRIOR FAB = FAB AND PRIOR TEST_PROGRAM = TEST_PROGRAM AND PRIOR PARAMETER_NAME = PARAMETER_NAME AND PRIOR SYS_GUID() IS NOT NULL ) a ON a.PRODUCT_ID = b.PRODUCT_ID AND a.STAGE_true = b.trim_stage LEFT JOIN WAT_PARAMETER wp ON a.PARAMETER_MAPPING = wp.NAME -- 对不对 ), -- -----------------查询是否有WAT数据,若有---------------------------- wat as( SELECT distinct l.LOTNO , b.trim_stage, concat(concat(substr(l.LOTNO,0,7),'-'),wwi.WAFER_NO) AS T_WAFER_ID, wwi.LOT_ID, WWI.WAFER_ID, WWI.WAFER_NO, WWI.TEST_PROGRAM, WWI.MEASURE_TIME FROM WAT_WAFER_INFO wwi LEFT JOIN LOT l ON wwi.LOT_ID = l.LOT_ID LEFT JOIN (SELECT DISTINCT DRB_ID,PRODUCT_ID,LOT_ID, trim(STAGE) trim_stage,STATUS,CREATE_TIME, TRIM(REGEXP_SUBSTR(WAFER_ID,'[^,]+',1,LEVEL)) AS WAFER_ID FROM DRB_INFO_CONFIG dic WHERE STATUS = '0' CONNECT BY TRIM(REGEXP_SUBSTR(WAFER_ID,'[^,]+',1,LEVEL)) IS NOT NULL AND PRIOR WAFER_ID = WAFER_ID AND PRIOR PRODUCT_ID = PRODUCT_ID AND PRIOR DRB_ID = DRB_ID AND PRIOR LOT_ID = LOT_ID AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL) b ON b.LOT_ID = l.LOTNO WHERE wwi.LOT_ID IN ( -- 对应lotid “798360” SELECT DISTINCT LOT_ID FROM LOT WHERE -- 为什么要like,而不是一一对应 -- 取出DRBlot LOTNO IN (SELECT DISTINCT LOT_ID FROM DRB_INFO_CONFIG dic WHERE STATUS = '0') ) AND TRIM(concat(concat(substr(l.LOTNO,0,7),'-'),wwi.WAFER_NO)) IN ( SELECT DISTINCT TRIM(REGEXP_SUBSTR(WAFER_ID,'[^,]+',1,LEVEL)) FROM DRB_INFO_CONFIG dic WHERE STATUS = '0' CONNECT BY TRIM(REGEXP_SUBSTR(WAFER_ID,'[^,]+',1,LEVEL)) IS NOT NULL AND PRIOR WAFER_ID = WAFER_ID AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL ) AND wwi.TEST_PROGRAM NOT LIKE '%M1%' AND wwi.TEST_PROGRAM NOT LIKE '%M4%' -- AND wwi.MEASURE_TIME > --大于DRB插入时间的lot order by wwi.measure_time DESC ) -- wat RAW data----------------- SELECT DISTINCT PTRO.* ,wws.* FROM ( SELECT para.FAB ,para.PRODUCT_ID ,p.PRODUCT_ID AS PRODUCT_NO ,wat.LOTNO ,wat.LOT_ID ,wat.trim_stage ,wat.T_WAFER_ID ,wat.WAFER_ID ,wat.WAFER_NO ,wat.TEST_PROGRAM ,wat.MEASURE_TIME ,para.DRB_ID ,para.STATUS ,para.CREATE_TIME ,para.TEST_PROGRAM ,para.WAT_PARAMETER_ID ,para.PARAMETER_NAME FROM wat LEFT JOIN para ON wat.LOTNO = para.LOT_ID AND wat.T_WAFER_ID = para.WAFER_ID AND wat.TRIM_STAGE = para.TRIM_STAGE --AND wat.TEST_PROGRAM = para.TEST_PROGRAM 暂时没法关联 WAT_PARAMETER_ID也没法关联 LEFT JOIN PRODUCT p ON para.PRODUCT_ID = p.NAME ) ptro LEFT JOIN WAT_WAFER_SUMMARY wws ON ptro.PRODUCT_NO = WWS.PRODUCT_ID AND ptro.LOT_ID = WWS.LOT_ID AND ptro.WAFER_ID = WWS.WAFER_ID AND ptro.WAT_PARAMETER_ID = WWS.WAT_PARAMETER_ID ; 报错

for DRB_ID, lot_group in grouped: # 遍历每个参数 for param in lot_group['PARAMETER_MAPPING'].unique(): param_data = lot_group[lot_group['PARAMETER_MAPPING'] == param].copy() # 新增计算部分 overall_mean = param_data['VALUE'].mean() overall_std = param_data['VALUE'].std() upper_bound = overall_mean + 3 * overall_std lower_bound = overall_mean - 3 * overall_std # 生成坐标标签和颜色 # x_labels = [] conditions = [ param_data['WAFER_TYPE'] == 'DRB_WAFER', param_data['WAFER_TYPE'] == 'NONE_DRB_WAFER' ] choices = [ param_data['LOTNO'].astype(str) + '-' + param_data['WAFER_NO'].astype(str), param_data['LOTNO'].astype(str) + '-' + param_data['WAFER_NO'].astype(str) ] tick_labels = np.select(conditions, choices, default=param_data['WAFER_TYPE'].astype(str) + '-' + param_data['WAFER_NO'].astype(str)) # 将标签添加到数据中并按标签分组 param_data['x_label'] = tick_labels sorted_data = param_data.sort_values('MEASURE_TIME').copy() grouped_by_label = sorted_data.groupby('x_label', sort=False) labels = list(grouped_by_label.groups.keys()) data = [group['VALUE'].values for name, group in grouped_by_label if not group['VALUE'].empty] # 创建绘图 plt.figure(figsize=(20, 10)) boxplot = plt.boxplot( data, tick_labels=labels, patch_artist=True ) # 设置颜色 COLOR_MAP = { 'DRB_WAFER': '#66CDAA', 'NONE_DRB_WAFER': '#FFDEAD', 'default': '#B0C4DE' } for i, (name, group) in enumerate(grouped_by_label): wafer_type = group['WAFER_TYPE'].iloc[0] color = COLOR_MAP.get(wafer_type, COLOR_MAP['default']) boxplot['boxes'][i].set_facecolor(color) #mean+-3sigma plt.axhline(y=overall_mean, color='r', linestyle='-', linewidth=1,label='Mean') plt.axhline(y=upper_bound, color='r', linestyle='-', linewidth=1,label='mean+3σ') plt.axhline(y=lower_bound, color='r', linestyle='-', linewidth=1,label='mean-3σ') # 设置图表属性 plt.title(f"DRB_ID: {DRB_ID} - Parameter: {param}") plt.xticks(rotation=90) plt.grid(True) plt.ylim(auto=True) # 确保y轴自适应 将每个组的data中的所有点标识在图上,并且按照wafertype颜色添加图例

遍历每个参数 for param in melted_data['PARAMETER_MAPPING'].unique(): param_data = melted_data[melted_data['PARAMETER_MAPPING'] == param].copy() # 生成坐标标签和颜色 conditions = [ param_data['WAFER_TYPE'] == 'DRB_WAFER', param_data['WAFER_TYPE'] == 'NONE_DRB_WAFER' ] choices = [ param_data['LOTNO'].astype(str) + '-' + param_data['WAFER_NO'].astype(str), param_data['LOTNO'].astype(str) + '-' + param_data['WAFER_NO'].astype(str) ] tick_labels = np.select(conditions, choices, default=param_data['WAFER_TYPE'].astype(str) + '-' + param_data['WAFER_NO'].astype(str)) # 将标签添加到数据中并按标签分组 param_data['x_label'] = tick_labels sorted_data = param_data.sort_values( by=['MEASURE_TIME', 'x_label', 'WAFER_NO'], # 多列排序列表 ascending=[True, True, True] # 对应列的排序方式(默认True可省略) ).copy() grouped_by_label = sorted_data.groupby('x_label', sort=False) # 同时过滤空分组 filtered_groups = [(name, group) for name, group in grouped_by_label if not group['VALUE'].empty] labels = [name for name, _ in filtered_groups] data = [group['VALUE'].values for _, group in filtered_groups] # 创建绘图 plt.figure(figsize=(20, 10)) boxplot = plt.boxplot( data, labels=labels, patch_artist=True # 必须开启才能填充颜色 ) # 绘制散点(保持颜色同步) x = np.random.normal(i + 1, 0.04, size=len(group['VALUE'])) plt.scatter(x, group['VALUE'], alpha=0.5, edgecolor=scatter_color, # 散点边缘色 facecolor=scatter_color, # 散点填充色 linewidths=0.8, zorder=3) #设置高于箱线图的层级) 只过滤掉default=param_data['WAFER_TYPE'].astype(str) + '-' + param_data['WAFER_NO'].astype(str)该label 8倍sigma以外的点

数据库连接信息 dsn = ( “(DESCRIPTION=” “(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.164.60)(PORT=1521)))” “(CONNECT_DATA=(SERVICE_NAME=YMSDB01)))” ) username = ‘acme’ password = ‘acme’ oracledb.init_oracle_client(lib_dir=r"C:\Users\Q06412\Downloads\instantclient-basic-windows.x64-21.17.0.0.0dbru\instantclient_21_17") connection = oracledb.connect(user=username, password=password, dsn=dsn) try: cursor = connection.cursor() sql_query = “”" select * FROM ACME.DRB_DATA “”" cursor.execute(sql_query) results = cursor.fetchall() drbdata = pd.DataFrame(results, columns=columns) site_columns = [f’SITE{i}_VAL’ for i in range(1, 26)] melted_data = drbdata.melt( id_vars=[‘DRB_ID’,‘PARAMETER_MAPPING’, ‘LOTNO’, ‘WAFER_NO’, ‘MEASURE_TIME’, ‘WAFER_TYPE’], value_vars=site_columns, var_name=‘SITE’, value_name=‘VALUE’) melted_data[‘VALUE’] = melted_data[‘VALUE’].astype(float) melted_data = melted_data.dropna(subset=[‘VALUE’]) grouped = melted_data.groupby(‘DRB_ID’) #drbid和lotno应该是一一对应的关系 for DRB_ID, lot_group in grouped: for param in lot_group[‘PARAMETER_MAPPING’].unique(): param_data = lot_group[lot_group[‘PARAMETER_MAPPING’] == param].copy() conditions = [ param_data[‘WAFER_TYPE’] == ‘DRB_WAFER’, param_data[‘WAFER_TYPE’] == ‘NONE_DRB_WAFER’ ] choices = [ param_data[‘LOTNO’].astype(str) + ‘-’ + param_data[‘WAFER_NO’].astype(str), param_data[‘LOTNO’].astype(str) + ‘-’ + param_data[‘WAFER_NO’].astype(str) ] tick_labels = np.select(conditions, choices, default=param_data[‘WAFER_TYPE’].astype(str) + ‘-’ + param_data[‘WAFER_NO’].astype(str)) 将标签添加到数据中并按标签分组 param_data[‘x_label’] = tick_labels sorted_data = param_data.sort_values(‘MEASURE_TIME’).copy() grouped_by_label = sorted_data.groupby(‘x_label’, sort=False) 同时过滤空分组 filtered_groups = [(name, group) for name, group in grouped_by_label if not group[‘VALUE’].empty] labels = [name for name, _ in filtered_groups] data = [group[‘VALUE’].values for _, group in filtered_groups] 创建绘图 plt.figure(figsize=(20, 10)) boxplot = plt.boxplot( data, tick_labels=labels, patch_artist=True, # 必须开启才能填充颜色 ) 设置图表属性 plt.title(f"DRB_ID: {DRB_ID} - Parameter: {param}") plt.xticks(rotation=90) plt.grid(True) #保存结果 datasave = f"H:/DRB/{DRB_ID}" if not os.path.exists(datasave): os.makedirs(datasave) box_save_dir = f"H:/DRB/{DRB_ID}/{param}.png" plt.savefig(box_save_dir, bbox_inches=‘tight’,dpi=300) plt.close() box_dir = f"H:/DRB/{DRB_ID}" prs = Presentation() slide_layout = prs.slide_layouts[6] # 空白版式 try: box_images = sorted( [os.path.join(box_dir, f) for f in os.listdir(box_dir) if f.endswith((‘.png’, ‘.jpg’, ‘.jpeg’))]) except FileExistsError: raise Exception(f"目录不存在:{box_dir}") total_pages = len(box_images) // 4 + 1 for page in range(total_pages): slide = prs.slides.add_slide(slide_layout) _add_images_to_slide( slide, box_images[page * 4: (page + 1) * 4], left_start=Inches(1.0), top_start=Inches(0.6), ) output_path = “H:/DRB” os.makedirs(os.path.dirname(output_path), exist_ok=True) if not os.path.exists(output_path): os.makedirs(output_path) prs.save(f"{output_path}/{DRB_ID}.pptx") #确认路径中是否包含{DRB_ID}.pptx,如果包含则update status=1 if contains_file(output_path, f"{DRB_ID}.pptx"): try: dsn = ( “(DESCRIPTION=” “(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.164.60)(PORT=1521)))” “(CONNECT_DATA=(SERVICE_NAME=YMSDB01)))” ) username = ‘acme’ password = ‘acme’ oracledb.init_oracle_client( lib_dir=r"C:\Users\Q06412\Downloads\instantclient-basic-windows.x64-21.17.0.0.0dbru\instantclient_21_17") connection2 = oracledb.connect(user=username, password=password, dsn=dsn) cursor = connection2.cursor() sql_query = """ update DRB_INFO_CONFIG set status = :1 where DRB_ID = :2 """ cursor.execute(sql_query, (1, f"{DRB_ID}")) connection2.commit() finally: if ‘connection2’ in locals(): connection2.close() except Exception as e: print(e) finally: cursor.close() connection.close() oracledb.exceptions.InterfaceError: DPY-1001: not connected to database

大家在看

recommend-type

NAND FLASH 控制器源码(verilog)

这是NAND FLASH 控制器的verilog源码,很有参考价值! 这是NAND FLASH 控制器的verilog源码,很有参考价值!
recommend-type

实体消歧系列文章.rar

实体消歧系列文章.rar
recommend-type

matlab飞行轨迹代码-msa-toolkit:这是在MATLAB中开发的用于模拟火箭6自由度动力学的代码

matlab飞行模拟代码msa-工具包 MSA 工具包是存储任务分析团队实施的代码的存储库。 它由几个文件夹组成,将在下面的段落中简要介绍。 模拟器 这是在MATLAB中开发的用于模拟6自由度火箭动力学的代码。 该模拟器可预测 3D 轨迹、远地点、作用在火箭上的力以及各种其他空气动力学数据。 数据 包含当前飞行数据、火箭几何形状和模拟参数的文件夹。 通用功能 在该文件夹中,存储了工具包代码中使用的常用函数。 autoMatricesProtub 此代码允许使用 Missile DATCOM 自动计算火箭空气动力学系数,适用于不同的气闸配置。 空气动力学优化 此代码实现了火箭的空气动力学优化。 优化变量是鳍弦和高度、鳍形状、卵形长度和卵形形状。 代码使用遗传算法达到目的。 远地点分析 当结构质量已知且具有一定程度的不确定性时,此代码使用不同的电机执行主要的远地点分析,以选择最好的电机。 敏感性分析 该代码实现了对火箭上升阶段的敏感性分析。 有两种类型的分析可用:确定性和随机性。 在确定性分析中,可以改变空气动力学系数的标称值和火箭的结构质量。 变化的相对幅度由用户设置,并且对于分析中考虑
recommend-type

qt打包程序(自定义打包界面及功能)

1 BasePack项目是安装包界面,用静态编译的qt创建的项目 2 静态编译的环境是vs2017+32位的编译器编译而成 3 PackQtEx项目是打包界面,用的也是vs2017+32位编译器创建的 4 打包用的压缩库用的是32位的静态7z库 5 安装包用的解压缩库用的也是32位的静态7z库 6 没有选择vs2017+64位编译器的原因是,没法用64位的去静态编译qt库,我没试成功。 7 打包界面界面不是静态编译的qt创建的,为了使用相同的32位7z库,所以也选择了32位的vs2017编译器创建项目。
recommend-type

易语言WinSock模块应用

易语言WinSock模块应用源码,WinSock模块应用,启动,停止,监听,发送,接收,断开连接,取服务器端口,取服务器IP,取客户IP,取客户端口,异步选择,检查连接状态,连接,断开,关闭,创建,发送数据,接收数据,取本机名,取本机IP组,窗口1消息处理,客户进入,客户离开,数据到达

最新推荐

recommend-type

试谈商业电子商务师创业计划书撰写要求.doc

试谈商业电子商务师创业计划书撰写要求.doc
recommend-type

互联网对企业营销的影响优秀.ppt

互联网对企业营销的影响优秀.ppt
recommend-type

自助平台用户手册下载校园翼讯学生自助服务网站模板.doc

自助平台用户手册下载校园翼讯学生自助服务网站模板.doc
recommend-type

nuscenes-infos-test-occ.pkl.zip

nuscenes_infos_test_occ.pkl.zip
recommend-type

大型企业网络设计和实现.doc

大型企业网络设计和实现.doc
recommend-type

ASP.NET新闻管理系统:用户管理与内容发布功能

知识点: 1. ASP.NET 概念:ASP.NET 是一个开源、服务器端 Web 应用程序框架,用于构建现代 Web 应用程序。它是 .NET Framework 的一部分,允许开发者使用 .NET 语言(例如 C# 或 VB.NET)来编写网页和 Web 服务。 2. 新闻发布系统功能:新闻发布系统通常具备用户管理、新闻分级、编辑器处理、发布、修改、删除等功能。用户管理指的是系统对不同角色的用户进行权限分配,比如管理员和普通编辑。新闻分级可能是为了根据新闻的重要程度对它们进行分类。编辑器处理涉及到文章内容的编辑和排版,常见的编辑器有CKEditor、TinyMCE等。而发布、修改、删除功能则是新闻发布系统的基本操作。 3. .NET 2.0:.NET 2.0是微软发布的一个较早版本的.NET框架,它是构建应用程序的基础,提供了大量的库和类。它在当时被广泛使用,并支持了大量企业级应用的构建。 4. 文件结构分析:根据提供的压缩包子文件的文件名称列表,我们可以看到以下信息: - www.knowsky.com.txt:这可能是一个文本文件,包含着Knowsky网站的一些信息或者某个页面的具体内容。Knowsky可能是一个技术社区或者文档分享平台,用户可以通过这个链接获取更多关于动态网站制作的资料。 - 源码下载.txt:这同样是一个文本文件,顾名思义,它可能包含了一个新闻系统示例的源代码下载链接或指引。用户可以根据指引下载到该新闻发布系统的源代码,进行学习或进一步的定制开发。 - 动态网站制作指南.url:这个文件是一个URL快捷方式,它指向一个网页资源,该资源可能包含关于动态网站制作的教程、指南或者最佳实践,这对于理解动态网站的工作原理和开发技术将非常有帮助。 - LixyNews:LixyNews很可能是一个项目文件夹,里面包含新闻发布系统的源代码文件。通常,ASP.NET项目会包含多个文件,如.aspx文件(用户界面)、.cs文件(C#代码后台逻辑)、.aspx.cs文件(页面的代码后台)等。这个文件夹中应该还包含Web.config配置文件,它用于配置整个项目的运行参数和环境。 5. 编程语言和工具:ASP.NET主要是使用C#或者VB.NET这两种语言开发的。在该新闻发布系统中,开发者可以使用Visual Studio或其他兼容的IDE来编写、调试和部署网站。 6. 新闻分级和用户管理:新闻分级通常涉及到不同的栏目分类,分类可以是按照新闻类型(如国际、国内、娱乐等),也可以是按照新闻热度或重要性(如头条、焦点等)进行分级。用户管理则是指系统需具备不同的用户身份验证和权限控制机制,保证只有授权用户可以进行新闻的发布、修改和删除等操作。 7. 编辑器处理:一个新闻发布系统的核心组件之一是所使用的Web编辑器。这个编辑器可以是内置的简单文本框,也可以是富文本编辑器(WYSIWYG,即所见即所得编辑器),后者能够提供类似于Word的编辑体验,并能输出格式化后的HTML代码。CKEditor和TinyMCE是常用的开源Web编辑器,它们支持插入图片、视频、表格等多种媒体,并能对文本进行复杂的格式化操作。 8. 发布、修改和删除功能:这是新闻发布系统的基本操作功能。发布功能允许用户将编辑好的新闻内容上线;修改功能可以对已发布的新闻内容进行更新;删除功能则用于移除不再需要的新闻文章。这些操作通常需要后台管理界面来支持,并且系统会在数据库中记录相关操作的记录,以便管理历史版本和审计日志。 以上知识点覆盖了从ASP.NET基础、新闻发布系统的具体功能实现到系统开发过程中的细节处理等多个方面。开发者在构建类似系统时,需要深入了解这些知识点,才能设计和实现一个功能完备、易用、安全的新闻发布系统。
recommend-type

【实战派量化投资秘籍】:Pair Trading策略全方位解析

# 摘要 量化投资中的Pair Trading策略是一种依赖统计套利和市场效率假说的交易方法,其核心在于选择相关性高的资产作为交易对并应用协整理论进行市场中立投资。本文首先概述了Pair Trading策略的理论基础,随后详细探讨了策略的实操技巧,包括数据预处理、模型建立和交易信号生成。接着,文章重点介绍了策略的编程实现,提供了环境搭建
recommend-type

fpga中保持时间建立时间时序约束

<think>我们讨论的是FPGA中的建立时间(Setup Time)和保持时间(Hold Time)时序约束问题。建立时间是指在时钟有效边沿到来之前,数据必须保持稳定的最小时间。保持时间是指在时钟有效边沿到来之后,数据必须保持稳定的最小时间。时序约束就是确保设计满足这些时间要求。 在FPGA设计中,我们通过时序约束(如时钟约束、输入输出延迟约束等)来告知工具设计的时序要求,工具会根据这些约束进行优化和验证。 以下是关于建立时间和保持时间时序约束的详细说明: ### 1. 建立时间和保持时间的基本概念 - **建立时间(Setup Time)**:时钟边沿到达前,数据必须稳定的时间。 -
recommend-type

Notepad2: 高效替代XP系统记事本的多功能文本编辑器

### 知识点详解 #### 标题解析 - **Vista记事本(Notepad2)**: Vista记事本指的是一款名为Notepad2的文本编辑器,它不是Windows Vista系统自带的记事本,而是一个第三方软件,具备高级编辑功能,使得用户在编辑文本文件时拥有更多便利。 - **可以替换xp记事本Notepad**: 这里指的是Notepad2拥有替换Windows XP系统自带记事本(Notepad)的能力,意味着用户可以安装Notepad2来获取更强大的文本处理功能。 #### 描述解析 - **自定义语法高亮**: Notepad2支持自定义语法高亮显示,可以对编程语言如HTML, XML, CSS, JavaScript等进行关键字着色,从而提高代码的可读性。 - **支持多种编码互换**: 用户可以在不同的字符编码格式(如ANSI, Unicode, UTF-8)之间进行转换,确保文本文件在不同编码环境下均能正确显示和编辑。 - **无限书签功能**: Notepad2支持设置多个书签,用户可以根据需要对重要代码行或者文本行进行标记,方便快捷地进行定位。 - **空格和制表符的显示与转换**: 该编辑器可以将空格和制表符以不同颜色高亮显示,便于区分,并且可以将它们互相转换。 - **文本块操作**: 支持使用ALT键结合鼠标操作,进行文本的快速选择和编辑。 - **括号配对高亮显示**: 对于编程代码中的括号配对,Notepad2能够高亮显示,方便开发者查看代码结构。 - **自定义代码页和字符集**: 支持对代码页和字符集进行自定义,以提高对中文等多字节字符的支持。 - **标准正则表达式**: 提供了标准的正则表达式搜索和替换功能,增强了文本处理的灵活性。 - **半透明模式**: Notepad2支持半透明模式,这是一个具有视觉效果的功能,使得用户体验更加友好。 - **快速调整页面大小**: 用户可以快速放大或缩小编辑器窗口,而无需更改字体大小。 #### 替换系统记事本的方法 - **Windows XP/2000系统替换方法**: 首先关闭系统文件保护,然后删除系统文件夹中的notepad.exe,将Notepad2.exe重命名为notepad.exe,并将其复制到C:\Windows和C:\Windows\System32目录下,替换旧的记事本程序。 - **Windows 98系统替换方法**: 直接将重命名后的Notepad2.exe复制到C:\Windows和C:\Windows\System32目录下,替换旧的记事本程序。 #### 关闭系统文件保护的方法 - 通过修改Windows注册表中的"SFCDisable"键值,可以临时禁用Windows系统的文件保护功能。设置键值为"FFFFFF9D"则关闭文件保护,设置为"0"则重新启用。 #### 下载地址 - 提供了Notepad2的下载链接,用户可以通过该链接获取安装包。 #### 文件压缩包内文件名 - **Notepad2MOD1.1.0.8CN.exe**: 这是压缩包内所含的Notepad2编译版本,表明这是一个中文版的安装程序,版本号为1.1.0.8。 ### 总结 Notepad2是一款强大的文本编辑器,它继承了传统的记事本程序界面,同时引入了诸多增强功能,如语法高亮、编码格式转换、书签管理、文本操作快捷键、括号高亮匹配等。这使得它在处理代码、标记语言和其他文本文件时具备极大的优势。用户可以通过替换系统默认记事本的方式,将Notepad2融入到操作系统中,充分享受这些高级功能带来的便捷。同时,提供了关闭系统文件保护的方法,以便用户能够顺利完成替换工作。最后,给出了下载地址,方便用户获取软件安装包。
recommend-type

【mPower1203驱动故障全攻略】:排除新手疑难杂症,提升部署效率

# 1. mPower1203驱动概述与故障诊断基础 在当今信息技术飞速发展的时代,高效准确地诊断和解决驱动故障对于确保企业级IT系统的稳定运行至关重要。mPower1203驱动作为一个广泛应用于高性能计算和数据处理领域的驱动程序,它的稳定性和性能优化对于很多关键业务系统都是不可忽视的。本章节将为您提供一个mPower1203驱动的概述,并对故障诊断的