插值运算是一种数据处理方法,主要用来填补数据之间的空白或缺失值。
因为在实际应用中,数据往往不是完整的,而是存在着空白或缺失值,这些空白或缺失值可能是由于数据采集困难、数据丢失或数据处理错误等原因造成的。
如果直接使用这些空白或缺失值进行分析和预测,将会对结果造成很大的影响。

插值运算可以用来填补这些空白或缺失值,从而恢复完整的数据集。
通过插值运算,可以估算出空白或缺失值的值,从而提高数据的完整性和准确性。
此外,插值运算还可以用来预测未来的数据趋势或结果,对于数据分析和预测具有重要的意义。

本篇介绍Scipy为我们提供的插值处理方法。

1. 主要功能

Scipy中,关于插值的子模块是:scipy.interpolate
其中又细分为:

类别 说明
单变量插值 主要包含interp1d等12个函数
多变量插值 主要包含griddata等11个函数
一维样条函数 主要包含BSpline等16个函数
二维样条函数 主要包含RectBivariateSpline等9个函数
其他函数 一些辅助计算的函数

插值效果的好坏,有个重要的因素在于是否根据数据的情况选择了合适的插值算法。
Scipy库中已经实现的插值算法有:

  1. linear:线性插值算法
  2. nearest:最近邻插值算法
  3. nearest-up:改进型最近邻插值算法
  4. zero:零阶样条插值算法(等同于 previous
  5. slinear:一阶样条插值算法(等同于 linear
  6. quadratic:五阶样条插值算法
  7. cubic:三阶样条插值算法
  8. previous:前点插值算法
  9. next:后点插值算法

我们可以根据数据情况选择合适的算法,下面用一些测试数据演示不同算法的插值效果:

from scipy.interpolate import interp1d

x = np.linspace(0, 20, 20)
y = x * np.cos(x)
plt.scatter(x,y)
plt.show()


上图是插值之前,直接由20个数据点连接起来的折线。

接下来,应用9种不同的插值算法将20个点补充为100个点,然后看看插值之后各种曲线的效果。

interp_types = [
"linear",
"nearest",
"nearest-up",
"zero",
"slinear",
"quadratic",
"cubic",
"previous",
"next",
] fig = plt.figure(figsize=[12, 9])
fig.subplots_adjust(hspace=0.4) for idx, typ in enumerate(interp_types):
f = interp1d(x, y, kind=typ)
x_dense = np.linspace(0, 20, 100)
y_dense = f(x_dense) ax = fig.add_subplot(330 + idx+1)
ax.scatter(x, y)
ax.plot(x_dense, y_dense, color='g')
ax.set_title("插值算法-{}".format(typ)) plt.show()

2. 一维插值示例

在我自己实际接触的项目中,气象数据的处理经常会用到插值。
因为气象数据常常存在缺失值,这可能是由于传感器故障,数据传输问题,或者在某些情况下,由于天气现象使得数据无法收集。
对于这些缺失值,我们可以使用Scipy的一维插值功能来进行填充。

比如下面是南京市某年的各个月的平均气温:

import pandas as pd

# 南京一年中每个月平均气温
df = pd.DataFrame({
"月份": ["一月", "二月", "三月",
"四月", "五月", "六月",
"七月", "八月", "九月",
"十月", "十一月", "十二月"],
"平均最低气温": [-1.6, 0.0, 4.4,
np.nan, 15.7, 20.4,
np.nan, 24.6, 19.1,
12.6, 6.1, -0.1],
"平均最高气温": [7.0, 8.4, np.nan,
20.1, 25.3, 29.0,
32.0, 32.2, 27.2,
np.nan, 16.9, 9.7],
}) df


由于采集或者传输的原因,导致缺失了一些数据。
这样的数据不仅绘制出来的折线图会有断开的地方,而且不利于后续的分析。

plt.plot(df["月份"], df["平均最低气温"], label="平均最低气温")
plt.plot(df["月份"], df["平均最高气温"], label="平均最高气温")
plt.legend() plt.show()

这时,可以用Scipy的插值算法来补充缺失数据。

from scipy.interpolate import interp1d

# 过滤掉缺失的 平均最低气温 数据
df_low =df[df["平均最低气温"].notna()]
# 根据已有的数据生成插值函数
f = interp1d(df_low.index, df_low["平均最低气温"], kind="cubic")
# 用插值函数补充缺失数据
df["平均最低气温"] = f(range(12)) # 平均最高气温 的缺失数据处理同上
df_high =df[df["平均最高气温"].notna()]
f = interp1d(df_high.index, df_high["平均最高气温"], kind="cubic")
df["平均最高气温"] = f(range(12)) df.round(1) plt.plot(df["月份"], df["平均最低气温"], label="平均最低气温")
plt.plot(df["月份"], df["平均最高气温"], label="平均最高气温")
plt.legend() plt.show()


处理之后,数据的连续性更好了。

3. 二维插值示例

当自变量有2个的时候,就要用到二维插值了。
仍然以气象上的数据举例,上面示例是气温和时间的关系,我们把时间作为自变量,只要一维插值即可。
如果是和地点关联的话,那么地点作为自变量就有2个值(一般是经度和纬度)。

比如下面截取了项目中一段降水量的数据:

# 数据是二维数组:
# 每一行代表经度相同,纬度不同的地点
# 每一列代表纬度相同,经度不同的地点
data = np.array([
[9, 9, 5, 9, 10, 9, 8, 7, 11, 1],
[54, 36, 54, 32, 46, 51, 35, 33, 36, 11],
[35, 34, 34, 45, 52, 35, 34, 36, 41, 9],
[117, 112, 113, 133, 126, 127, 119, 96, 116, 23],
[110, 67, 91, 85, 94, 69, 77, 81, 65, 13],
[9, 7, 13, 12, 9, 6, 8, 9, 21, 3],
[50, 21, 24, 32, 36, 26, 28, 30, 24, 3],
[65, 41, 63, 67, 58, 50, 54, 45, 48, 16],
[36, 29, 32, 28, 38, 29, 41, 27, 29, 9],
[37, 61, 57, 35, 56, 51, 40, 58, 100, 34],
])

显示降水量的分布情况。

plt.imshow(data, cmap=plt.cm.GnBu)
plt.colorbar()
plt.xticks([])
plt.yticks([])
plt.show()


data中只有100个数据,所以每个格子一个值,看起来不是那么连续,
而实际的降水情况不会像这样离散的,区域之间的降水量应该是逐渐连续变化的。

所以,需要在data的基础上进行二维插值:

from scipy.interpolate import RectBivariateSpline

# 原始数据是 10x10
x = np.linspace(0, 10, 10, endpoint=False)
y = np.linspace(0, 10, 10, endpoint=False) # 插值后的数据是 500x500
x_new = np.linspace(0, 10, 500, endpoint=False)
y_new = np.linspace(0, 10, 500, endpoint=False) # 从原始数据生成插值函数
f = RectBivariateSpline(x, y, data.T)
# 用插值函数计算新的数据
data_new = f(x_new, y_new) # 显示插值后的结果
plt.imshow(data_new.T, cmap=plt.cm.GnBu)
plt.colorbar()
plt.xticks([])
plt.yticks([])
plt.show()


这是插值到 500x500 的效果,值越大,连续性越好。
有兴趣的话,可以调整上面代码中 x_newy_new 的个数,看看不同的效果。

4. 总结

插值作为一种常见的数据处理方法,应用的领域和场景非常多,比如:

  1. 数据预测:通过插值技术,可以预测未来的数据趋势或结果。
  2. 图像处理:插值可以用于图像处理和图像分析,以提高图像的分辨率或质量。
  3. 机器学习:插值技术也可以用于机器学习和人工智能领域。用于构建回归模型或分类模型,以便对未知数据进行预测或分类。

本文主要介绍了Scipy库的插值子模块,其内置的插值算法,以及两个应用插值的小例子。

【scipy 基础】--插值的更多相关文章

  1. SciPy 基础功能

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  2. Python SciPy库——插值与拟合

    插值与拟合 原文链接:https://zhuanlan.zhihu.com/p/28149195 1.最小二乘拟合 实例1 # -*- coding: utf-8 -*- import numpy a ...

  3. VUE基础插值表达式

    vue 基本操作插值表达式 首先使用js导入vue.js文件 <style> [v-claok]{ display:none;//解决闪烁问题 } </style> <d ...

  4. SciPy 插值

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  5. Python教程:进击机器学习(五)--Scipy《转》

    Scipy简介 文件输入和输出scipyio 线性代数操作scipylinalg 快速傅里叶变换scipyfftpack 优化器scipyoptimize 统计工具scipystats Scipy简介 ...

  6. SciPy 信号处理

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  7. SciPy 统计

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  8. SciPy 线性代数

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  9. SciPy 图像处理

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  10. SciPy 优化

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

随机推荐

  1. 基于Taro开发京东小程序小记

    一.小程序基础模型 这里要从微信小程序的历史说起,从前身到现在大概分为3个阶段: 阶段1: 微信网页需要用到app的原生能力,微信官方推出了js-sdk 阶段2: 解决移动端白屏问题,采用微信web资 ...

  2. zabbix 可计算监控项使用 last() 与 avg() 的区别

    使用zabbix的可计算监控项时遇到的问题 在agent异常退出的情况下,使用last()的监控项依然在产出数据! 分析解决 last()函数会跳过空值,取最后一个有效值计算.遍查文档,只有用avg( ...

  3. Django: AttributeError: 'str' object has no attribute 'decode'

    Django安装Mysql驱动 pip install PyMySQL 在Django的工程同名子目录的__init__.py文件中添加如下语句 from pymysql import install ...

  4. openpyxl 统一表格样式

    # 统一表格样式 rows = ws.max_row columns = ws.max_column # print(rows) # print(columns) for row in range(1 ...

  5. Ceres简单应用-求解(Powell's Function)鲍威尔函数最小值

    Ceres 求解 Powell's function 的最小化 \(\quad\)现在考虑一个稍微复杂一点的例子-鲍威尔函数的最小化. \(\quad{}\) \(x=[x_1,x_2,x_3,x_4 ...

  6. vue实现文本复制

    一. 下载插件 npm install --save vue-clipboard2 二. main.js import VueClipBoard from 'vue-clipboard2' Vue.u ...

  7. 在Python中使用LooseVersion进行软件版本号比对

    技术背景 Python是一门极其热门.极其灵活的开发语言,其更新迭代的速度也非常的快速.有时候我们遇到不同的软件版本不同方法处理的情况,此时就需要用到版本号比对的工具.举一个例子说,我们要在pytho ...

  8. Web通用漏洞--SSRF

    Web通用漏洞--SSRF 漏洞简介 SSRF(Server-Side Request Forgery:服务器端请求伪造) 一种由攻击者构造形成由服务端发起请求的一个安全漏洞; 一般情况下,SSRF攻 ...

  9. API接口的设计思路

    ​ API接口设计是软件开发中非常重要的一环,良好的设计规范能够提高开发效率.减少问题和错误,并增强系统的可维护性和可扩展性.本文从程序员的视角,讨论一些常见的API接口设计规范. 一.遵循RESTf ...

  10. API接口设计规范,看这篇就足以了

    ​ 优秀的设计是产品变得卓越的原因.设计API意味着提供有效的接口,可以帮助API使用者更好地了解.使用和集成,同时帮助人们有效地维护它.每个产品都需要使用手册,API也不例外. 在API领域,可以将 ...