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 pddef is_exist_nan(data):for d in data:if np.isnan(d):return Truereturn Falsedef get_nan_index_list(data):index_list = []for index,d in enumerate(data):if np.isnan(d):index_list.append(index)return index_listdef linear_interpolation(x1, y1, x2, y2, x0):"""线性插值函数参数:x1, y1: 第一个已知数据点的位置和数据值x2, y2: 第二个已知数据点的位置和数据值x0: 要估算的位置返回值:y0: 在位置 x0 处估算的数据值"""y0 = y1 + (x0 - x1) * (y2 - y1) / (x2 - x1)return y0def get_first_data(data):for index,d in enumerate(data):if not np.isnan(d):return ddef get_last_data(data):count = len(data) -1for d in data:if not np.isnan(data[count]):return data[count]else:count=count-1def digu(x2,data):if not np.isnan(data[x2]):return x2,dataelse:x2 = x2 + 1return 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 - 1y1 = data[x1]x2 = nan_index + 1x2,data = digu(x2,data)y2 = data[x2]x0 = nan_indexy0 = round(linear_interpolation(x1, y1, x2, y2, x0), 4)data[nan_index] = y0return dataif __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 pdif __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对象,此时缺失值会自动转换为NaNdata_series = pd.Series(data)# 执行线性插值,并处理第一个和最后一个NaNinterpolated_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 pltdef get_interpolated_data(data):# 将数据转换为pandas的Series对象,此时缺失值会自动转换为NaNdata_series = pd.Series(data)# 执行线性插值,并处理第一个和最后一个NaNinterpolated_data = data_series.interpolate(limit_direction='both').tolist()interpolated_data = [round(i, 4) for i in interpolated_data]  # 保留四位小数return interpolated_datadef 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_dataif __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()

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

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

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

相关文章

flink采用thrift读取tablets一个天坑

原先的配置 [INFO] StarRocksSourceBeReader [open Scan params.mem_limit 8589934592 B] [INFO] StarRocksSourceBeReader [open Scan params.query-timeout-s 600 s] [INFO] StarRocksSourceBeReader [open Scan params.keep-alive-min 100 min] [INFO] StarRocksSourceBeRea…

ORCA优化器浅析——QueryToDXL(CDXLLogical+CDXLScalar)主流程

Orca是Pivotal数据管理产品的新查询优化器,包括GPDB和HAWQ。Orca是一个基于Cascades操作时序框架的现代自上而下的查询优化器。虽然许多Cascades优化器与其主机系统紧密耦合,但Orca的一个独特功能是它能够作为独立的优化器在数据库系统之外运行。这种能力…

51:电机(ULN2003D)

1:介绍 我们51单片机使用的是直流电机 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 直流电机主要由永磁体(定子)、线圈(转…

flutter:角标

角标应该非常常见了,以小说app为例,通常会在小说封面的右上角上显示当前未读的章数。 badges 简介 Flutter的badges库是一个用于创建徽章组件的开源库。它提供了简单易用的API,使开发者可以轻松地在Flutter应用程序中添加徽章效果。 官方文…

IDEA 使用 maven 搭建 spring mvc

1. 创建项目 1.1 创建成功之后配置 Spring MVC 1.2 勾选 Spring MVC 2.更改配置文件 2.1 更改web.xml配置 更改为 <servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>2.2 dispat…

linux查看服务器系统版本命令

有时我们需要在linux服务器上安装DB、Middleware等&#xff0c;为了保证兼容性&#xff0c;我们需要知晓被提供的linux服务器版本是否满足需求&#xff0c;下面就说一说linux查看服务器系统版本命令。 1.cat /etc/redhat-release 适用于&#xff1a;rhel/centos等 2.cat /etc…

3ds max 烘培世界坐标到贴图/顶点色

设置Diffuse 为ObjectNormal Normalize(objectNormal) * 0.5 0.5 把Diffuse烘培到顶点色 烘培Diffuse到贴图 模型按UV展开 右键复制 &#xff0c; 到mesh上粘贴 烘培到贴图 UE使用 贴图导入为BC7 float3 n ObjectNormal*2-1; return float3(n.x,n.z,n.y); // x ,z ,y

工业平板电脑优化汽车工厂的生产流程

汽车行业一直是自动化机器人系统的早期应用领域之一。通过使用具有高负载能力和远程作用的大型机械臂&#xff0c;汽车装配工厂可以实现点焊、安装挡风玻璃、安装车轮等工作&#xff0c;而较小的机械手则用于焊接和安装子组件。使用机器人系统不仅提高了生产效率&#xff0c;还…

原生求生记:揭秘UniApp的原生能力限制

文章目录 1. 样式适配问题2. 性能问题3. 原生能力限制4. 插件兼容性问题5. 第三方组件库兼容性问题6. 全局变量污染7. 调试和定位问题8. 版本兼容性问题9. 前端生态限制10. 文档和支持附录&#xff1a;「简历必备」前后端实战项目&#xff08;推荐&#xff1a;⭐️⭐️⭐️⭐️…

【Vue3】递归组件

1. 递归组件mock数据 App.vue <template><div><Tree :data"data"></Tree></div> </template><script setup lang"ts"> import { reactive } from vue; import Tree from ./components/Tree.vue; interface Tr…

路由的配置

1、在router中设置路由导航跳转函数,在index.js文件中写这句话&#xff1a; 1.1 只要发生跳转, 就会调用这个函数&#xff1a; 1.2 导航的声明函数 2、访问系统访问控制系统如何形成 3、来一个导航守卫的案例&#xff1a;看看导航守卫的案例&#xff0c;写一个Main.Vue 和login…

sky-notes-02

11、HttpClient HttpClient作用&#xff1a; 发送HTTP请求接收响应数据 HttpClient的maven坐标&#xff1a; <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</vers…

docker启动容器报错

报错信息 [rootDream soft]# docker run -it -d -p 8080:8080 tomcat eec9fab6b9ca06d2bbf1467aef05d8020ee60448978e10ac20c38888934f0a0b docker: Error response from daemon: driver failed programming external connectivity on endpoint hungry_euclid (163242f0079e72…

关于c++中虚函数和虚函数表的创建时机问题

以这段代码为例。 #include <iostream>using namespace std;class Parent { public:Parent(){}virtual void func1() {};virtual void func2() {}; };class Child :public Parent { public:Child():n(0),Parent(){cout << "Child()" << endl;}vir…

如何建立ftp server?快解析内网穿透实现外网直接访问

serveru是一款由Rob Beckers开发的获奖的ftp服务器软件&#xff0c;全称为&#xff1a;serv-u ftp server&#xff0c;它功能强大又易于使用。ftp服务器用户通过它用ftp协议能在internet上共享文件。serv-u不仅100%遵从通用ftp标准&#xff0c;也包括众多的独特功能可为每个用户…

音视频——视频流H264编码格式

1 H264介绍 我们了解了什么是宏快&#xff0c;宏快作为压缩视频的最小的一部分&#xff0c;需要被组织&#xff0c;然后在网络之间做相互传输。 H264更深层次 —》宏块 太浅了 ​ 如果单纯的用宏快来发送数据是杂乱无章的&#xff0c;就好像在没有集装箱 出现之前&#xff0c;…

【Rust教程 | 基础系列 | Rust初相识】Rust简介与环境配置

教程目录 前言一&#xff0c;Rust简介1&#xff0c;Rust的历史2&#xff0c;Rust的特性3&#xff0c;为什么选择Rust 二&#xff0c; Rust环境配置1&#xff0c;windows11安装2&#xff0c;Linux安装 三&#xff0c;安装IDE 前言 Rust是一种系统编程语言&#xff0c;专注于速度…

U盘安装CentOS7.9出错:进入 dracut问题和解决方法

U盘安装CentOS7.9出错&#xff1a;进入 dracut问题和解决方法 原因&#xff1a;U盘名称未识别&#xff0c; 解决&#xff1a;进入启动界面&#xff0c;按e进入编辑界面 修改&#xff1a; vmlinuz initrdinitrd.img inst.stage2hd:LABELCentOS\x207\x20x86_64.check quiet 为 …

Linux 之 systemctl

systemctl 可以控制软件&#xff08;一般指服务&#xff09;的启动、关闭、开机自启动 能被systemctl 管理的软件&#xff0c;一般也称 服务 系统内置服务均可被 systemctl 控制第三方软件&#xff0c;如果 自动注册了 可被systemctl 控制第三方软件&#xff0c;如果没有自动…

【业务功能篇60】Springboot + Spring Security 权限管理 【终篇】

4.4.7 权限校验扩展 4.4.7.1 PreAuthorize注解中的其他方法 hasAuthority&#xff1a;检查调用者是否具有指定的权限&#xff1b; RequestMapping("/hello")PreAuthorize("hasAuthority(system:user:list)")public String hello(){return "hello Sp…