分子动力学模拟数据预处理:如何对蛋白质-配体相互作用频率进行排序和归一化

学术   2024-09-27 07:00   日本  
引言

在分子动力学(MD)模拟中,我们通常需要对模拟输出的数据进行预处理,以便更好地分析和可视化这些数据。今天,我将分享一个简单的Python脚本,帮助你整理和规范Desmond生成的蛋白质-配体相互作用数据,为后续的可视化做好准备。

为了处理方便,我们首先需要将分子动力学产生的数据文件进行整理,将相互作用方式整理至Excel文件中,本例中整理的数据与上期分子动力学数据可视化:氨基酸相互作用热图的高效绘制!中的结果一致。

一共分为三列,第一列Frame为时间帧,第二列Amino_Acid为氨基酸名称和编号,第三列Interaction为相互作用类型。

1. 数据预处理:从Excel读取并归一化数据

为了进行数据可视化,首先需要从Desmond生成的Excel文件中读取相关的相互作用数据,并统计不同氨基酸参与的相互作用类型频次。通过使用Python的pandas库,我们可以轻松实现这些操作。

在下面的代码中,我们首先读取了Summary工作表,并根据每个氨基酸和相互作用类型对其频次进行了统计。本例中我们进行了200ns的分子动力学模拟,一共1000帧轨迹,接下来我们将频次除以1000就得到了相互作用频率,以便后续图表的绘制。

import pandas as pd

def process_and_sort_excel(file_path):
# 读取Excel文件
xls = pd.ExcelFile(file_path)

# 假设'Summary'工作表是我们要处理的表
sheet_name_summary = 'Summary'

# 读取'Summary'工作表的数据
df_summary = pd.read_excel(file_path, sheet_name=sheet_name_summary)

# 统计每个氨基酸相互作用类型的频次
interaction_counts = df_summary.groupby(['Amino_Acid', 'Interaction']).size().reset_index(name='Frequency')

# 将频次除以1000并添加为新列
interaction_counts['Frequency (scaled)'] = interaction_counts['Frequency'] / 1000

2. 数据存储:将处理结果写入新的工作表

在处理完频次数据后,我们将这些信息存储到Excel文件的新工作表中。这里我们使用了pandasExcelWriter来将新的数据写入到原Excel文件中,确保不会丢失其他重要数据。

    # 写入到新工作表
new_sheet_name_scaled = 'Interaction_Frequency_Scaled'
with pd.ExcelWriter(file_path, engine='openpyxl', mode='a') as writer:
interaction_counts.to_excel(writer, sheet_name=new_sheet_name_scaled, index=False)
print(f"数据已写入'{file_path}'文件的'{new_sheet_name_scaled}'工作表中。")

3. 数据排序:按照氨基酸序号排序

为了使可视化结果更具逻辑性,我们需要根据氨基酸的序号对数据进行排序。代码中的正则表达式将从氨基酸名称中提取数字部分,并对其进行升序排列。这一步骤确保了在后续绘制图表时,氨基酸的顺序能够与蛋白质序列保持一致。

    # 提取'Amino_Acid'列中的数字部分作为新的列
interaction_counts['Amino_Acid_Num'] = interaction_counts['Amino_Acid'].str.extract(r'_(\d+)').astype(int)

# 根据'Amino_Acid_Num'列进行升序排序
interaction_counts_sorted = interaction_counts.sort_values(by='Amino_Acid_Num')

# 重新排列列的顺序
interaction_counts_sorted = interaction_counts_sorted[
['Amino_Acid', 'Interaction', 'Frequency', 'Frequency (scaled)', 'Amino_Acid_Num']]

4. 输出最终结果:写入排序后的数据

最后,我们将排序后的结果写入到同一Excel文件中的另一个工作表。这样,我们既能保持数据完整性,又能方便在下一步绘图时使用排序后的数据。

    # 写入到同一Excel文件的新工作表中
new_sheet_name_sorted = 'Interaction_Frequency_Sorted'
with pd.ExcelWriter(file_path, engine='openpyxl', mode='a') as writer:
interaction_counts_sorted.to_excel(writer, sheet_name=new_sheet_name_sorted, index=False)
print(f"排序后的数据已写入'{file_path}'文件的'{new_sheet_name_sorted}'工作表中。")

# 调用函数处理和排序Excel文件
file_path = 'Contacts.xlsx'
process_and_sort_excel(file_path)

完整代码

import pandas as pd  

def process_and_sort_excel(file_path):
# 读取Excel文件
xls = pd.ExcelFile(file_path)

# 假设'Summary'工作表是我们要处理的表
sheet_name_summary = 'Summary'

# 读取'Summary'工作表的数据
df_summary = pd.read_excel(file_path, sheet_name=sheet_name_summary)

# 统计每个氨基酸相互作用类型的频次
interaction_counts = df_summary.groupby(['Amino_Acid', 'Interaction']).size().reset_index(name='Frequency')

# 将频次除以1000并添加为新列
interaction_counts['Frequency (scaled)'] = interaction_counts['Frequency'] / 1000

# 写入到新工作表
new_sheet_name_scaled = 'Interaction_Frequency_Scaled'
with pd.ExcelWriter(file_path, engine='openpyxl', mode='a') as writer:
interaction_counts.to_excel(writer, sheet_name=new_sheet_name_scaled, index=False)
print(f"数据已写入'{file_path}'文件的'{new_sheet_name_scaled}'工作表中。")

# 提取'Amino_Acid'列中的数字部分作为新的列
interaction_counts['Amino_Acid_Num'] = interaction_counts['Amino_Acid'].str.extract(r'_(\d+)').astype(int)

# 根据'Amino_Acid_Num'列进行升序排序
interaction_counts_sorted = interaction_counts.sort_values(by='Amino_Acid_Num')

# 重新排列列的顺序
interaction_counts_sorted = interaction_counts_sorted[
['Amino_Acid', 'Interaction', 'Frequency', 'Frequency (scaled)', 'Amino_Acid_Num']]

# 写入到同一Excel文件的新工作表中
new_sheet_name_sorted = 'Interaction_Frequency_Sorted'
with pd.ExcelWriter(file_path, engine='openpyxl', mode='a') as writer:
interaction_counts_sorted.to_excel(writer, sheet_name=new_sheet_name_sorted, index=False)
print(f"排序后的数据已写入'{file_path}'文件的'{new_sheet_name_sorted}'工作表中。")


# 调用函数处理和排序Excel文件
file_path = 'Contacts.xlsx'
process_and_sort_excel(file_path)

下面看一下数据整理后的结果。产生了两个工作表 Interaction_Frequency_ScaledInteraction_Frequency_Sorted 。其中 Interaction_Frequency_Scaled 工作表对每个氨基酸和相互作用类型对其频次和频率进行了统计。

Interaction_Frequency_Sorted 工作表根据 Interaction_Frequency_Scaled 工作表的结果根据氨基酸的编号进行了排序,以方便后续的绘图。

5. 总结

通过这个简单的Python脚本,我们能够高效地对Desmond分子动力学模拟数据进行预处理,包括统计、归一化和排序。这样处理过的数据为后续的可视化奠定了基础,可以更加直观地展示蛋白质-配体相互作用的频率分布。

在接下来的推文中,我将介绍如何基于这些处理过的数据绘制堆叠柱状图,帮助大家更好地分析分子动力学结果。

如果你对这类数据处理和可视化感兴趣,不妨尝试一下这段代码,并关注我们的后续更新。

如果您喜欢我们的文章,欢迎关注



叮当学术
📚零零碎碎的科研学习记录~🔬科研本沉闷,但跑起来有风。
 最新文章