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

news2024/9/30 5:23:06

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

  • 1.线性插值法介绍
  • 2.手动实现线性插值
  • 3.案例一手动实现线性插值
  • 4.使用pandas的插值方法实现要求(推荐)

前言:主要介绍手动实现一维线性插值以及pandas里面的interpolate方法实现线性插值。


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)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL中锁的简介——行级锁之 间隙锁 和 临键锁

1.间隙锁演示 2.临键锁演示 间隙锁锁住的是间隙,不包含对应的数据记录,而临键锁既会包含当前这条数据记录,也会锁定该数据记录之前的间隙。间隙锁的目的是防止其他事务插入间隙造成幻读现象。间隙锁是可以共存的,一个事务采用的间…

maven引入本地jar包的简单方式【IDEA】【SpringBoot】

前言 想必点进来看这篇文章的各位,都是已经习惯了Maven从中央仓库或者阿里仓库直接拉取jar包进行使用。我也是🤡🤡。 前两天遇到一个工作场景,对接三方平台,结果对方就是提供的一个jar包下载链接,可给我整…

sqlSugar应用表值函数

一、新建表值函数 TableIntSplit 二、新建类 var employees _sqlSugarClient.Queryable<Employees>().InnerJoin(_sqlSugarClient.SqlQueryable<TableID>("select * from dbo.TableIntSplit(ids,split)").AddParameters(new { ids "1,2", s…

无涯教程-jQuery - Slide方法函数

幻灯片效果可以与show/hide/toggle一起使用。这会将元素滑出视口。 Slide - 语法 selector.hide|show|toggle( "slide", {arguments}, speed ); 这是所有参数的描述- direction - 效果的方向。可以是"左(left)"&#xff0c;"右(right)"&…

C语言第十一课--------操作符的使用与分类-------基本操作

作者前言 作者介绍&#xff1a; 作者id&#xff1a;老秦包你会&#xff0c; 简单介绍&#xff1a; 喜欢学习C语言和python等编程语言&#xff0c;是一位爱分享的博主&#xff0c;有兴趣的小可爱可以来互讨 个人主页::小小页面 gitee页面:秦大大 一个爱分享的小博主 欢迎小可爱们…

解决 tensorflow 出现的 ImportError: Could not find the DLL(s) ‘msvcp140_1.dll‘. 问题

在安装完tensorflow库后出现 问题详述&#xff1a; ImportError: Could not find the DLL(s) msvcp140_1.dll. TensorFlow requires that these DLLs be installed in a directory that is named in your %PATH% environment variable. You may install these DLLs by downlo…

JSP 文件上传

JSP 可以与 HTML form 标签一起使用&#xff0c;来允许用户上传文件到服务器。上传的文件可以是文本文件或图像文件或任何文档。 本章节我们使用 Servlet 来处理文件上传&#xff0c;使用到的文件有&#xff1a; upload.jsp : 文件上传表单。 message.jsp : 上传成功后跳转页…

超聚变和厦门大学助力兴业银行构建智慧金融隐私计算平台,助力信用卡业务精准营销...

兴业银行与超聚变数字技术有限公司、厦门大学携手&#xff0c;发挥产学研用一体化整体优势联合建设&#xff0c;厦门大学提供先进的算法模型及科研能力&#xff0c;超聚变提供产品解决方案及工程能力&#xff0c;兴业银行提供金融实践能力&#xff0c;三方发挥各自领域优势&…

RTPS规范v2.3(中文版)

实时发布订阅协议 DDS互操作性有线协议 &#xff08;DDSI-RTPS&#xff09; 技术规范 V2.3 &#xff08;2019-04-03正式发布&#xff09; https://www.omg.org/spec/DDSI-RTPS/2.3/PDF   目 录 0. 序言&#xff08;关于对象管理组&#xff09; 4 0.1 OMG 4 0.2 OMG规…

C++之浅拷贝和深拷贝总结(一百七十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【SLAM】A-LOAM 算法部署与测试(Win10 + VMWare + Ubuntu18.04)

基础环境 ubuntu及ROS安装&#xff0c;略&#xff1b;安装完ROS以后&#xff0c;默认已经安装好了PCL和Eigen库&#xff1b; 安装Ceres 下载Ceres源文件&#xff1a;&#xff08; Vmware没有网络&#xff0c;到下面的网址手动下载安装包 &#xff09; - https://github.com…

MyBatis-Plus自定义sql注入器

文章目录 一、前言二、MyBatis-Plus自定义sql注入器功能实现2.1、编写自定义sql类2.2、将自定义sql添加到BaseMapper中2.3、编写自己的sql注入器 一、前言 在日常开发过程中&#xff0c;我们可能会发现 MyBatis-Plus 提供的那些自带的 sql 语句无法满足我们的开发需求&#xf…

Java中注解应用场景

1.Parameter注解 Parameter(names "-browser", description "browser name, supported scope [chrome]", required true) Param注解的用法解析_parameter_fFee-ops的博客-CSDN博客 Public User selectUser(param(“userName”) String name, param(“…

C# Solidworks二次开发:向量相关的数学函数API的使用介绍

今天要讲的是Solidworks二次开发时候&#xff0c;如何使用一些与数学相关的API方法的介绍&#xff0c;在Solidworks中本身提供了一个函数用于对数学对象的访问&#xff0c;函数名为MathUtility。借助这个函数&#xff0c;我们来引出今天要介绍的几个API。 &#xff08;1&#…

剑指 Offer. 二叉树的镜像

请完成一个函数&#xff0c;输入一个二叉树&#xff0c;该函数输出它的镜像。 例如输入&#xff1a; 镜像输出&#xff1a; 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 代码如下&#xff1a; class Solution { public:Tre…

android下的app性能测试应主要针对那些方面,如何开展?

如何开展安卓手机下的App性能测试&#xff0c;对于优秀的测试人员而言&#xff0c;除了要懂得性能测试的步骤流程外&#xff0c;还应该懂的性能测试的一些其他知识&#xff0c;比如性能测试指标、各指标的意义&#xff0c;常用的性能测试工具、如何查看结果分析等等知识。所以本…

P1535 [USACO08MAR] Cow Travelling S(dfs+剪枝 or 记忆化搜索)

1:本题暴力做法简单&#xff0c;重点在于我们如何剪枝&#xff1a; :《曼哈顿距离》我们每走一个点就判断&#xff0c;当前点到终点的最短步数是不是小于当前剩余的步数&#xff0c; 如果大于就肯定不符合直接return,或者当步数为0时&#xff0c;当还没到达终点&#xff0c;那…

web流程自动化详解

今天给大家带来Selenium的相关解释操作 一、Selenium Selenium是一个用于自动化Web浏览器操作的开源工具和框架。它提供了一组API&#xff08;应用程序接口&#xff09;&#xff0c;可以让开发人员使用多种编程语言&#xff08;如Java、Python、C#等&#xff09;编写测试脚本&…

JavaWeb+jsp+Tomcat的叮当书城项目

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88123111?spm1001.2014.3001.5503 技术&#xff1a;ssm jsp JDK1.8 MySQL5.7 Tomcat8.3 源码数据库课程设计 功能&#xff1a;管理员与普通用户和超级管理员三个角色&#xff0c;管理员可…

C++笔记之vector的底层实现和扩容机制

C笔记之vector的底层实现和扩容机制 1. 先申请内存空间&#xff0c;内存空间容量变成原来的n倍(一般是原来的两倍) 2. 将原本容器中的数据拷贝到新的内存空间中 3. 释放原来的内存空间 4. 将数组指针指向新容器的内存空间 code review! 文章目录 C笔记之vector的底层实现和扩…