文章目录

  • 0.前言
  • 1.问题重述
    • 问题一
    • 问题二
    • 问题三
  • 2.问题求解
    • 问题一
    • 问题二
    • 问题三

0.前言

  1. 这是笔者第一次加入数学建模比赛,这篇文章作为自己这次竞赛的整个复盘,四天中,我们将题目做到了第三问,由于时间问题,第三问没能做出,不过我们已然满足。
  2. 所有的文件(包括试题,我的代码,生成的表格数据)全都放在一下链接中:21_研究生数学建模.zip。

1.问题重述

问题一

根据物种污染物的浓度及给定公式计算5日的AQI值以及首要污染物。

问题二

计算气象条件与污染物浓度的相似度。并且分类气象条件。

问题三

对历史的一次预测数据再进行二次预测。

2.问题求解

问题一

先进行数据清理,清理部分是函数Clean_data().再计算每一日的AQI,用到的函数是AQI()

def Clean_data(file,sheet,new,cut=[0]):#设置在终端显示的最大行列pd.set_option('display.max_columns',300)pd.set_option('display.max_rows',300)empty_values = ['—','NA']#打开表,给的字符换成空值df2 = pd.read_excel(file,sheet_name=sheet, na_values=empty_values)#用前一行的0补充空值new_df2 = df2.fillna(method='pad',axis=0)#去除日期的重行try:new_df2 = new_df2.drop_duplicates(['预测时间'],keep='first')except:try:new_df2 = new_df2.drop_duplicates(['监测日期'],keep='first')except:passif cut != [0]:new_df2 = new_df2.iloc[:,cut]# #清洗掉空行# new_df2 = df2.dropna(how='any')#表二的切片数据# df2p = df2.iloc[1:820,2:7]# 写入表单new_df2.to_excel(new, sheet_name=sheet,index=False)#int->Cp为浓度;string->mold是污染物类型
def calcIAQI(Cp,mold):#index是污染物的限值index_i=[0,50,100,150,200,300,400,500]if mold=='pm2.5':index=[0,35,75,115,150,250,350,500]elif mold=='pm10':index=[0,50,150,250,350,420,500,600]elif mold=='CO':index=[0,2,4,14,24,36,48,60]elif mold=='SO2':index=[0,50,150,475,800,1600,2100,2620]elif mold=='NO2':index=[0,40,80,180,280,565,750,940]elif mold=='O3':index=[0,100,160,215,265,800] else:return 'Unknown'# 选定当前浓度所在的区间for i in index:if i>Cp:break;j=index.index(i)Ih=float(index_i[j])Il=float(index_i[j-1])BPh=float(index[j])BPl=float(index[j-1])C=float(Cp)iaqi=(Ih-Il)*(C-BPl)/(BPh-BPl)+Ilreturn int(iaqi+0.5)# 输入当天的污染物浓度返回AQI值
def AQI(pollution):[so2,no2,pm10,pm2dot5,o3,co] = pollutionIAQI={'pm2.5':calcIAQI(pm2dot5,'pm2.5')}if pm10!=0:IAQI['pm10']=(calcIAQI(pm10,'pm10'))if co!=0:IAQI['CO']=(calcIAQI(co,'CO'))if so2!=0:IAQI['SO2']=(calcIAQI(so2,'SO2'))if no2!=0:IAQI['NO2']=(calcIAQI(no2,'NO2'))if o3!=0:IAQI['O3']=(calcIAQI(o3,'O3'))#Print all of the result .Only return the AQI as the result# print (IAQI)max_key_value = max(IAQI.items(), key = lambda x: x[1])return max_key_value

问题二

求逐小时的每个气象特征与每个的污染物浓度的R平方数(R平方数与皮尔逊系数相当接近),用到的函数是computeCorrelation()

#用于计算R方,x、y均为矩阵
def computeCorrelation(x, y):xbar = np.nanmean(x)ybar = np.nanmean(y)SR = 0varX = 0varY = 0for i in range(0, len(x)): #多少实例diffxx = x[i] - xbardiffyy = y[i] - ybarSR += (diffxx * diffyy)varX += diffxx ** 2 # 求平方然后累计起来varY += diffyy ** 2 # 求平方然后累计起来ST = math.sqrt(varX * varY)#返回R方=方差/总方差return SR / ST#以行 为污染物与API,列为天气特征生成R方的表格
def solve_ques2(pollution,Air_condition,AQI):#取出附件一中表二每一个空气特征的数组Air_condition_arry = Air_conditionAir_condition_items = ['温度','湿度','气压','风速','风向']pollution_arry = pollutionpollution_items = ['so2','no2','pm10','pm2dot5','co','o3']R_squre_ans = []# PCC_ans = []df_R = pd.DataFrame({'Condition':Air_condition_items})#求每个天气特征与污染物的R方,i为列,j为行,并追加到表中for i in range(len(pollution_items)):for j in range(len(Air_condition_items)):R_squre_ans.append(computeCorrelation(Air_condition_arry[j],pollution_arry[i]))df_R.insert(i+1,pollution_items[i],R_squre_ans)R_squre_ans = []#求天气特征与AQI的R方,并追加到表中for j in range(len(Air_condition_items)):R_squre_ans.append(computeCorrelation(Air_condition_arry[j],AQI))df_R.insert(len(pollution_items)+1,'AQI',R_squre_ans)df_R.to_excel('R_Square.xlsx', sheet_name='sheet1',index=False)

问题三

二次预测时用到了机器学习,选取一个模型后以x为一次预测的污染物浓度,y为实际污染物浓度。以前83%为训练集,后17%为测试集进行训练,最后返回出未来三天的预测值。

#预测5个污染物再下三天的值,x,y均为pandas的df形式(该函数实际测了6个污染物,没时间改了)
def train_5_pollution(model):#先修改个路径print(os.getcwd())#显示当前路径os.chdir('D:\Code\MathCompetition\question3')#导入文件df_a_pred = pd.read_excel('A_short_pred.xlsx',sheet_name='sheet1')df_b_pred = pd.read_excel('B_short_pred.xlsx',sheet_name='sheet1')df_c_pred = pd.read_excel('C_short_pred.xlsx',sheet_name='sheet1')df_a_real = pd.read_excel('A_short_real.xlsx',sheet_name='sheet1')df_b_real = pd.read_excel('B_short_real.xlsx',sheet_name='sheet1')df_c_real = pd.read_excel('C_short_real.xlsx',sheet_name='sheet1')df_future = pd.read_excel('predict1_future.xlsx',sheet_name='Sheet1')#向下追加表单df_pred = df_a_pred.append(df_b_pred,ignore_index=True)df_pred = df_pred.append(df_c_pred,ignore_index=True)df_real = df_a_real.append(df_b_real,ignore_index=True)df_real = df_real.append(df_c_real,ignore_index=True)  df_pred.to_excel('first_pred.xlsx',sheet_name='sheet1',index=False)df_real.to_excel('all_history.xlsx',sheet_name='sheet1',index=False)score=[]#分割数据x_fix_test = df_pred.iloc[10000:12000,:]x_fix_train = df_pred.iloc[0:10000,:]y_fix_test = df_real.iloc[10000:12000,:]y_fix_train = df_real.iloc[0:10000,:]pollution_items = ['so2','no2','pm10','pm2dot5','co','o3']x_fix_test.to_excel('x_fix_test.xlsx',sheet_name='sheet1',index=False)y_fix_test.to_excel('y_fix_test.xlsx',sheet_name='sheet1',index=False)#开跑j = 0for i in [2,3,4,5,6,7] :x_test = x_fix_test.iloc[:,[i]]y_test = y_fix_test.iloc[:,[i]]x_train = x_fix_train.iloc[:,[i]]y_train = y_fix_train.iloc[:,[i]]# x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)model.fit(x_train,y_train)score.append(model.score(x_test, y_test))result = model.predict(x_test)future_pred = df_future.iloc[:,[i]]future = model.predict(future_pred)future_topd = pd.Series(future)result_topd = pd.Series(result)future_topd.to_excel('future'+pollution_items[j]+'.xlsx',sheet_name='sheet1',index=False)result_topd.to_excel('test_'+pollution_items[j]+'_result.xlsx')j += 1print(score)score_topd = pd.Series(score)score_topd.to_excel('score_test.xlsx')

21华为杯数学建模B题--空气质量二次预测相关推荐

  1. 2021华为杯数学建模B题“空气质量预报二次建模” 预处理思路+Python代码

    简介 前阵子和小伙伴做了2021年华为杯研赛的B题"空气质量预报二次建模",发现数据预处理一块挺有意思的,涵盖了常规的缺失值(随机缺失.指标缺失/列缺失.条目缺失/行缺失).异常值 ...

  2. 【2022年华为杯数学建模E题赛后总结加思路详细介绍配代码----10月11号写的总结】

    提示:下文将介绍2022年华为杯数学建模E题赛后总结加思路详细介绍配代码 傻逼队友,傻逼队友,傻逼队友一定要看好人在进行组队,这是劝告. 这里有几点总结进行描述: 第一,图一定要尽量多,对图的解释要多 ...

  3. 2022华为杯数学建模B题——方形件组批优化问题

    本文章用于记录2022华为杯数学建模B题--方形件组批优化问题 提醒:大家最终提交的时候记得是pdf文件,不是word文件. 第一次参加建模比赛,经验不足,准备不充分,能力也欠缺.考虑2023年继续再 ...

  4. 2021华为杯数学建模D题解题-抗乳腺癌候选药物的优化建模

    2021华为杯数学建模D题解题-抗乳腺癌候选药物的优化建模 赛题 1. 问题一解题:特征选择 1.1. 赛题分析 1.2. 解题:特征选择方法对比 1.3. 模型评估 2. 问题二解题:预测模型 2. ...

  5. 2021年华为杯数学建模B题,四题全部代码和思路

    2021年华为杯数学建模B题,四题全部代码和思路 需要的请联系我,企鹅1514168893.先看视频,满意再来找我,谢谢哈 四题均已做完

  6. 2020华为杯数学建模D题交流2群

    2020华为杯数学建模D题交流2群

  7. 数据挖掘机器学习[七]---2021研究生数学建模B题空气质量预报二次建模求解过程:基于Stacking机器学习混合模型的空气质量预测{含码源+pdf文章}

    相关文章: 特征工程详解及实战项目[参考] 数据挖掘---汽车车交易价格预测[一](测评指标:EDA) 数据挖掘机器学习---汽车交易价格预测详细版本[二]{EDA-数据探索性分析} 数据挖掘机器学习 ...

  8. 华为杯数学建模E题UWB精确定位一等奖算法思路

    (之前的草稿..)上上..上周五也就是十号的时候,我在玩乒乓球,结束的时候,我打开了手机,发现我qq微信短信超多,原来是获得了数学建模国家一等奖,大家纷纷送来了祝福,第一次参加,从查看论文到设计算法, ...

  9. 2021华为杯数学建模D题完整思路

    题目:D 抗乳腺癌候选药物的优化建模 这道题就是分类问题,解决的方法基本都是机器学习(含深度学习.强化学习)的方法,来看第一问 第一问,ERα_activity中一般采用pIC50来表示生物活性值,看 ...

最新文章

  1. 实现操作系统运行稳定流畅如初、免受各类运行异常之苦的六个实用“秘诀”...
  2. c++ 使用对象指针
  3. MyBatisPlus查询方法selectById、selectOne、selectBatchIds、selectByMap、selectPage的使用
  4. python首行代码import *,from * import * 解析
  5. Python基础--环境配置、编码风格、基础概念、基本数据类型(1)
  6. php通过ajax下载文件,通过Ajax如何请求下载Execl文件
  7. 008 查看套接字选项是否受支持(获取当前环境下套接字选项默认值)
  8. pic单片机c语言多路模拟量输入,pic单片机多路ad切换程序介绍
  9. Web前端之HTML取色器
  10. 【NDN安全】Poseidon: Mitigating Interest Flooding DDoS Attacks in Named Data Networking 学习笔记
  11. UCenter+云市场?开源用户中心2.0时代即将开启
  12. 关于 360 度评估
  13. 大型团队合作的八条法则
  14. Unity3d+Gameframework:entity实体代码分析,基于StarForce
  15. sendto recvfrom 详解
  16. python数分之PM2.5案例
  17. 基于python的报修系统_基于JSP的学生公寓报修管理系统.doc
  18. vue中plain=true是什么意思
  19. ubuntu命令大全
  20. codeforces每日5题(均1700)-第七天

热门文章

  1. 也门亚丁一炼油厂爆炸起火造成数人受伤
  2. 机房收费管理之数据源配置
  3. NodeJs string与base64互转
  4. hbuilder app教程
  5. 程序员漫画集连载[1]
  6. 20210303-CSR
  7. Java岗大厂面试百日冲刺【Day44】— Redis3 (日积月累,每日三题)
  8. Kafka扩分区和分区副本重分配之后消费组会自动均衡吗?
  9. J.P. Morgan Executes and Clears CDS and IRS Trades Via Bloomberg Professional
  10. win10安装的es设置自启动时报错Failed starting ‘elasticsearch-service-x64‘ service