简介
2021年华为杯研赛B题“空气质量预报二次建模”第四题的数据预处理过程用到了一个反距离权重插值(见章节2.1),在这里整理一下。
目录
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个监测点的反向距离权重进行加权。
插值的数学表达式为:
令dij表示监测点i和监测点j之间的欧式距离,权重表达式为:
此处取:
根据坐标生成距离权重的代码如下所示:
#定义计算欧氏距离函数
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