You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:37:03