scipy.interpolate 可实现各种插值法的实现,官方文档:
https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html
这里,我们只说明三次样条插值法的简单python脚本
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project :python_ws
@File :interpolation.py
@Author :lx
@Date :2021-02-07 9:47
'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sympy import *
from pylab import mpl
from utilities.mysql_conn import get_conn
from scipy.interpolate import CubicSpline
def main():
sql = "SELECT * FROM tb WHERE DATEDIFF(datetime,DATE(NOW()))=1;"
df = pd.read_sql(sql=sql, con=get_conn())
x_init4 = np.arange(0, df.shape[0], 1)
y_init4 = np.array(df["dni"])
print("x_init4:", x_init4)
print("y_init4:", y_init4)
# 构造x,y 数组,x为自变量、y为因变量
x = x_init4
y = y_init4
# 使用 CubiSpline 构建分段三次样条插值函数cs,cs即为scipy.interpolate.PPoly类的对象
# 默认情况下,三次样条端点边界条件为‘not-a-knot’ (默认值),曲线末端的第一段和第二段是相同的多项式。当没有关于边界条件的信息时,这是一个很好的默认值。
cs = CubicSpline(x, y)
print("cs:",cs)
cs.c.shape, cs.x, cs(x), y
# 输出为 三次样条分段多项式的形状,x数据点,插值x数据点=原始数据y值
# print("cs.c.shape",cs.c.shape)
# print("cs.x", cs.x)
# print("cs(x)", cs(x))
# print("y", y)
# 构造插值点
xs = np.arange(0, 96, 0.1)
fig, ax = plt.subplots(figsize=(6.5, 4))
ax.plot(x, y, 'o', label='data')
ax.plot(xs, cs(xs), label="插值数据")
# 一阶导数
ax.plot(xs, cs(xs, 1), label="一阶导数'")
ax.set_xlim(0, 95)
ax.legend(loc='lower left', ncol=2)
plt.show()
if __name__ == '__main__':
main()
ps: 代码中的sql用来获取源数据,可忽略 ,尝试的时候替换即可 。保证有效输入x,y,格式为numpy。
【reference】
scipy 三次样条插值