如何基于pd.DataFrame为曲线局部数据拟合直线
局部区间直线拟合方案(适配多数据集批量处理)
你目前已为SED数据拟合了三阶多项式曲线,现在需要对曲线中9.5 < x < 15的下降区间单独拟合直线,同时希望避免手动切片DataFrame以适配多组数据集的批量处理,以下是可行方案:
核心思路
通过布尔掩码直接在拟合函数中筛选目标区间的数据,无需提前生成切片后的DataFrame,既简化代码又方便批量复用逻辑。
方法1:直接在拟合时筛选数据
直接给poly.polyfit传入区间掩码筛选后的x、y数据,不用单独创建切片变量:
# 假设x、y是从DataFrame中提取的数组或Series mask = (x > 9.5) & (x < 15) # 拟合一阶多项式(直线) line_coefs = poly.polyfit(x[mask], y[mask], 1) # 生成区间内的拟合序列用于绘图 x_line = np.linspace(9.5, 15, num=100) line_fit = poly.Polynomial(line_coefs)
如果直接操作DataFrame的列:
# xvar、yvar是DataFrame中x、y对应的列名 mask = (pks[xvar] > 9.5) & (pks[xvar] < 15) line_coefs = poly.polyfit(pks[xvar][mask], pks[yvar][mask], 1)
方法2:封装函数实现批量处理
把拟合逻辑封装成函数,传入数据集、列名和区间参数,即可一键处理多组数据:
import numpy as np from numpy import poly def fit_local_line(df, x_col, y_col, x_low, x_high): # 生成目标区间掩码 mask = (df[x_col] > x_low) & (df[x_col] < x_high) # 拟合直线 coefs = poly.polyfit(df[x_col][mask], df[y_col][mask], 1) # 生成拟合用的x序列和对应拟合值 x_fit = np.linspace(x_low, x_high, num=100) y_fit = poly.Polynomial(coefs)(x_fit) return coefs, x_fit, y_fit # 处理单组数据示例 coefs, x_line, y_line = fit_local_line(pks, xvar, yvar, 9.5, 15) # 批量处理多组数据集示例(dataset_list为包含多个DataFrame的列表) dataset_list = [df1, df2, df3] fit_results = [] for df in dataset_list: res = fit_local_line(df, xvar, yvar, 9.5, 15) fit_results.append(res)
补充提示
- 若每组数据的目标区间不固定,可在函数中加入区间自动识别逻辑(比如通过曲线斜率判断下降段),进一步提升批量处理的自动化程度。
- 布尔掩码的方式本质是筛选数据,但无需额外创建切片后的DataFrame,代码更紧凑且易于维护。
内容的提问来源于stack exchange,提问作者Jim421616
相关产品推荐
相关产品推荐

