Python实现样条插值:线性与三次拟合详解

拾柒
拾柒
发布时间:2026-10-12 | 2人浏览过
原创

本文介绍如何使用Python的scipy库进行样条插值。通过读取CSV数据,利用splrep生成参数,并使用splev计算插值结果。代码演示了线性(k=1)与三次(k=3)样条的实现,并包含使用matplotlib进行可视化对比的完整步骤。

环境配置与数据准备

在进行样条插值前,需导入必要的库并配置绘图环境。使用 matplotlib 时,建议设置中文字体以正常显示标签,并关闭Unicode负号显示以避免乱码。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来显示负号

接着,从CSV文件读取数据。假设数据文件名为 data1.csv,编码为 gbk。提取索引作为X轴数据点,提取特定列(如'沪深300')的值作为Y轴数据点。同时,定义一组密集的观测点 x,用于生成平滑的插值曲线。

#导入数据
data1=pd.read_csv('data1.csv',encoding='gbk')
 
#数据准备
X=data1.index #定义数据点
Y=data1['沪深300'].values #定义数据点
x=np.arange(0,len(data1),0.15) #定义观测点

样条插值实现

使用 scipy.interpolate 模块进行插值计算。该模块提供了 splrep 和 splev 两个核心函数:

  • splrep(X, Y, k):根据源数据点 X 和 Y 生成样条参数,k 指定样条阶数(1为线性,3为三次)。
  • splev(x, tck):根据观测点 x 和生成的样条参数 tck 计算插值结果。

线性样条插值

设置阶数 k=1 进行线性插值:

#进行一阶样条差值
ipo1=spi.splrep(X,Y,k=1) #源数据点导入,生成参数
iy1=spi.splev(x,ipo1) #根据观测点和样条参数,生成插值

三次样条拟合

设置阶数 k=3 进行三次样条拟合,通常能提供更平滑的曲线:

#进行三次样条拟合
ipo3=spi.splrep(X,Y,k=3) #源数据点导入,生成参数
iy3=spi.splev(x,ipo3) #根据观测点和样条参数,生成插值

结果可视化

使用 matplotlib 创建子图,分别展示原始数据、线性插值结果和三次样条插值结果。通过设置Y轴范围、标签、标题和图例,使图表清晰易读。

##作图
fig,(ax1,ax2)=plt.subplots(2,1,figsize=(10,12))
ax1.plot(X,Y,label='沪深300')
ax1.plot(x,iy1,'r.',label='插值点')
ax1.set_ylim(Y.min()-10,Y.max()+10)
ax1.set_ylabel('指数')
ax1.set_title('线性插值')
ax1.legend()
ax2.plot(X,Y,label='沪深300')
ax2.plot(x,iy3,'b.',label='插值点')
ax2.set_ylim(Y.min()-10,Y.max()+10)
ax2.set_ylabel('指数')
ax2.set_title('三次样条插值')
ax2.legend()

以上就是Python样条插值实现的详细内容,更多关于Python数据处理与可视化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表