如何在Pandas中利用多个邻点通过线性回归实现插值?
全局线性回归插值的Pandas实现方案
Pandas原生并没有提供直接通过全局线性回归拟合所有非缺失点来填充缺失值的插值方法。df.interpolate(method='linear')采用的是分段线性插值,仅在缺失值区间的首尾非缺失点之间做直线填充,而非利用全部可用数据拟合线性模型。
示例数据
import pandas as pd import numpy as np df = pd.DataFrame({ 'A': [1.0, 2.0, np.nan, np.nan, 5.0, 6.0, 7.0, 8.0, 9.0], 'B': [0.0, 2.0, np.nan, np.nan, 4.0, 10.0, 12.0, 14.0, 16.0] })
自定义全局线性回归插值实现
你可以基于Pandas结合Scipy的curve_fit封装一个通用函数,对DataFrame的每一列自动完成全局线性回归拟合并填充缺失值:
from scipy.optimize import curve_fit def lin_reg(x, a, b): return a * x + b def global_linreg_interpolate(df): interpolated_df = df.copy() for col in interpolated_df.columns: # 获取非缺失值的索引和对应值 non_na_idx = interpolated_df[col].dropna().index non_na_vals = interpolated_df[col].dropna().values # 拟合线性模型 (a, b), _ = curve_fit(lin_reg, non_na_idx, non_na_vals, p0=(2, 0)) # 填充缺失值 na_idx = interpolated_df[col].isna() interpolated_df.loc[na_idx, col] = lin_reg(interpolated_df.loc[na_idx].index, a, b) return interpolated_df # 测试效果 result_df = global_linreg_interpolate(df) print(result_df)
运行后输出:
A B 0 1.0 0.0 1 2.0 2.0 2 3.0 3.3 3 4.0 5.4 4 5.0 4.0 5 6.0 10.0 6 7.0 12.0 7 8.0 14.0 8 9.0 16.0
这个方法会对每一列使用所有非缺失数据拟合ax+b模型,再用该模型计算缺失位置的填充值,完全匹配你需要的插值逻辑。
内容的提问来源于stack exchange,提问作者Roelant
相关产品推荐
相关产品推荐

