Python中对数据集逐行执行对数/二次外推/内插,是否有快捷方式?
完全不用逐行手动迭代!numpy和scipy/pandas提供了非常高效的向量化工具来处理这类插值/外推需求,比手动循环快得多,尤其是当你的数据集变大的时候。
第一步:先处理缺失值标记
你的零值是模拟的缺失数据,首先要把它们替换成NaN,这样插值函数才能正确识别并处理:
import numpy as np x = np.array([[ 1.31, 1.44, 0, 2.51, 0, 0], [ 0, 1.45, 1.63, 2.48, 0, 2.69], [ 1.31, 1.43, 1.59, 2.48, 2.55, 2.71]]) # 将零值替换为NaN x[x == 0] = np.nan
定义期限轴
假设每一列对应的是国债期限(比如1、2、3、5、7、10年,你可以根据实际数据调整):
tenors = np.array([1, 2, 3, 5, 7, 10])
方法1:用Scipy实现灵活插值/外推
写一个处理单行的函数,然后用np.apply_along_axis批量应用到每一行——这个工具会帮你封装逐行逻辑,底层是优化过的,比手动for循环高效:
from scipy.interpolate import interp1d def interpolate_single_row(row, x_axis, kind='quadratic'): # 筛选该行的有效数据点 valid_indices = ~np.isnan(row) # 至少需要2个有效点才能进行插值 if np.sum(valid_indices) < 2: return row # 有效点不足时返回原行,你也可以自定义处理逻辑 # 创建插值函数,fill_value="extrapolate"支持外推 interpolator = interp1d(x_axis[valid_indices], row[valid_indices], kind=kind, fill_value="extrapolate", bounds_error=False) # 对全期限轴执行插值/外推 return interpolator(x_axis) # 二次插值结果 filled_x_quadratic = np.apply_along_axis(interpolate_single_row, axis=1, arr=x, x_axis=tenors, kind='quadratic') # 对数插值(更安全的实现:先取对数做线性插值,再还原) def log_interpolate_row(row, x_axis): valid_indices = ~np.isnan(row) if np.sum(valid_indices) < 2: return row log_valid = np.log(row[valid_indices]) interpolator = interp1d(x_axis[valid_indices], log_valid, kind='linear', fill_value="extrapolate", bounds_error=False) return np.exp(interpolator(x_axis)) filled_x_log = np.apply_along_axis(log_interpolate_row, axis=1, arr=x, x_axis=tenors)
方法2:用Pandas快速实现(代码更简洁)
如果愿意用pandas,它的interpolate方法直接支持按行处理,内置多种插值类型,代码会更简洁:
import pandas as pd # 转成DataFrame方便操作 df = pd.DataFrame(x, columns=['1Y', '2Y', '3Y', '5Y', '7Y', '10Y']) # 二次插值+双向外推 filled_df_quadratic = df.interpolate(axis=1, kind='quadratic', limit_direction='both') # 对数插值:先对数据取对数,插值后再还原 filled_df_log = np.exp(np.log(df).interpolate(axis=1, kind='linear', limit_direction='both')) # 转回numpy数组 filled_x_quadratic_pd = filled_df_quadratic.to_numpy() filled_x_log_pd = filled_df_log.to_numpy()
注意事项
- 外推需谨慎:如果缺失值在数组两端(比如第一行的最后三个值),外推结果依赖于现有数据的趋势,国债收益率期限结构通常有规律,但仍需结合业务场景判断合理性。
- 对数插值要求数据为正:国债收益率满足这个条件,所以无需额外处理。
内容的提问来源于stack exchange,提问作者spastica
相关产品推荐
相关产品推荐

