ENSURE_COLUMN


CREATE OR REPLACE PROCEDURE ENSURE_COLUMN(var_table_name in varchar2, var_column_name in varchar2, var_column_type in varchar2)
AS
 IS_TABLE_EXISTS NUMBER;
 IS_COLUMN_EXISTS NUMBER;
BEGIN
         SELECT count(*) into  IS_TABLE_EXISTS FROM USER_TABLES WHERE TABLE_NAME=var_table_name;
         IF IS_TABLE_EXISTS=0 THEN
            EXECUTE IMMEDIATE 'CREATE TABLE '||var_table_name||' ( '||var_column_name||' '||var_column_type||' ) ';
         ELSE
            SELECT count(*) into  IS_COLUMN_EXISTS FROM user_tab_columns WHERE TABLE_NAME=var_table_name AND COLUMN_NAME=var_column_name;
            IF IS_COLUMN_EXISTS=0 THEN
                 EXECUTE IMMEDIATE 'ALTER TABLE '||var_table_name||' ADD ('||var_column_name||' '||var_column_type||' ) ';
            ELSE
                 EXECUTE IMMEDIATE 'ALTER TABLE '||var_table_name||' MODIFY ('||var_column_name||' '||var_column_type||' ) ';
            END IF;
         END IF;
END;


import pandas as pd import numpy as np from scipy.optimize import minimize_scalar import statsmodels.api as sm import matplotlib.pyplot as plt import seaborn as sns class NIPTOptimizer: def __init__(self, data_path): """初始化NIPT优化器""" self._validate_data(data_path) self.data = pd.read_excel(data_path) self._ensure_column_consistency() self.bmi_groups = [(20.0, 28.0), (28.0, 32.0), (32.0, 36.0), (36.0, 40.0)] self.group_labels = ['正常低值', '正常高值', '中度偏高', '高度偏高'] self._qc_weight = 0.15 # 数据质量惩罚因子 def _validate_data(self, path): """数据验证装饰器""" if not isinstance(path, str) or not path.endswith(('.xls', '.xlsx')): raise ValueError("无效的数据文件路径") def _ensure_column_consistency(self): """确保关键列存在""" required_cols = ['孕妇BMI', '检测孕周', '检测抽血次数', 'GC含量', 'Y染色体浓度', '13号染色体的Z值', '18号染色体的Z值', '21号染色体的Z值'] for col in required_cols: if col not in self.data.columns: raise ValueError(f"缺少必要字段: {col}") def get_weights(self, group_label): """动态权重配置""" return { '正常低值': (0.7, 0.3), '正常高值': (0.6, 0.4), '中度偏高': (0.5, 0.5), '高度偏高': (0.4, 0.6) }[group_label] def calculate_risk(self, group_data, t, t_min): """统一风险评估框架""" rt = self._calculate_rt_risk(t_min, t) re = self._calculate_re_risk(group_data, t) return 0.7*re + 0.3*rt # 基准权重比例 def _calculate_rt_risk(self, t_min, current_week): """治疗窗口期风险计算""" base_risk = 0.1 + 0.05 * max(0, current_week - t_min) blood_draw_count = self.data[self.data['检测孕周'] == current_week]['检测抽血次数'].mean() return min(base_risk * (1 + 0.1 * max(0, 3 - blood_draw_count)), 0.8) def _calculate_re_risk(self, group_data, t): """检测误差风险计算""" subset = self._get_time_window_data(group_data, t) if len(subset) < 3: return self._handle_insufficient_data(group_data) gc_abnormal = self._check_gc_content(subset) ci_widths = self._calculate_ci_widths(subset) cv_y = self._calculate_cv_y(subset) return 0.4*gc_abnormal + 0.3*np.mean(ci_widths) + 0.3*cv_y def _get_time_window_data(self, group_data, t): """获取时间窗口数据""" return group_data[ (group_data['检测孕周'] >= t - 0.5) & (group_data['检测孕周'] <= t + 0.5) ].copy() def _check_gc_content(self, subset): """GC含量异常检测""" return subset['GC含量'].apply( lambda x: 1 if x < 39.5 or x > 60 else 0 ).mean() def _calculate_ci_widths(self, subset): """置信区间宽度计算""" z_cols = ['13号染色体的Z值', '18号染色体的Z值', '21号染色体的Z值'] return [ 1.96 * (subset[col].std()/np.sqrt(len(subset[col]))) for col in z_cols if col in subset.columns ] def _calculate_cv_y(self, subset): """Y染色体浓度变异系数""" y_conc = subset['Y染色体浓度'] return y_conc.std()/y_conc.mean() if y_conc.mean() > 0 else 0.3 def _handle_insufficient_data(self, group_data): """数据不足处理策略""" blood_draw = group_data['检测抽血次数'].mean() return 0.8 - 0.1 * min(blood_draw, 3) # 抽血次数越多风险越低 def estimate_t_min(self, group_data): """Y浓度达标孕周估计""" try: group_data = group_data.sort_values('检测孕周') if len(group_data) < 5: return 12.0 lowess = sm.nonparametric.lowess( group_data['Y染色体浓度'], group_data['检测孕周'], frac=0.3, it=3 ) smooth_df = pd.DataFrame(lowess, columns=['孕周', '浓度']) valid_weeks = smooth_df[smooth_df['浓度'] >= 4.0]['孕周'] return valid_weeks.min() if not valid_weeks.empty else 12.0 except Exception as e: print(f"LOWESS估计异常: {str(e)}") return 12.0 def optimize(self): """执行优化计算""" results, risk_analysis = [], [] for label, (bmi_min, bmi_max) in zip(self.group_labels, self.bmi_groups): group_data = self.data[ (self.data['孕妇BMI'] >= bmi_min) & (self.data['孕妇BMI'] < bmi_max) ].copy() t_min = self.estimate_t_min(group_data) weights = self.get_weights(label) # 优化配置 result = minimize_scalar( self._objective_function, bounds=(max(t_min, 10.0), 25.0), method='bounded', args=(group_data, weights) ) # 结果收集 results.append({ '分组标签': label, 'BMI区间': f"({bmi_min:.1f}, {bmi_max:.1f})", '最佳检测周': round(result.x, 4), '最小总风险': round(result.fun, 4), '数据质量系数': group_data['检测抽血次数'].mean()/3 }) risk_analysis.append({ '分组标签': label, 't_min': t_min, '窗口期风险': self._calculate_rt_risk(t_min, result.x), '检测风险': self._calculate_re_risk(group_data, result.x) }) return pd.DataFrame(results), pd.DataFrame(risk_analysis) def _objective_function(self, t, group_data, weights): """目标函数封装""" rt = self._calculate_rt_risk(group_data['检测孕周'].max(), t) re = self._calculate_re_risk(group_data, t) return weights[0]*re + weights[1]*rt def visualize(self, results_df, risk_df): """优化后的可视化模块""" plt.style.use('seaborn-v0_8-whitegrid') plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统 plt.rcParams['axes.unicode_minus'] = False # 创建画布 fig = plt.figure(figsize=(18, 12)) # 子图1:最佳检测时间分布 ax1 = fig.add_subplot(221) sns.barplot( x='分组标签', y='最佳检测周', data=results_df, ci=None, # 移除置信区间 palette='rocket' # 新版推荐调色板 ) ax1.set_title('不同BMI组最佳检测时间', fontsize=14) ax1.set_xlabel('BMI分组') ax1.set_ylabel('最佳检测周(周)') # 子图2:风险权重分布 ax2 = fig.add_subplot(222) weights = results_df[['数据质量系数', '最小总风险']] weights.plot( kind='bar', stacked=True, ax=ax2, colormap='viridis', edgecolor='black' # 增强可读性 ) ax2.set_title('数据质量与风险关系', fontsize=14) ax2.set_xticklabels(results_df['分组标签'], rotation=45) # 子图3:风险对比分析 ax3 = fig.add_subplot(223) risk_df[['窗口期风险', '检测风险']].plot( kind='bar', ax=ax3, color=['#1f77b4', '#ff7f0e'], width=0.7 ) ax3.set_title('风险构成分析', fontsize=14) ax3.grid(axis='y', linestyle='--', alpha=0.7) # 子图4:总风险分布 ax4 = fig.add_subplot(224) sns.kdeplot( data=results_df, x='最小总风险', fill=True, ax=ax4, color='#2ca02c', thresh=0.05 ) ax4.set_title('总风险分布密度', fontsize=14) ax4.set_xlabel('最小总风险值') ax4.set_ylabel('密度') # 保存优化 plt.tight_layout() plt.savefig('optimization_results.png', dpi=300, bbox_inches='tight') plt.show() # 使用示例 if __name__ == "__main__": optimizer = NIPTOptimizer("男胎检测数据_预处理.xlsx") optimal_df, risk_df = optimizer.optimize() print("=== 优化结果 ===") print(optimal_df[['分组标签', 'BMI区间', '最佳检测周', '最小总风险']]) print("\n=== 风险分析 ===") print(risk_df[['分组标签', '窗口期风险', '检测风险']]) optimizer.visualize(optimal_df, risk_df) === 优化结果 === 分组标签 BMI区间 最佳检测周 最小总风险 0 正常低值 (20.0, 28.0) 15.0689 0.4242 1 正常高值 (28.0, 32.0) 14.5160 0.3745 2 中度偏高 (32.0, 36.0) 14.8380 0.3314 3 高度偏高 (36.0, 40.0) 14.3444 0.2667 === 风险分析 === 分组标签 窗口期风险 检测风险 0 正常低值 0.253444 0.563158 1 正常高值 0.225800 0.557506 2 中度偏高 0.241901 0.562718 3 高度偏高 0.217221 0.516854
09-08
查看问题2的代码后输出完整的问题3代码 问题2的代码为 import pandas as pd import numpy as np from scipy.optimize import minimize_scalar import statsmodels.api as sm import matplotlib.pyplot as plt import seaborn as sns class NIPTOptimizer: def __init__(self, data_path): self._validate_data(data_path) self.data = pd.read_excel(data_path) self._ensure_column_consistency() # BMI 分组定义 self.bmi_groups = [(20.0, 28.0), (28.0, 32.0), (32.0, 36.0), (36.0, 40.0)] self.group_labels = ['正常低值', '正常高值', '中度偏高', '高度偏高'] def _validate_data(self, path): """验证数据路径是否合法""" if not isinstance(path, str) or not path.endswith(('.xls', '.xlsx')): raise ValueError("无效的数据文件路径") def _ensure_column_consistency(self): """确保关键列存在""" required_cols = [ '孕妇BMI', '检测孕周', '检测抽血次数', 'GC含量', 'Y染色体浓度', '13号染色体的Z值', '18号染色体的Z值', '21号染色体的Z值' ] for col in required_cols: if col not in self.data.columns: raise ValueError(f"缺少必要字段: {col}") def get_weights(self, group_label): """根据不同 BMI 分组设置风险权重""" return { '正常低值': (0.7, 0.3), '正常高值': (0.6, 0.4), '中度偏高': (0.5, 0.5), '高度偏高': (0.3, 0.7) }[group_label] def compute_data_quality(self, group_data): """ 计算数据质量: ▪ 相对质量 = 抽血次数 / 组内均值 ▪ 绝对质量 = 抽血次数 ▪ 综合质量 = 0.3 * 相对质量 + 0.7 * 绝对质量 """ avg_draws = group_data['检测抽血次数'].mean() group_data['相对数据质量'] = group_data['检测抽血次数'] / avg_draws group_data['绝对数据质量'] = group_data['检测抽血次数'] group_data['综合数据质量'] = 0.3 * group_data['相对数据质量'] + 0.7 * group_data['绝对数据质量'] return group_data def _calculate_rt_risk(self, t_min, current_week, bmi): """ 窗口期风险函数: ▪ 随孕周增长而上升 ▪ 随实际 BMI 值增大而上升(乘性影响) ▪ 使用 bmi 来调节风险放大程度 """ base_risk = 0.1 + 0.05 * max(0, current_week - t_min) base_bmi = 20.0 bmi_factor = max(0, bmi - base_bmi) # 只对高于基准的 BMI 产生影响 risk_multiplier = 1 + 0.02 * bmi_factor # 0.02 为可调参数 # 抽血次数惩罚因子 blood_draw_count = self.data[self.data['检测孕周'] == current_week]['检测抽血次数'].mean() blood_penalty = 1 + 0.1 * max(0, 3 - blood_draw_count) # 最终风险 rt_risk = base_risk * risk_multiplier * blood_penalty return min(rt_risk, 0.8) def _calculate_re_risk(self, group_data, t): """检测误差风险计算""" subset = self._get_time_window_data(group_data, t) if len(subset) < 3: return self._handle_insufficient_data(group_data) # GC含量异常检测 gc_abnormal = self._check_gc_content(subset) # CI 宽度计算 ci_widths = self._calculate_ci_widths(subset) # Y染色体浓度变异系数 cv_y = self._calculate_cv_y(subset) return 0.4 * gc_abnormal + 0.3 * np.mean(ci_widths) + 0.3 * cv_y def _get_time_window_data(self, group_data, t): """获取时间窗口数据""" return group_data[ (group_data['检测孕周'] >= t - 0.5) & (group_data['检测孕周'] <= t + 0.5) ].copy() def _check_gc_content(self, subset): """GC含量异常检测""" return subset['GC含量'].apply( lambda x: 1 if x < 39.5 or x > 60 else 0 ).mean() def _calculate_ci_widths(self, subset): """置信区间宽度计算""" z_cols = ['13号染色体的Z值', '18号染色体的Z值', '21号染色体的Z值'] return [ 1.96 * (subset[col].std() / np.sqrt(len(subset[col]))) for col in z_cols if col in subset.columns ] def _calculate_cv_y(self, subset): """Y染色体浓度变异系数""" y_conc = subset['Y染色体浓度'] return y_conc.std() / y_conc.mean() if y_conc.mean() > 0 else 0.3 def _handle_insufficient_data(self, group_data): """数据不足处理策略""" blood_draw = group_data['检测抽血次数'].mean() return 0.8 - 0.1 * min(blood_draw, 3) def calculate_penalized_re_risk(self, group_data, t, epsilon=0.001): """加入数据质量惩罚的检测误差风险""" re = self._calculate_re_risk(group_data, t) dq = group_data['综合数据质量'].mean() return re * (1 / (dq + epsilon)) def estimate_t_min(self, group_data): """Y浓度达标孕周估计""" try: group_data = group_data.sort_values('检测孕周') if len(group_data) < 5: return 12.0 lowess = sm.nonparametric.lowess( group_data['Y染色体浓度'], group_data['检测孕周'], frac=0.3, it=3 ) smooth_df = pd.DataFrame(lowess, columns=['孕周', '浓度']) valid_weeks = smooth_df[smooth_df['浓度'] >= 4.0]['孕周'] return valid_weeks.min() if not valid_weeks.empty else 12.0 except Exception as e: print(f"LOWESS估计异常: {str(e)}") return 12.0 def _objective_function(self, t, group_data, weights): """目标函数封装:逐样本计算 rt_risk 并取平均""" t_min = group_data['检测孕周'].max() # 逐样本计算 rt_risk rt_risks = [ self._calculate_rt_risk(t_min, t, row['孕妇BMI']) for _, row in group_data.iterrows() ] rt = np.mean(rt_risks) # 取平均值作为组级窗口期风险 re = self._calculate_re_risk(group_data, t) dq = group_data['综合数据质量'].mean() epsilon = 0.01 re *= (1 / (dq + epsilon)) return weights[0] * re + weights[1] * rt def optimize(self): results, risk_analysis = [], [] for label, (bmi_min, bmi_max) in zip(self.group_labels, self.bmi_groups): group_data = self.data[ (self.data['孕妇BMI'] >= bmi_min) & (self.data['孕妇BMI'] < bmi_max) ].copy() if len(group_data) < 2: continue # 跳过样本过少的组 group_data = self.compute_data_quality(group_data) t_min = self.estimate_t_min(group_data) weights = self.get_weights(label) result = minimize_scalar( self._objective_function, bounds=(max(t_min, 10.0), 25.0), method='bounded', args=(group_data, weights) ) # 收集结果 rt_risks = [ self._calculate_rt_risk(t_min, result.x, row['孕妇BMI']) for _, row in group_data.iterrows() ] rt = np.mean(rt_risks) results.append({ '分组标签': label, 'BMI区间': f"({bmi_min:.1f}, {bmi_max:.1f})", '最佳检测周': round(result.x, 4), '最小总风险': round(result.fun, 4), '平均窗口期风险': round(rt, 4), '相对数据质量': group_data['相对数据质量'].mean(), '绝对数据质量': group_data['绝对数据质量'].mean(), '综合数据质量': group_data['综合数据质量'].mean() }) risk_analysis.append({ '分组标签': label, 't_min': t_min, '窗口期风险': rt, '检测风险': self.calculate_penalized_re_risk(group_data, result.x) }) return pd.DataFrame(results), pd.DataFrame(risk_analysis) def visualize(self, results_df, risk_df): """优化后的可视化模块""" plt.style.use('seaborn-v0_8-whitegrid') plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False fig = plt.figure(figsize=(18, 12)) # 子图1:最佳检测时间分布 ax1 = fig.add_subplot(221) sns.barplot(x='分组标签', y='最佳检测周', data=results_df, ci=None, palette='rocket') ax1.set_title('不同BMI组最佳检测时间', fontsize=14) ax1.set_xlabel('BMI分组') ax1.set_ylabel('最佳检测周(周)') # 子图2:数据质量与风险关系 ax2 = fig.add_subplot(222) results_df[['相对数据质量', '综合数据质量', '最小总风险']].plot(kind='bar', ax=ax2, colormap='viridis', edgecolor='black') ax2.set_title('数据质量与总风险关系', fontsize=14) ax2.set_xticklabels(results_df['分组标签'], rotation=45) # 子图3:风险对比分析 ax3 = fig.add_subplot(223) risk_df[['窗口期风险', '检测风险']].plot(kind='bar', ax=ax3, color=['#1f77b4', '#ff7f0e'], width=0.7) ax3.set_title('风险构成分析', fontsize=14) ax3.grid(axis='y', linestyle='--', alpha=0.7) # 子图4:总风险分布密度 ax4 = fig.add_subplot(224) sns.kdeplot(data=results_df, x='最小总风险', fill=True, ax=ax4, color='#2ca02c', thresh=0.05) ax4.set_title('总风险分布密度', fontsize=14) ax4.set_xlabel('最小总风险值') ax4.set_ylabel('密度') plt.tight_layout() plt.savefig('optimization_results.png', dpi=300, bbox_inches='tight') plt.show() # 示例运行 if __name__ == "__main__": optimizer = NIPTOptimizer("男胎检测数据_预处理.xlsx") optimal_df, risk_df = optimizer.optimize() print("=== 优化结果 ===") print(optimal_df[['分组标签', 'BMI区间', '最佳检测周', '最小总风险', '平均窗口期风险']]) print("\n=== 风险分析 ===") print(risk_df[['分组标签', '窗口期风险', '检测风险']]) optimizer.visualize(optimal_df, risk_df)
09-08
下载前可以先看下教程 https://pan.quark.cn/s/a4b39357ea24 SSM框架,涵盖了Spring MVC、Spring以及MyBatis这三个框架,在Java领域内作为构建Web应用程序的常用架构而备受青睐,特别是在电子商务购物平台的设计与实现过程中展现出极高的应用价值。 这三个框架各自承担着特定的功能角色,通过协同运作来达成高效且灵活的业务处理目标。 Spring MVC作为Spring体系结构中的一个关键部分,主要致力于处理HTTP请求与响应,并推行模型-视图-控制器(MVC)的设计模式。 其运作机制中,DispatcherServlet扮演着前端控制器的角色,负责接收HTTP请求,并将其依据请求映射至相应的Controller处理方法。 在Controller执行完业务逻辑后,会将处理结果传递给ModelAndView对象,随后由ViewResolver将其解析为具体视图进行呈现。 Spring MVC还具备数据绑定、验证以及国际化等附加功能,这些特性显著提升了开发工作的效率以及代码的可维护程度。 Spring框架则是一个综合性的企业级应用开发框架,其核心能力包含依赖注入(DI)、面向切面编程(AOP)以及事务管理等关键特性。 DI机制使得开发者能够借助配置文件或注解手段来管理对象的生成与依赖关联,从而有效降低组件之间的耦合性。 AOP技术则适用于实现诸如日志记录、权限管理这类跨领域的功能需求,有助于使代码结构更为清晰。 Spring在事务管理方面提供了编程式和声明式两种处理途径,确保了数据操作过程遵循原子性与一致性原则。 MyBatis则是一个轻量级的数据库访问层框架,其特点在于将SQL语句与Java代码进行分离,并支持动态SQL的编写。 开发者可以在XM...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值