基于Python的药物相互作用预测模型AI构建与优化(下.代码部分)
四、特征工程
4.1 分子描述符计算
分子描述符作为量化分子性质的关键数值,能够从多维度反映药物分子的结构和化学特征,在药物相互作用预测中起着举足轻重的作用。RDKit 库凭借其强大的功能,为我们提供了丰富的分子描述符计算方法,涵盖了多个重要方面的分子性质。
分子量(Molecular Weight)是最基本的分子描述符之一,它反映了分子的质量大小,对药物的药代动力学性质有着不可忽视的影响。在药物研发和临床应用中,分子量是评估药物吸收、分布、代谢和排泄过程的重要参考指标。例如,一般来说,分子量较小的药物更容易通过生物膜,从而提高其生物利用度。在 RDKit 中,计算分子量的方法简洁高效,通过Descriptors.MolWt(mol)函数,即可准确地计算出分子的分子量。以阿司匹林(SMILES 字符串为为例,首先使用Chem.MolFromSmiles函数将 SMILES 字符串转换为分子对象mol,然后调用Descriptors.MolWt(mol)函数,就能得到阿司匹林的分子量。具体代码如下:
from rdkit import Chemfrom rdkit.Chem import Descriptorssmiles = "CC(=O)OC1=CC=CC=C1C(=O)O"mol = Chem.MolFromSmiles(smiles)molecular_weight = Descriptors.MolWt(mol)print(f"阿司匹林的分子量: {molecular_weight}")
运行上述代码,即可得到阿司匹林的分子量,这一数值为后续分析阿司匹林在体内的药代动力学过程提供了基础数据。
拓扑极性表面积(Topological Polar Surface Area, TPSA)是衡量分子极性的重要指标,它与药物分子的水溶性、膜通透性等密切相关。药物分子的水溶性和膜通透性是影响其药效的关键因素,水溶性好的药物更容易在体内溶解和运输,而膜通透性高的药物则更容易进入细胞内发挥作用。TPSA 能够准确地反映分子中极性部分的表面积,从而为评估药物分子的这些性质提供依据。在 RDKit 中,使用Descriptors.TPSA(mol)函数可以方便地计算分子的 TPSA。对于上述阿司匹林分子,计算其 TPSA 的代码如下:
tpsa = Descriptors.TPSA(mol)print(f"阿司匹林的拓扑极性表面积: {tpsa}")
通过计算得到的 TPSA 值,我们可以初步判断阿司匹林的水溶性和膜通透性情况,为药物相互作用预测提供重要的特征信息。
脂溶性(LogP)也是一个重要的分子描述符,它反映了药物分子在油相和水相中的分配系数,对药物的吸收、分布和代谢过程有着重要影响。脂溶性适中的药物更容易通过生物膜,进入体内发挥作用,但如果脂溶性过高,药物可能会在脂肪组织中蓄积,导致不良反应的发生。在 RDKit 中,使用Descriptors.MolLogP(mol)函数可以计算分子的 LogP 值。对于阿司匹林分子,计算其 LogP 的代码如下:
| logp = Descriptors.MolLogP(mol) print(f"阿司匹林的脂溶性(LogP): {logp}") |
通过计算得到的 LogP 值,我们可以了解阿司匹林在体内的分布情况,进一步分析其与其他药物发生相互作用的可能性。
氢键供体 / 受体数(HBD、HBA)是描述分子形成氢键能力的重要指标,氢键在药物与靶点的相互作用中起着关键作用。药物分子与靶点之间通过氢键相互作用,可以改变靶点的活性,从而影响药物的疗效。在 RDKit 中,使用Descriptors.NumHDonors(mol)函数可以计算分子的氢键供体数,使用Descriptors.NumHAcceptors(mol)函数可以计算分子的氢键受体数。对于阿司匹林分子,计算其氢键供体数和氢键受体数的代码如下:
| hbd = Descriptors.NumHDonors(mol) hba = Descriptors.NumHAcceptors(mol) print(f"阿司匹林的氢键供体数: {hbd}") print(f"阿司匹林的氢键受体数: {hba}") |
通过计算得到的氢键供体数和氢键受体数,我们可以分析阿司匹林与其他药物或靶点之间形成氢键的可能性,为药物相互作用预测提供重要的特征信息。
这些分子描述符从不同维度刻画了药物分子的化学性质,综合起来能够全面地描述药物分子的特征。在药物相互作用预测模型中,将这些分子描述符作为输入特征,能够帮助模型更好地学习药物分子之间的相互作用模式,提高模型的预测准确性。
4.2 分子指纹生成
分子指纹作为一种将分子结构信息压缩成固定长度二进制向量的强大工具,能够高效地捕捉药物分子的结构特征,在药物相互作用预测中发挥着关键作用。其中,Morgan 指纹是一种应用广泛的分子指纹,它通过独特的算法,能够有效地编码分子结构的局部环境信息,为药物相互作用预测模型提供重要的输入特征。
在 Python 中,利用 RDKit 库可以方便地生成 Morgan 指纹。RDKit 库提供了丰富的函数和工具,使得分子指纹的生成过程变得简洁而高效。以生成半径为 2、位数为 2048 的 Morgan 指纹为例,首先需要将药物分子的 SMILES 字符串转换为 RDKit 中的分子对象mol,这一步可以通过Chem.MolFromSmiles函数实现。然后,使用AllChem.GetMorganFingerprintAsBitVect函数生成分子的 Morgan 指纹。具体代码如下:
| from rdkit import Chem from rdkit.Chem import AllChem smiles = "CC(=O)OC1=CC=CC=C1C(=O)O" # 阿司匹林的SMILES字符串 mol = Chem.MolFromSmiles(smiles) fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, nBits=2048) |
在上述代码中,radius=2表示指纹计算时考虑的原子邻域半径,半径越大,指纹包含的分子结构信息越丰富,但计算量也会相应增加。nBits=2048表示生成的指纹向量的长度为 2048 位,较长的指纹向量能够更细致地描述分子结构,但也可能会增加数据的维度和模型训练的复杂度。通过调整这两个参数,可以根据实际需求和数据特点,生成最适合药物相互作用预测的分子指纹。
生成的 Morgan 指纹是一个固定长度的二进制向量,其中的每一位都代表了分子结构中的某种特征。这些特征可能是分子中的特定原子组合、化学键类型或局部结构模式等。通过将药物分子转换为 Morgan 指纹,我们可以将复杂的分子结构信息转化为易于计算机处理的数字特征,从而方便后续的模型训练和分析。在药物相互作用预测模型中,将 Morgan 指纹作为输入特征,可以帮助模型更好地识别具有相似相互作用模式的药物分子,提高模型的预测准确性。例如,在训练过程中,模型可以学习到不同药物分子的 Morgan 指纹与药物相互作用之间的关联,从而在遇到新的药物分子时,能够根据其 Morgan 指纹预测它与其他药物发生相互作用的可能性。
4.3 药物对特征构建
在药物相互作用预测中,仅考虑单个药物的特征是不够的,因为药物相互作用本质上是两个药物之间的相互关系。因此,构建药物对的特征对于准确预测药物相互作用至关重要。我们通过结合两个药物的特征,并进行差值、乘积等操作,能够挖掘出药物对之间的相互作用特征,为模型提供更丰富的信息。
以分子描述符为例,我们可以计算两个药物分子描述符的差值和乘积。假设药物 A 的分子量为mol_weight_A,药物 B 的分子量为mol_weight_B,则分子量差值diff_mol_weight可以通过diff_mol_weight = mol_weight_A - mol_weight_B计算得到。分子量差值能够反映两个药物在质量大小上的差异,这种差异可能与药物的药代动力学过程相关,从而影响它们之间的相互作用。例如,分子量差异较大的两个药物在体内的吸收、分布和代谢过程可能存在较大差异,这可能导致它们之间发生相互作用的可能性增加或减少。分子量乘积prod_mol_weight可以通过prod_mol_weight = mol_weight_A * mol_weight_B计算得到。分子量乘积从另一个角度反映了两个药物的特征组合,它可能与药物的某些协同作用或拮抗作用相关。在某些情况下,两个药物的分子量乘积可能与它们联合使用时的疗效或不良反应存在关联。
对于拓扑极性表面积(TPSA),同样可以计算差值和乘积。假设药物 A 的 TPSA 为tpsa_A,药物 B 的 TPSA 为tpsa_B,则 TPSA 差值diff_tpsa为diff_tpsa = tpsa_A - tpsa_B,TPSA 乘积prod_tpsa为prod_tpsa = tpsa_A * tpsa_B。TPSA 差值和乘积能够反映两个药物在极性和水溶性方面的差异和组合,这些性质对于药物在体内的跨膜转运和相互作用具有重要影响。例如,TPSA 差值较大的两个药物在细胞膜通透性上可能存在差异,这可能导致它们在细胞内的浓度分布不同,进而影响它们之间的相互作用。
在 Python 中,我们可以使用以下代码实现药物对特征的构建。假设drug_data是包含药物数据的 DataFrame,其中mol_weight列表示分子量,tpsa列表示拓扑极性表面积:
import pandas as pd# 假设drug_data是包含药物数据的DataFramedrug_data = pd.read_csv('drug_data.csv')# 假设数据集中已经计算好了每个药物的分子描述符,现在将数据转换为药物对的形式drug_pairs = []for i in range(len(drug_data)): for j in range(i + 1, len(drug_data)): drug_a = drug_data.iloc[i] drug_b = drug_data.iloc[j] pair = { 'drug_a_id': drug_a['drug_id'], 'drug_b_id': drug_b['drug_id'], 'mol_weight_a': drug_a['mol_weight'], 'mol_weight_b': drug_b['mol_weight'], 'tpsa_a': drug_a['tpsa'], 'tpsa_b': drug_b['tpsa'] } drug_pairs.append(pair)drug_pair_df = pd.DataFrame(drug_pairs)# 计算药物对的特征drug_pair_df['diff_mol_weight'] = drug_pair_df['mol_weight_a'] - drug_pair_df['mol_weight_b']drug_pair_df['prod_mol_weight'] = drug_pair_df['mol_weight_a'] * drug_pair_df['mol_weight_b']drug_pair_df['diff_tpsa'] = drug_pair_df['tpsa_a'] - drug_pair_df['tpsa_b']drug_pair_df['prod_tpsa'] = drug_pair_df['tpsa_a'] * drug_pair_df['tpsa_b']# 打印结果print(drug_pair_df.head())
上述代码首先将药物数据转换为药物对的形式,然后计算每个药物对的分子量差值、分子量乘积、TPSA 差值和 TPSA 乘积。通过这些计算,我们得到了一系列能够反映药物对之间相互作用特征的新特征,这些特征可以作为药物相互作用预测模型的输入,帮助模型更好地学习药物对之间的相互作用模式,提高预测的准确性。
4.4 特征选择与降维
在药物相互作用预测模型中,经过前面的步骤我们得到了大量的特征,然而并非所有特征都对预测任务具有同等的重要性。一些特征可能是冗余的,它们提供的信息已经包含在其他特征中;还有一些特征可能与药物相互作用的相关性较低,对模型的预测性能贡献不大。过多的特征不仅会增加模型的训练时间和计算成本,还可能导致过拟合问题,使模型在测试集上的表现不佳。因此,进行特征选择与降维是非常必要的,它能够去除冗余和无关特征,保留对预测任务最有价值的特征,从而提高模型的性能和泛化能力。
方差分析(Analysis of Variance,ANOVA)是一种常用的特征选择方法,它通过比较不同类别下特征的均值差异来判断特征的重要性。在药物相互作用预测中,我们可以将药物是否发生相互作用作为类别,计算每个特征在不同类别下的均值。如果某个特征在发生相互作用和不发生相互作用的药物对之间的均值差异显著,那么这个特征很可能对药物相互作用的预测具有重要意义。例如,对于药物的某种分子描述符,如果在发生相互作用的药物对中,该描述符的均值明显高于或低于不发生相互作用的药物对,说明这个描述符与药物相互作用存在关联。在 Python 中,使用scikit-learn库的f_classif函数可以方便地进行方差分析。假设X是特征矩阵,y是标签向量,代码如下:
| from sklearn.feature_selection import f_classif # 计算每个特征的F值和p值 f_values, p_values = f_classif(X, y) |
上述代码中,f_classif函数返回每个特征的 F 值和 p 值,F 值越大,说明该特征在不同类别下的均值差异越显著,p 值越小,说明该特征越显著。我们可以根据 F 值或 p 值对特征进行排序,选择 F 值较大或 p 值较小的特征作为重要特征。
相关性分析也是一种常用的特征选择方法,它用于衡量两个变量之间的线性相关程度。在药物相互作用预测中,我们可以计算每个特征与药物相互作用标签之间的相关性,以及特征之间的相关性。对于与药物相互作用标签相关性较低的特征,它们对预测任务的贡献可能较小,可以考虑去除;对于相互之间相关性较高的特征,它们可能存在冗余信息,我们可以选择其中一个代表性的特征,去除其他相关性高的特征。在 Python 中,使用pandas库的corr函数可以计算特征之间的相关性矩阵。假设data是包含特征和标签的 DataFrame,代码如下:
| import pandas as pd # 计算相关性矩阵 corr_matrix = data.corr() |
通过计算得到的相关性矩阵,我们可以直观地看到各个特征之间以及特征与标签之间的相关性。例如,如果某个特征与标签的相关性系数接近 0,说明该特征与药物相互作用的相关性较低;如果两个特征之间的相关性系数接近 1 或 - 1,说明这两个特征之间存在较强的线性相关关系,可能存在冗余。
主成分分析(Principal Component Analysis,PCA)是一种常用的降维方法,它通过线性变换将原始特征转换为一组新的正交特征,即主成分。这些主成分按照方差从大到小排列,方差越大表示该主成分包含的信息越多。在药物相互作用预测中,我们可以使用 PCA 将高维的特征空间转换为低维的主成分空间,从而降低特征的维度。在 Python 中,使用scikit-learn库的PCA类可以方便地实现主成分分析。假设X是特征矩阵,我们希望将特征维度降低到n_components维,代码如下:
| from sklearn.decomposition import PCA # 创建PCA对象,设置目标维度为n_components pca = PCA(n_components=n_components) # 对特征矩阵进行PCA降维 X_reduced = pca.fit_transform(X) |
上述代码中,PCA类的n_components参数指定了降维后的目标维度。通过fit_transform方法,我们可以将原始特征矩阵X转换为降维后的特征矩阵X_reduced。在选择n_components时,我们可以根据解释方差比来确定,解释方差比表示每个主成分所包含的方差占总方差的比例。通常,我们选择使得累计解释方差比达到一定阈值(如 0.95)的主成分数量作为n_components的值,这样可以在保留大部分信息的同时,有效地降低特征维度。

五、模型构建与训练
5.1 传统机器学习模型
5.1.1 逻辑回归模型
逻辑回归是一种广泛应用于分类问题的线性模型,虽然其名称中包含 “回归”,但实际上它是一种分类算法,在药物相互作用预测中具有重要的应用价值。
逻辑回归的基本原理基于线性回归模型,通过引入 sigmoid 函数将线性回归的输出映射到 (0, 1) 区间,从而实现对样本的分类预测。假设我们有一个二分类问题,样本的特征向量为,模型的参数向量为
,则线性回归的输出为
。然后,通过 sigmoid 函数
将z映射到 (0, 1) 区间,得到样本属于正类(在药物相互作用预测中,可表示为药物之间存在相互作用)的概率
相关文章:
基于Python的药物相互作用预测模型AI构建与优化(下.代码部分)
四、特征工程 4.1 分子描述符计算 分子描述符作为量化分子性质的关键数值,能够从多维度反映药物分子的结构和化学特征,在药物相互作用预测中起着举足轻重的作用。RDKit 库凭借其强大的功能,为我们提供了丰富的分子描述符计算方法,涵盖了多个重要方面的分子性质。 分子量…...
[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题)
[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题) 简介 粘包问题底层原理分析 粘包问题的解决 简介 在Python学习日记-78我们留下了两个问题,一个是服务器端 send() 中使用加号的问题,…...
origin如何在已经画好的图上修改数据且不改变原图像的画风和格式
例如我现在的.opju文件长这样 现在我换了数据集,我想修改这两个图表里对应的算法里的数据,但是我还想保留这图像现在的形式,可以尝试像下面这样做: 右击第一个图,出现下面,选择Book[sheet1] 选择工作簿 出…...
OPENGLPG第九版学习
文章目录 一、OpenGL概述二、着色器基础三、OpenGL绘制方式四、颜色、像素和片元五、视口变换、裁减、剪切与反馈六、纹理与帧缓存七、光照与阴影八、程序式纹理 skip九、细分着色器 skip十、几何着色器 skip十一、内存十二、计算着色器 skip附录 A 第三方支持库附录 B OpenGL …...
5.3.2 软件设计原则
文章目录 抽象模块化信息隐蔽与独立性衡量 软件设计原则:抽象、模块化、信息隐蔽。 抽象 抽象是抽出事物本质的共同特性。过程抽象是指将一个明确定义功能的操作当作单个实体看待。数据抽象是对数据的类型、操作、取值范围进行定义,然后通过这些操作对数…...
【ArcGIS遇上Python】批量提取多波段影像至单个波段
本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。 相关阅读:【ArcGIS微课1000例】0141:提取多波段影像中的单个波段 文章目录 一、数据准备二、效果比对二、python批处理1. 编写python代码2. 运行代码一、数据准备 实验数据及完整的python位…...
Spring Security(maven项目) 3.0.2.9版本 --- 改
前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…...
仿真设计|基于51单片机的温度与烟雾报警系统
目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现(protues8.7) 程序(Keil5) 全部内容 资料获取 具体实现功能 (1)LCD1602实时监测及显示温度值和烟雾浓度值; (2…...
深入剖析 CSRF 漏洞:原理、危害案例与防护
目录 前言 漏洞介绍 漏洞原理 产生条件 产生的危害 靶场练习 post 请求csrf案例 防御措施 验证请求来源 设置 SameSite 属性 双重提交 Cookie 结语 前言 在网络安全领域,各类漏洞层出不穷,时刻威胁着用户的隐私与数据安全。跨站请求伪造&…...
rust跨平台调用动态库
动态库在不同的操作系统,扩展名是不一样的,所以要做处理: static LIB: Lazy<Mutex<Option<Library>>> Lazy::new(|| Mutex::new(None));type CreateFunc unsafe extern "C" fn(*const c_char, *const c_char) -> c_int…...
buuuctf_秘密文件
题目: 应该是分析流量包了,用wireshark打开 我追踪http流未果,分析下ftp流 追踪流看看 用户 “ctf” 使用密码 “ctf” 登录。 PORT命令用于为后续操作设置数据连接。 LIST命令用于列出 FTP 服务器上目录的内容,但在此日志中未…...
课程设计|结构力学
课 程 设 计 第一部分 (结构力学) 2、两种结构在静力等效荷载作用下,内力有哪些不同?(分析比较) 1/2 1 1 1 1 1 1/2 1/4 11(1/2) 1/4 图1求解过程及结果: 轴力图: 内力计算 单位&…...
三次方根pow
给定一个浮点数n,求它的三次方根。 输入格式: 共一行,包含一个浮点数n,−10000≤n≤10000。 输出格式: 共一行,包含一个浮点数,表示问题的解。 注意,结果保留6位小数。 输入样例: 1000.00输出样例: 10.000000 …...
跟李沐学AI:视频生成类论文精读(Movie Gen、HunyuanVideo)
Movie Gen:A Cast of Media Foundation Models 简介 Movie Gen是Meta公司提出的一系列内容生成模型,包含了 3.2.1 预训练数据 Movie Gen采用大约 100M 的视频-文本对和 1B 的图片-文本对进行预训练。 图片-文本对的预训练流程与Meta提出的 Emu: Enh…...
【项目集成Husky】
项目集成Husky 安装初始化 Husky在.husky → pre-commit文件中添加想要执行的命令 安装 使用 Husky 可以帮助你在 Git 钩子中运行脚本,例如在提交代码前运行测试或格式化代码pnpm add --save-dev husky初始化 Husky npx husky init这会在项目根目录下创建一个 .hu…...
keil5如何添加.h 和.c文件,以及如何添加文件夹
1.简介 在hal库的编程中我们一般会生成如下的几个文件夹,在这几个文件夹内存储着各种外设所需要的函数接口.h文件,和实现函数具体功能的.c文件,但是有时我们想要创建自己的文件夹并在这些文件夹下面创造.h .c文件来实现某些功能,…...
2025-1-28-sklearn学习(47) (48) 万家灯火亮年至,一声烟花开新来。
文章目录 sklearn学习(47) & (48)sklearn学习(47) 把它们放在一起47.1 模型管道化47.2 用特征面进行人脸识别47.3 开放性问题: 股票市场结构 sklearn学习(48) 寻求帮助48.1 项目邮件列表48.2 机器学习从业者的 Q&A 社区 sklearn学习(47) & (48) 文章参考网站&…...
Flask数据的增删改查(CRUD)_flask删除数据自动更新
查询年龄小于17的学生信息 Student.query.filter(Student.s_age < 17) students Student.query.filter(Student.s_age.__lt__(17))模糊查询,使用like,查询姓名中第二位为花的学生信息 like ‘_花%’,_代表必须有一个数据,%任何数据 st…...
算法随笔_33: 132模式
上一篇:算法随笔_32: 移掉k位数字-CSDN博客 题目描述如下: 给你一个整数数组 nums ,数组中共有 n 个整数。132 模式的子序列 由三个整数 nums[i]、nums[j] 和 nums[k] 组成,并同时满足:i < j < k 和 nums[i] < nums[k] < nums[j…...
Linux内核中的页面错误处理机制与按需分页技术
在现代操作系统中,内存管理是核心功能之一,而页面错误(Page Fault)处理机制是内存管理的重要组成部分。当程序访问一个尚未映射到物理内存的虚拟地址时,CPU会触发页面错误异常,内核需要捕获并处理这种异常,以决定如何响应,例如加载缺失的页面、处理权限错误等。Linux内…...
【Git】使用笔记总结
目录 概述安装Git注册GitHub配置Git常用命令常见场景1. 修改文件2. 版本回退3. 分支管理 常见问题1. git add [中文文件夹] 无法显示中文问题2. git add [文件夹] 文件名中含有空格3. git add 触发 LF 回车换行警告4. git push 提示不存在 Origin 仓库5. Git与GitHub中默认分支…...
C语言中的存储类
C语言中的存储类 在C语言中,存储类是用于定义变量和函数的作用域、生命周期以及可见性的关键字。存储类决定了数据在内存中的存储位置以及它们在程序中的使用方式。本文将详细介绍C语言中的存储类,包括其类型、作用以及如何使用。 1. 存储类的类型 C语…...
DeepSeek 云端部署,释放无限 AI 潜力!
1.简介 目前,OpenAI、Anthropic、Google 等公司的大型语言模型(LLM)已广泛应用于商业和私人领域。自 ChatGPT 推出以来,与 AI 的对话变得司空见惯,对我而言没有 LLM 几乎无法工作。 国产模型「DeepSeek-R1」的性能与…...
【Qt5】声明之后快速跳转
我在网上看到的方法是ctrlL(?不是很清楚,因为我跳转不成功!) 另外一种就是鼠标点击跳转的。 首先,声明私有成员函数 此时,一般步骤应该是在构造函数里面继续,写函数的框架什么的。于…...
flowable expression和json字符串中的双引号内容
前言 最近做项目,发现了一批特殊的数据,即特殊字符",本身输入双引号也不是什么特殊的字符,毕竟在存储时就是正常字符,只不过在编码的时候需要转义,转义符是\,然而转义符\也是特殊字符&…...
新一代搜索引擎,是 ES 的15倍?
Manticore Search介绍 Manticore Search 是一个使用 C 开发的高性能搜索引擎,创建于 2017 年,其前身是 Sphinx Search 。Manticore Search 充分利用了 Sphinx,显着改进了它的功能,修复了数百个错误,几乎完全重写了代码…...
Pandas基础06(异常值的检测与过滤/抽样/常用聚合函数/数据聚合)
Pandas基础06 异常值的检测与过滤 在数据分析中,异常值(Outliers)是指与其他数据点显著不同的值。这些值可能由于数据录入错误、设备故障或极端情况而产生,因此在进行数据分析之前,需要对其进行检测与过滤。本文将介绍…...
事务01之事务机制
事务机制 文章目录 事务机制一:ACID1:什么是ACID2:MySQL是如何实现ACID的 二:MySQL事务机制综述1:手动管理事务2:事务回滚点3:事务问题和隔离机制(面试)3.1:事…...
Python-基于mediapipe,pyautogui,cv2和numpy的电脑手势截屏工具(进阶版)
前言:在我们的日常生活中,手机已经成为我们每天工作,学习,生活的一个不可或缺的部分。众所周知:为了我们的使用方便,手机里面的很多功能非常人性化,既便捷又高效,其中就有手机的截屏方式,它们花样繁多,如三指截屏,手势截屏等。那么怎么在电脑里面也实现这个功能呢?…...
@EventListener底层原理(超详细)| @TransactionalEventListener底层原理 | 事务同步
0. 举个栗子0.1. 事件监听方法0.2. 事件推送 1. EventListener注解2. EventListener标注的监听方法解析2.1. 事件监听方法处理器EventListenerMethodProcessors2.1.1. AbstractApplicationContext.invokeBeanFactoryPostProcessors2.1.2. AbstractApplicationContext.initAppli…...

