[Python] 反距离权重插值案例及代码

本文介绍了在华为杯研赛B题“空气质量预报二次建模”中,如何使用Python进行反距离权重插值处理监测点A、A1、A2、A3的缺失值。首先,详细阐述了反距离权重插值的原理和实现方法,包括两种不同的函数定义方式。接着,讨论了随机森林插补处理剩余缺失值的情况。此外,还涉及了异常值处理,包括3西格玛原则和非负数据的处理。整个预处理过程都在Spyder3.7环境中进行。
摘要由CSDN通过智能技术生成

简介

2021年华为杯研赛B题“空气质量预报二次建模”第四题的数据预处理过程用到了一个反距离权重插值(见章节2.1),在这里整理一下。

目录

1. 赛题及数据

1.1 竞赛试题

1.2 数据集预览

2. 监测点A、A1、A2、A3实测时数据协同处理

2.1 缺失值处理1:反向距离权重

2.1.1 反向距离权重函数定义方法一

2.1.2 反向距离权重函数定义方法二

2.1.3 协同处理插值

2.2 缺失值处理2:随机森林插补

2.3 异常值处理1:3西格玛原则

2.4 异常值处理2:非负数据变成0


1. 赛题及数据

1.1 竞赛试题

         完整赛题及数据大家可自行前往“中国研究生创新实践系列大赛管理平台”下载,或者直接在网上搜索。 这里仅展示问题4

        问题4. 相邻区域的污染物浓度往往具有一定的相关性,区域协同预报可能会提升空气质量预报的准确度。如图 4,监测点A的临近区域内存在监测点A1、A2、A3,使用附件1、3中的数据,建立包含A、A1、A2、A3四个监测点的协同预报模型,要求二次模型预测结果中AQI预报值的最大相对误差应尽量小,且首要污染物预测准确度尽量高。使用该模型预测监测点A、A1、A2、A3在2021年7月13日至7月15日6种常规污染物的单日浓度值,计算相应的AQI和首要污染物,将结果依照附录“污染物浓度及AQI预测结果表”的格式放在论文中。并讨论:与问题3的模型相比,协同预报模型能否提升针对监测点A的污染物浓度预报准确度?说明原因。

1.2 数据集预览

官方提供数据集如下,问题4预处理过程只需用到附件1、附件3数据。
附件1 监测点A空气质量预报基础数据
附件2 监测点B、C空气质量预报基础数据
附件3 监测点A1、A2、A3空气质量预报基础数据 

从附件名字可以推测数据集的内部结构应该基本一致,只是监测点不同而已,事实也是如此。以监测点A为例,表1-1展示了监测点A提供的三份数据。

        参考博主另一篇文章《[Python]数据预处理例题:2021华为杯数学建模B题“空气质量预报二次建模”》,会知道:

       对于sheet1,由于一次预报数据不知道是原来就预报不正确,还是由于后期记录或抄写出现的错误,而题目本就要求改进一次预报模型,如果是原模型就不正确那我们给他更正也没有道理,因此对sheet1预处理工作仅了解缺失日期情况,不做进一步处理。

      对于sheet3,其实它跟sheet2是差不多,只是一个是时数据,一个是日数据。通过一些简单的探索分析,能够发现除O3外,sheet3中的数据几乎都是sheet2中对应日期的24h平均;O3的计算方式是取sheet2对应日期的“8小时滑动平均的最大值”,因此sheet3的预处理建立在sheet2之上。

      综上,协同处理部分只对监测点A、A1、A2、A3的sheet2"监测点A逐小时污染物浓度与气象实测数据"(以下简称“实测时数据”)处理就好。

 以下数据处理均在Spyder3.7中进行。

import os
import pandas as pd
import numpy as np

#设置工作目录
os.chdir('C:\\Users\...)  
os.getcwd()

#监测点A、A1、A2、A实测时数据导入
df2A=pd.read_excel("附件1 监测点A空气质量预报基础数据.xlsx","监测点A逐小时污染物浓度与气象实测数据")
df2A1=pd.read_excel("附件3 监测点A1、A2、A3空气质量预报基础数据.xlsx","监测点A1逐小时污染物浓度与气象实测数据")
df2A2=pd.read_excel("附件3 监测点A1、A2、A3空气质量预报基础数据.xlsx","监测点A2逐小时污染物浓度与气象实测数据")
df2A3=pd.read_excel("附件3 监测点A1、A2、A3空气质量预报基础数据.xlsx","监测点A3逐小时污染物浓度与气象实测数据")

2. 监测点A、A1、A2、A3实测时数据协同处理

2.1 缺失值处理1:反向距离权重

由于题目说到:监测点A、A1、A2、A3存在协同作用,即它们之间的变量可能存在一定的相关性。又考虑到污染物浓度和气象条件在地表上应当是连续变化的,所以在缺失值处理时,可以引入反向距离权重,对于缺失的数据,用其他2-3个监测点的反向距离权重进行加权。

插值的数学表达式为:

D=\sum_{i=1}^{n}(D_{i}w_{i})

 令dij表示监测点i和监测点j之间的欧式距离,权重表达式为:

\omega _{i}=\frac{f(d_{ij})}{\sum_{j=1}^{n}f(d_{ij}))}

 此处取:

f(d_{ij})=\frac{1}{d_{ij}}

 根据坐标生成距离权重的代码如下所示:

#定义计算欧氏距离函数
def distEclud(vecA, vecB):
    return np.sqrt(np.sum(np.power((vecA - vecB), 2)))

#导入四个监测点坐标
vecA=np.array([0,0])
vecA1=np.array([-14.4846,-1.9699])
vecA2=np.array([-6.6716,7.5953])
vecA3=np.array([-3.3543, -5.0138])

#监测点A、A1、A2、A3之间的反向距离权重
w01=1/distEclud(vecA,vecA1)
w02=1/distEclud(vecA,vecA2)
w03=1/di
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

禾木页

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值