接下来还需要对结果进行精度分析,在前面的过程产生了上百个EXCEL文件,需要对excel文件进行合并,然后只保留最后两列,同时要删除文件中的异常值(-9999,采样时的空值),之后进行精度分析。
为便于查看变量,使用spyder编辑器。
一开始想使用python计算nash和R2,但是发现python做数据分析一点也不如matlab容易上手。
先使用python读取数据,并将数据异常值处理掉。
# -*- coding: utf-8 -*-
"""
Created on Thu May 19 10:52:24 2022
@author: YIN
"""
import pandas as pd
import os
# 获取所有excel文件名列表
xlsx_list = os.listdir("D:/DELL/E/R_FACTOR_zong/sample_mouth_excel")
# 将所需要的数据都追加到一个excel中
Save_name = "D:/DELL/E/R_FACTOR_zong/sample_mouth_zong/"+"zong.csv"
# for循环读取列表
for xlsx_file in xlsx_list:
# 跳过读取第一行,读取第8、第9列
df = pd.read_excel("D:/DELL/E/R_FACTOR_zong/sample_mouth_excel/"+xlsx_file,
skiprows = 1, usecols=[7,8] )
df.to_csv(Save_name, encoding="utf8", index=None,mode='a')
# mode ="a"表示追加的意思
data = pd.read_csv("D:/DELL/E/R_FACTOR_zong/sample_mouth_zong/"+"zong.csv",
header = None)
#删除第二列含有的异常值-9999
new_data=data[~(data[1].isin([-9999]))]
# 保存数据
new_data.to_csv("D:/DELL/E/R_FACTOR_zong/sample_mouth_zong/"+"zong2.csv")
再使用matlab计算NSE与R2
%先删除含有的非数值行
zong2(any(isnan(zong2),2),:)=[];
%sim代表模拟值,obs代表实测值
obs = zong2(:,1);
sim = zong2(:,2);
%计算NSE
%代码引用自CSDN博主「Mahmut0205」的原创文章,遵循CC 4.0 BY-SA版权协议
%原文链接:https://blog.csdn.net/Mahmut0205/article/details/115695787
ave_obs = sum(obs(:))/numel(obs); %实测数据平均数
Numerator = sum(power(obs-sim,2)); %分子
Denominator = sum(power(obs-ave_obs,2));%分母
nse = 1 - Numerator/Denominator;% NSE结果
% 直接拟合线性回归模型计算R2
ans = fitlm(obs,sim)