接下来还需要对结果进行精度分析,在前面的过程产生了上百个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)

更多推荐