【scipy 基础】--插值

这篇具有很好参考价值的文章主要介绍了【scipy 基础】--插值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

本篇介绍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()

【scipy 基础】--插值
上图是插值之前,直接由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()

【scipy 基础】--插值

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

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

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

plt.show()

【scipy 基础】--插值

这时,可以用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()

【scipy 基础】--插值
处理之后,数据的连续性更好了。

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()

【scipy 基础】--插值
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()

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

4. 总结

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

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

本文主要介绍了Scipy库的插值子模块,其内置的插值算法,以及两个应用插值的小例子。文章来源地址https://www.toymoban.com/news/detail-745943.html

到了这里,关于【scipy 基础】--插值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一种用于态势评估的安全数据处理系统(JSP+java+springmvc+mysql+MyBatis)

    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。   在复杂多变的安全环境中,对各种安全数据进行实时有效的态势评估对于保障国家安全、社会稳定和人民生命财产安全具有重要意义。然而,传统的安全数据处理系统往往存在

    2024年04月14日
    浏览(35)
  • MATLAB--控制语句--数组操作--符号运算--绘图--文件和数据的处理

    MATLAB 常用的控制语句有for, while, if, switch 等。 通过循环控制语句,可以重复执行代码块。循环有两类:for 循环和while 循环。 for 循环是一组语句重复固定的,指定的次数,while 循环是满足条件执行。 1.for 循环 循环特定次数,并通过递增的索引变量跟踪每次迭代。 循环变量为

    2024年02月06日
    浏览(33)
  • C语言如何使用枚举类型和位运算来处理复杂的数据结构?

    首先,让我们谈谈枚举类型。假设你是一名班级的学生,而你的班级有很多人。有时我们希望用数字来代表每个学生的年龄,但是对于阅读代码来说,数字很难理解。这就是枚举类型的用武之地! 我们可以用枚举类型来定义一些有意义的名字,这些名字代表我们想要表示的概

    2024年02月12日
    浏览(40)
  • pyspark基础学习——数据处理

    上一篇文章中讲了如何在windows下安装和检测: pyspark,同时简单介绍了运行的环境。本文想就我的一些学习经验,分享一下使用pyspark来处理csv文件上的一些常用的pyspark语法。 运行python代码,第一件事当然是导入对应的包,同时我们要为spark先创建好相应的环境,并且,spark中

    2023年04月08日
    浏览(33)
  • 【Flink基础】-- 延迟数据的处理

    目录 ​一、关于延迟的一些概念 1、什么是延迟? 2、什么导致互联网延迟?

    2024年02月03日
    浏览(29)
  • 数据仓库和商业智能:数据处理与分析的基础

    [toc] 引言 1.1. 背景介绍 随着互联网和信息技术的快速发展,数据已经成为企业获取竞争优势的核心资产之一。然而,如何处理、存储和分析这些海量数据成为了摆在企业面前的一个严峻挑战。数据仓库和商业智能(BI)应运而生,成为了实现企业数据分析和决策的重要工具。

    2024年02月17日
    浏览(37)
  • 【MySQL基础 | 第一篇】数据处理之基本查询

    查询语句属于DML(Data Manipulation Language)数据操作语言的其中一种,用于从数据库中提取所需的数据。通过灵活的条件和组合,查询语句帮助用户有效地获取、过滤和排序数据,满足各种信息需求。 SELECT 标识选择哪些列 FROM 标识从哪个表中选择 注意: SQL 语言大小写不敏感

    2024年02月10日
    浏览(31)
  • 【scipy 基础】--信号处理

    scipy.signal 模块主要用于处理和分析信号。 它提供了大量的函数和方法,用于滤波、卷积、傅里叶变换、噪声生成、周期检测、谱分析等信号处理任务。 此模块的主要作用是提供一套完整的信号处理工具,从而帮助用户对各种连续或者离散的时间序列数据、音频信号、电信号

    2024年02月05日
    浏览(29)
  • 【scipy 基础】--图像处理

    SciPy 库本身是针对科学计算而不是图像处理的,只是图像处理也包含了很多数学计算, 所以 Scipy 也提供了一个专门的模块 ndimage 用于图像处理。 ndimage 模块提供的功能包括输入/输出图像、显示图像、基本操作(如裁剪、翻转、旋转等)、图像过滤(如去噪、锐化等)、图像

    2024年02月05日
    浏览(42)
  • 【大数据】流处理基础概念(二):时间语义(处理时间、事件时间、水位线)

    流处理基础概念(一):Dataflow 编程基础、并行流处理 流处理基础概念(二):时间语义(处理时间、事件时间、水位线) 流处理基础概念(三):状态和一致性模型(任务故障、结果保障) 😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点

    2024年02月19日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包