Python开发之手动实现一维线性插值

Python开发之手动实现一维线性插值

  • 1.线性插值法介绍
  • 2.手动实现线性插值
  • 3.案例一:手动实现线性插值
  • 4.使用pandas的插值方法实现要求(推荐)
  • 5.案例二:对一组数据进行线性插值和SG滤波处理

前言:主要介绍手动实现一维线性插值以及pandas里面的interpolate方法实现线性插值。并结合案例实现一组数据的线性插值和SG滤波处理。


1.线性插值法介绍

  • 线性插值法是一种简单的插值方法,用于在两个已知数据点之间估算未知位置上的数据值。它基于线性关系的假设,即在两个已知数据点之间的数据值随着位置的变化而呈线性变化。
  • 假设有两个已知数据点 (x1, y1) 和 (x2, y2),其中 x1 和 x2 是两个数据点的位置,y1 和 y2 是对应的数据值。现在需要在这两个数据点之间的某个位置 x0 处估算数据值 y0。
  • 线性插值法的计算公式如下:
    y0 = y1 + (x0 - x1) * (y2 - y1) / (x2 - x1)
    其中,y0 是在位置 x0 处估算的数据值,y1 和 y2 是已知数据点的数据值,x1 和 x2 是已知数据点的位置,x0 是要估算的位置。
    线性插值法的原理是利用已知数据点之间的线性关系,根据位置的比例关系来估算未知位置上的数据值。它假设数据值在两个已知数据点之间是线性变化的,因此在两个数据点之间的位置上,估算值与实际值的误差较小。
  • 线性插值法在实际应用中常用于处理缺失数据或填补异常值,以及在图形绘制和数据处理中用于平滑数据。然而,需要注意的是,线性插值法在数据变化非线性或存在较大波动时可能不适用,此时需要考虑其他更复杂的插值方法。

2.手动实现线性插值

核心代码

def linear_interpolation(x1, y1, x2, y2, x0):
    """
    线性插值函数
    
    参数:
    x1, y1: 第一个已知数据点的位置和数据值
    x2, y2: 第二个已知数据点的位置和数据值
    x0: 要估算的位置
    
    返回值:
    y0: 在位置 x0 处估算的数据值
    """
    y0 = y1 + (x0 - x1) * (y2 - y1) / (x2 - x1)
    return y0

# 示例数据
x1, y1 = 0, 10
x2, y2 = 5, 20
x0 = 2

# 使用线性插值估算在位置 x0 处的数据值
y0 = linear_interpolation(x1, y1, x2, y2, x0)
print(f"在位置 {x0} 处的估算数据值为:{y0}")

3.案例一:手动实现线性插值

数据格式:
在这里插入图片描述
分析:1.首先判断该数据是否需要插值
2.获取nan的索引位置,保存到list集合中去
3.根据获取的nan的索引位置,得到位置前后的数据,通过线性插值法算出该nan的值。
代码具体实现:

import numpy as np
import pandas as pd

def is_exist_nan(data):
    for d in data:
        if np.isnan(d):
            return True
    return False

def get_nan_index_list(data):
    index_list = []
    for index,d in enumerate(data):
        if np.isnan(d):
            index_list.append(index)
    return index_list

def linear_interpolation(x1, y1, x2, y2, x0):
    """
    线性插值函数
    参数:
    x1, y1: 第一个已知数据点的位置和数据值
    x2, y2: 第二个已知数据点的位置和数据值
    x0: 要估算的位置
    返回值:
    y0: 在位置 x0 处估算的数据值
    """
    y0 = y1 + (x0 - x1) * (y2 - y1) / (x2 - x1)
    return y0


def get_first_data(data):
    for index,d in enumerate(data):
        if not np.isnan(d):
            return d

def get_last_data(data):
    count = len(data) -1
    for d in data:
        if not np.isnan(data[count]):
            return data[count]
        else:
            count=count-1

def digu(x2,data):
    if not np.isnan(data[x2]):
        return x2,data
    else:
        x2 = x2 + 1
        return digu(x2,data)

def get_new_data(nan_index_list, data):
    if nan_index_list[0] == 0:
        data[0] = get_first_data(data)
        nan_index_list.remove(0)
    if len(nan_index_list)>=1:
        if nan_index_list[len(nan_index_list)-1] == 26:
            data[26] =get_last_data(data)
            nan_index_list.remove(26)
    if len(nan_index_list) >=1:
        for nan_index in nan_index_list:
            x1 = nan_index - 1
            y1 = data[x1]
            x2 = nan_index + 1
            x2,data = digu(x2,data)
            y2 = data[x2]
            x0 = nan_index
            y0 = round(linear_interpolation(x1, y1, x2, y2, x0), 4)
            data[nan_index] = y0
    return data

if __name__ == '__main__':

    data1 = [np.nan, -0.3356, -0.3208, -0.3661, 0.2192,  np.nan, np.nan,  np.nan, -0.3709, -0.3779, 0.026, -0.2601,
             np.nan, -0.0238, -0.2241, -0.2105, -0.2623, 0.379, -0.2196,  np.nan, -0.0835, 0.2895, 0.0415, -0.2323,
             -0.1782, -0.2308, -0.2265]
    if is_exist_nan(data1):
        print(data1)
        nan_index_list = get_nan_index_list(data1)
        new_data = get_new_data(nan_index_list,data1)
        print(new_data)

运行结果如下:

[nan, -0.3356, -0.3208, -0.3661, 0.2192, nan, nan, nan, -0.3709, -0.3779, 0.026, -0.2601, nan, -0.0238, -0.2241, -0.2105, -0.2623, 0.379, -0.2196, nan, -0.0835, 0.2895, 0.0415, -0.2323, -0.1782, -0.2308, -0.2265]
[-0.3356, -0.3356, -0.3208, -0.3661, 0.2192, 0.0717, -0.0758, -0.2234, -0.3709, -0.3779, 0.026, -0.2601, -0.1419, -0.0238, -0.2241, -0.2105, -0.2623, 0.379, -0.2196, -0.1515, -0.0835, 0.2895, 0.0415, -0.2323, -0.1782, -0.2308, -0.2265]

给大家提供一个思路,具体用的时候,推荐用pandas的interpolate方法实现。

4.使用pandas的插值方法实现要求(推荐)

import pandas as pd

if __name__ == '__main__':

    # 原始数据,包含缺失值
    data = [np.nan, -0.3356, -0.3208, -0.3661, 0.2192, np.nan, np.nan, np.nan, -0.3709, -0.3779, 0.026, -0.2601,
            np.nan, -0.0238, -0.2241, -0.2105, -0.2623, 0.379, -0.2196, np.nan, -0.0835, 0.2895, 0.0415, -0.2323,
            -0.1782, -0.2308, -0.2265]
    # 将数据转换为pandas的Series对象,此时缺失值会自动转换为NaN
    data_series = pd.Series(data)
    # 执行线性插值,并处理第一个和最后一个NaN
    interpolated_data = data_series.interpolate(limit_direction='both')
    # 打印插值结果
    print(interpolated_data.values)

在这里插入图片描述

5.案例二:对一组数据进行线性插值和SG滤波处理

import numpy as np
import pandas as pd
from scipy.signal import savgol_filter
import matplotlib.pyplot as plt

def get_interpolated_data(data):
    # 将数据转换为pandas的Series对象,此时缺失值会自动转换为NaN
    data_series = pd.Series(data)
    # 执行线性插值,并处理第一个和最后一个NaN
    interpolated_data = data_series.interpolate(limit_direction='both').tolist()
    interpolated_data = [round(i, 4) for i in interpolated_data]  # 保留四位小数
    return interpolated_data

def get_sg_data(data, window_size, polyorder):
    smoothed_data = savgol_filter(data, window_size, polyorder).tolist()
    smoothed_data = [round(i, 4) for i in smoothed_data]  # 保留四位小数
    return smoothed_data

if __name__ == '__main__':
    # 原始数据,包含缺失值
    data = [np.nan, -0.3356, -0.3208, -0.3661, 0.2192, np.nan, np.nan, np.nan, -0.3709, -0.3779, 0.026, -0.2601,
            np.nan, -0.0238, -0.2241, -0.2105, -0.2623, 0.379, -0.2196, np.nan, -0.0835, 0.2895, 0.0415, -0.2323,
            -0.1782, -0.2308, -0.2265]
    interpolated_data = get_interpolated_data(data)
    sg_data = get_sg_data(interpolated_data,5,2)
    sg_data2 = get_sg_data(interpolated_data,9,3)
    print(interpolated_data)
    print(sg_data)
    print(sg_data2)
    plt.plot(interpolated_data, label='interpolated_data')
    plt.plot(sg_data, label='sg_data window_size=5 polyorder=2')
    plt.plot(sg_data2, label='sg_data2 window_size=9 polyorder=3')
    plt.xlabel('Time')
    plt.ylabel('Value')
    plt.title('Line Plot')
    plt.legend()
    plt.show()

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/50631.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Docker】容器的数据卷

目录 一、数据卷的概念与作用 二、数据卷的配置 三、数据卷容器的配置 一、数据卷的概念与作用 在了解什么是数据卷之前我们先来思考以下这些问题: 1.如果我们一个容器在使用后被删除,那么他里面的数据是否也会丢失呢?比如容器内的MySQL的…

2023年的深度学习入门指南(21) - 百川大模型

2023年的深度学习入门指南(21) - 百川大模型 前面我们用了三节的篇幅介绍了目前最强大的开源模型LLaMA2。这一节我们说一说国产大模型的一个代表,百川大模型。 使用百川大模型 第一步我们先把百川用起来,然后再研究如何训练和其原理如何。 百川的使用…

Mybatis使用collection映射一对多查询分页问题

场景&#xff1a;页面展示列表&#xff0c;需要查询多的字段&#xff0c;和一的字段。并且还要分页。 这时候直接想到的是手写sql。 /*** 标签*/private List<BasicResidentTags> tags;Data TableName("basic_resident_tags") public class BasicResidentTag…

vue3 - element-plus 上传各种 word pdf 文件、图片视频并上传到服务器功能效果,示例代码开箱即用。

效果图 在 vue3 项目中,使用 element plus 组件库的 el-upload 上传组件,进行文件、图片图像的上传功能示例。 完整代码 可直接复制,再改个接口地址。 在这里上传图片和文件是分成

新产品:Stimulsoft Forms 2023.3.1 Crack

Stimulsoft Forms 是一个用于交互式收集和处理用户数据的组件。表单工具可以轻松集成到您的项目或应用程序中&#xff0c;具有直观且用户友好的界面&#xff0c;并允许您创建丰富的表单模板。Stimulsoft Forms 是应用程序中与用户交互的新水平 什么是 Stimulsoft Forms&#xf…

华为数通HCIP-EVPN基础

MP-BGP MP-BGP&#xff08;Multiprotocol Extensions for BGP-4&#xff09;在RFC4760中被定义&#xff0c;用于实现BGP-4的扩展以允许BGP携带多种网络层协议&#xff08;例如IPv6、L3VPN、EVPN等&#xff09;。这种扩展有很好的后向兼容性&#xff0c;即一个支持MP-BGP的路由…

cad丢失mfc140u.dll怎么办?找不到mfc140u.dll的解决方法

第一&#xff1a;mfc140u.dll有什么用途&#xff1f; mfc140u.dll是Windows操作系统中的一个动态链接库文件&#xff0c;它是Microsoft Foundation Class (MFC)库的一部分。MFC是 C中的一个框架&#xff0c;用于构建Windows应用程序的用户界面和功能。mfc140u.dll包含了MFC库中…

Flowable-中间事件-信号中间抛出事件

定义 当流程执行到达信号抛出事件时&#xff0c;流程引擎会直接抛出信号&#xff0c;其他引用了与其相同的信号捕获 事件会被触发&#xff0c;信号发出后事件结束&#xff0c;流程沿后继路线继续执行。其抛出的信号可以被信号开始事 件&#xff08;Signal Start Event&#xf…

从官网认识 JDK,JRE,JVM 三者的关系

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM 是一些大厂面试必问点&#xff0c;要想解决 OOM、性能调优方面的问题&#xff0c;掌握 JVM 知识必不可少&#xff0c;从今天开始&#xff0c;将为大家介绍 JVM 的常用知…

css实现有缺口的border

css实现有缺口的border 1.问题回溯2.css实现有缺口的border 1.问题回溯 通常会有那种两个div都有border重叠在一起就会有种加粗的效果。 div1,div2,div3都有个1px的border&#xff0c;箭头标记的地方是没有处理解决的&#xff0c;很明显看着是有加粗效果的。其实这种感觉把di…

【Vscode】远程内存占用大

查看远程服务器上的扩展 依次删除&#xff0c;重新连接后观察内存占用 此扩展占用较高&#xff0c;约2G&#xff08;前后端项目&#xff0c;依赖较多导致&#xff09;

【node.js】04-模块化

目录 一、什么是模块化 二、node.js中的模块化 1. node.js中模块的分类 2. 加载模块 3. node.js 中的模块作用域 4. 向外共享模块作用域中的成员 4.1 module对象 4.2 module.exports 对象 4.3 exports对象 5. node.js 中的模块化规范 一、什么是模块化 模块化是指解…

为Android构建现代应用——主体结构

创建Screents和ViewModels 在前面的章节中&#xff0c;我们已经分析了OrderNow项目的理论概念和我们将赋予的组织。 在本章中&#xff0c;我们将开始实现初始结构和模板&#xff0c;这将联接每一个应用程序的部分。 首先将添加以下带有各自视图模型的主屏幕&#xff1a; •…

springboot 之以enable开头的注解

Spring​ 有很多 Enable 开头的注解&#xff0c;平时在使用的时候也没有注意过为什么会有这些注解 Enable 注解 首先我们先看一下有哪些常用的 Enable 开头的注解&#xff0c;以及都是干什么用的。 EnableRetry​&#xff1a;开启Spring 的重试功能&#xff1b; EnableSch…

【环境配置】Windows下WSL将ubuntu挪位置-系统盘清理

问题–垃圾太多&#xff0c;系统盘空间占用太大 最近 C 盘空间暴涨&#xff0c;用工具 WinDirStat-强烈推荐的工具 查看发现 WSL 子系统占用了6个多 G 的空间&#xff0c;遂想办法挪个位置&#xff1b; 【关键字】将 Windows 里的子系统挪到非系统盘 D 盘&#xff1b; 解决 打…

Python numpy库的应用、matplotlib绘图、opencv的应用

numpy import numpy as npl1 [1, 2, 3, 4, 5]# array():将列表同构成一个numpy的数组 l2 np.array(l1) print(type(l2)) print(l2) # ndim : 返回数组的轴数&#xff08;维度数&#xff09; # shape&#xff1a;返回数组的形状&#xff0c;用元组表示&#xff1b;元组的元素…

wangeditor编辑器配置

vue项目中使用编辑器&#xff0c;轻量&#xff0c;操作栏选取自己需要的 官网地址&#xff1a;用于 Vue React | wangEditor 使用在vue项目中引入 npm install wangeditor/editor --savenpm install wangeditor/editor-for-vue --save 封装成组件使用 <template>&…

处理多维特征的输入

数据的每一列称为&#xff1a;特征/字段 x的数据变为8列&#xff0c;维数8 step one:构建数据集 x_data;y_data&#xff1a;创建两个Tensor step two:定义模型 step three:构造损失和优化器 step four:训练 else 激活函数&#xff1a; 代码更改部分&#xff1a; 转->大佬笔…

C#|无法打开cs文件设计窗口

报错信息&#xff1a;To prevent possible data loss before loading the designer, the following errors must be resolved: 解决方案&#xff1a;实不相瞒我把项目解决方案名称改短了就可以了。。有其他原因或者解决方案望不吝赐教。。

【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟

目录 1.认识时钟树&#xff08;掌握&#xff09;1.1什么是时钟&#xff1f;1.2认识时钟树&#xff08;F1&#xff09;1.2.1STM32F103时钟树简图1.2.2STM32CubeMX时钟树&#xff08;F103&#xff09; 1.3认识时钟树&#xff08;F4&#xff09;1.3.1F407时钟树1.3.2F429时钟树1.3…