准备环境:
软件:PyCharm
模块:
pandas,用于读取Excel数据并将数据转换为NumPy数组
numpy,用于数值计算
scipy,用于执行三次样条插值函数(CubicSpline)
matplotlib,用于绘制图像
数据要求:
x序列须自增,a列为x列,b列为y列,且x和y序列须经过数据预处理。
首先正确导入数据,并将数据转换为NumPy数组:
# 导入Excel数据
df = pd.read_excel('data.xlsx')
# 假设A列是x,B列是y
x = df.iloc[:, 0].values # 获取A列数据并转换为NumPy数组
y = df.iloc[:, 1].values # 获取B列数据并转换为NumPy数组
然后我们可以检查一下数据的有效性(并做处理),避免在运行代码时出现错误:
# 检查x和y中的非有限值
if not np.all(np.isfinite(x)):
print("x 数组中存在非有限值")
x = x[np.isfinite(x)] # 去除非有限值
y = y[np.isfinite(x)] # 同时去除对应的y值
if not np.all(np.isfinite(y)):
print("y 数组中存在非有限值")
x = x[np.isfinite(y)] # 去除对应的x值
y = y[np.isfinite(y)] # 去除非有限的y值
三次样条函数插值:
cs = CubicSpline(x, y)
绘制图像:
# 绘制原始数据点
plt.scatter(x, y, color='red', label='Original Data')
# 绘制插值结果
plt.plot(x_interp, y_interp, label='Cubic Spline')
plt.legend()
plt.show()
最后结果:
注:插值时不包含列名!
最后,完整代码如下:
import pandas as pd
import numpy as np
from scipy.interpolate import CubicSpline
import matplotlib.pyplot as plt
# 导入Excel数据
df = pd.read_excel('data.xlsx')
# 假设A列是x,B列是y
x = df.iloc[:, 0].values # 获取A列数据并转换为NumPy数组
y = df.iloc[:, 1].values # 获取B列数据并转换为NumPy数组
# 检查x和y中的非有限值
if not np.all(np.isfinite(x)):
print("x 数组中存在非有限值")
x = x[np.isfinite(x)] # 去除非有限值
y = y[np.isfinite(x)] # 同时去除对应的y值
if not np.all(np.isfinite(y)):
print("y 数组中存在非有限值")
x = x[np.isfinite(y)] # 去除对应的x值
y = y[np.isfinite(y)] # 去除非有限的y值
# 目标插值点
x_interp = np.linspace(min(x), max(x), 100)
# 执行三次样条插值
cs = CubicSpline(x, y)
y_interp = cs(x_interp)
# 绘制原始数据点
plt.scatter(x, y, color='red', label='Original Data')
# 绘制插值结果
plt.plot(x_interp, y_interp, label='Cubic Spline')
plt.legend()
plt.show()
我是阿杰,一名正在努力学习编程的在校大学生,如果你喜欢我的内容,或者有帮助到你,请点赞鼓励支持一下吧!
更多技术与交流请关注微信公众号:阿杰技术栈