各位小伙伴大家好,在之前的课程中我们学习了线性回归以及如何做图。那么这周我们来看看非线性回归用代码如何处理。我们将根据碱性磷酸酶的酶动力学实验中的原始数据 (ΔA405) 计算初始速率。我们将原始数据导入到 pandas Dataframe中,使用一些 pandas 工具重新组织数据,生成第二个 pandas 的 Dataframe,其中包含每个浓度的底物浓度和初始速率。最后,我们将这些信息导出到 csv 文件,为下一节课做准备。
我们在第六课中为大家介绍过数组(arrays)的概念,还不是很清楚的小伙伴可以去回顾一下哦。
1 从csv 文件导入数据
我们首先从 csv 文件导入数据,就像之前处理线性回归数据一样,我们先导入必须的模块。
import osimport pandas as pdfrom scipy import stats
2 AP_kin.csv数据导入
然后我们将AP_kin.csv数据导入,这些数据代表在碱性磷酸酶存在下一系列对硝基苯酚磷酸盐浓度的对硝基苯酚出现的速率。
datafile = os.path.join('data', 'AP_kin.csv')print(datafile)
3 放入pandas Dataframe
然后我们可以将读取的 datafile 放入 AP_kin_df 的 pandas Dataframe中。并且查看前5行。
AP_kin_df = pd.read_csv(datafile)AP_kin_df.head()

我们可以看到左边第一列是个序列,如果我们想让Time (min)成为第一列,我们可以尝试将 AP_kin_df 数据框的索引设置为 'Time (min)' 列,并且查看前5行。
AP_kin_df.set_index('Time (min)', inplace = True)AP_kin_df.head()
.webp)
在我们计算斜率以获得初始速度之前,我们需要检查数字的数据类型。我们必须确保数字是浮点数,而不是字符串,以便我们可以对它们进行计算。
AP_kin_df.index.dtype.webp)
Tip
之前我们提到过数据类型,这里再和大家一起回忆一下,在Python中,数据类型是用于指定变量的类型的分类。这些数据类型决定了可以对变量执行的操作以及它们的存储方式。
1 第一大类是基本数据类型:
整数(Integer):表示整数值,没有小数部分。例如:10、-5、0。在Python中使用 int 表示。
浮点数(Float):表示有小数部分的数字。例如:3.14、-2.5、0.0。在Python中使用 float 表示。
复数(Complex):表示具有实部和虚部的复数。例如:3+5j,其中 j 表示虚数单位。在Python中使用 complex 表示。
字符串(String):表示一系列字符。字符串可以用单引号或双引号括起来。例如:'Hello'、"Python"。在Python中使用 str 表示。
布尔值(Boolean):仅有两个值:True 和 False,用于表示真或假。在Python中使用 bool 表示。
2 第二个大类是容器类型:
列表(List):有序的可变序列,可以包含不同类型的元素。例如:[1, 2, 3]、['apple', 'banana', 'cherry']。在Python中使用 list 表示。
元组(Tuple):有序的不可变序列,一旦创建就无法修改。例如:(1, 2, 3)、('a', 'b', 'c')。在Python中使用 tuple 表示。
集合(Set):无序的、唯一的元素集合。例如:{1, 2, 3}、{'apple', 'banana'}。在Python中使用 set 表示。
字典(Dictionary):无序的键值对集合,其中每个键是唯一的。例如:{'name': 'Alice', 'age': 25}。在Python中使用 dict 表示。
我们这里显示的 dtype(‘float64'),其中float64 是双精度浮点数的标准类型,相比于单精度浮点数(float32),双精度浮点数可以提供更高的精度,但也会占用更多的内存。
当我们确定了数据类型之后,我们就可以进行计算。
1 绘图函数
每行的索引是时间,这将是获取每行斜率的 x 值。每列中的值是每个时间点的吸光度值,因此这些值将是我们的 y 值。为了更直观的看到数据,我们使用 pandas 内置的绘图函数来显示这个简单的数据。
AP_kin_df.plot(marker = 'o').webp)
2 创建DataFrame
为了更方便计算,接下来我们创建第二个DataFrame,将底物浓度作为第一列(注意这里的 D 和 F 是大写的)。
MM_df = pd.DataFrame()MM_df['pNPP (mM)'] = AP_kin_df.columnsMM_df
.webp)
因为我们数据存在一些分散,但一般来说,曲线的斜率随着底物浓度的增加而增加。现在我们需要计算上图中每条线的斜率。我们可以使用 scipy.stats 中的 linregress 函数,这个函数将用于对蛋白质测定数据进行最小二乘线性回归分析。
因为 linregress 函数提供五个输出:斜率、截距、r 值、p 值和标准误差。今天我们只需要斜率,所以其他的输出我们会忽略。
1 遍历 AP_kin_df 数据,生成斜率
首先,我们将创建一个空列表来包含 for 循环遍历 AP_kin_df 数据,并生成的斜率
slopes = []for column in AP_kin_df.columns:slope, _, _, _, _, = stats.linregress(AP_kin_df.index, AP_kin_df[column])slopes.append(slope)slopes
.webp)
MM_df['slopes'] = slopesMM_df
.webp)
2 初速度
最后,初速度可以通过斜率除以实验条件下的微摩尔消光系数来计算。可以用一行代码完成计算并将其添加到数据框中。
MM_df['initial velocities'] = MM_df['slopes'] / 0.015MM_df
.webp)
3 pNPP (mM) 作为列名
创建 csv 文件之前的最后一步是将 pNPP (mM) 作为列名。
MM_df.set_index('pNPP (mM)', inplace = True)MM_df
.webp)
1 写入csv 文件
MM_df.to_csv('MM_data.csv')大功告成!大家现在可以在文件夹中找到一个名称为 MM_data 的 csv文件。
大家可以再做一个练习,在文件夹中找到一个 Excel 文件 chymotrypsin_kinetics.xlsx,其中包含来自胰凝乳蛋白酶实验的一些动力学数据。为了将数据转换为 pandas 易于读取的布局和文件格式。我们需要删除 Excel 文件中的前七行与文件的第一列。将文件另存为 chymotrypsin_kinetics.csv。
.webp)
我们可以输入以下代码来进行练习:
import osimport pandas as pdimport numpy as npfrom scipy import stats
这段代码导入了所需的库:
os 用于文件路径操作。
pandas 用于数据处理和分析。
numpy 用于数值计算。
scipy.stats 用于统计分析,特别是线性回归。
datafile = os.path.join('data', 'chymotrypsin_kinetics.csv')print(datafile)
datafile 创建了数据文件的路径 ‘data/chymotrypsin_kinetics.csv'。
print(datafile) 输出文件路径以确认路径是否正确。
chymo_rates_df = pd.read_csv(datafile)chymo_rates_df.head()
pd.read_csv(datafile) 读取CSV文件并将其加载为 chymo_rates_df 数据框。
chymo_rates_df.head() 显示数据框的前五行,以检查数据的基本结构和内容。
chymo_rates_df.set_index('Time (sec)', inplace = True)chymo_rates_df.head()
chymo_rates_df.set_index('Time (sec)', inplace=True) 将数据框的 Time (sec) 列设置为索引,方便以时间为索引进行数据操作和分析。
chymo_rates_df.index.dtype这行代码检查索引的 dtype,即时间列的数据类型,确保数据类型正确。
chymo_rates_df.plot(marker = 'o')使用 plot 函数生成数据的图表,并用 marker='o' 标记每个数据点,以便直观地检查数据。
chymo_MM_df = pd.DataFrame()chymo_MM_df['pNPA (mM)'] = chymo_rates_df.columnschymo_MM_df
chymo_MM_df 是一个新的DataFrame,用于存储底物浓度 (pNPA (mM)) 及其对应的反应速率。chymo_rates_df.columns 是原始数据框中的列名,它们通常代表不同的底物浓度。
slopes = []for column in chymo_rates_df.columns:slope, _, _, _, _, = stats.linregress(chymo_rates_df.index, chymo_rates_df[column])slopes.append(slope)
创建一个空列表 slopes 来存储每种底物浓度下的反应速率(即斜率)。
使用 for 循环遍历每一列数据,调用 stats.linregress 函数进行线性回归计算,得到每个底物浓度下的斜率,并将其存储在 slopes 列表中。
chymo_MM_df['slopes'] = slopeschymo_MM_df
将计算得到的斜率添加到 chymo_MM_df 数据框的 slopes 列中。
chymo_MM_df.set_index('pNPA (mM)', inplace = True)chymo_MM_df.head()
将 pNPA (mM) 设置为 chymo_MM_df 的索引,以便更方便地访问和分析数据。
chymo_MM_df['initial velocities'] = chymo_MM_df['slopes'] / 0.01832chymo_MM_df
计算初始速度,公式为:斜率除以常数 0.01832。将结果存储在 chymo_MM_df 的 initial velocities 列中。
outputfile = os.path.join('data', 'chymo_MM_data.csv')chymo_MM_df.to_csv(outputfile)
创建导出文件的路径 outputfile。
使用 chymo_MM_df.to_csv(outputfile) 将 chymo_MM_df 数据框保存为CSV文件,以便后续使用和分析。



沪公网安备 31011002003500