批量计算均方根误差(RMSE)
单场次LoD(统一LoD),前一场和后一场的LoD
累计场次LoD,即和第0场的LoD
import math
import pandas as pd
import numpy as np
# 1.读数据
def readXls(path):
"""
读取数据
:param path: 文件地址
:return: df格式数据
"""
dataInit = pd.read_excel(path, header=0)
dataDf = dataInit[['Z', 'RASTERVALU']]
return dataDf
def CleanData(dataDf):
"""
数据清洗
:param dataDf: df格式的初始数据
:return: 去除空值的df格式数据
"""
cleanDf = dataDf.drop(index=dataDf[(dataDf.RASTERVALU == -9999)].index.tolist())
return cleanDf
def CalcuRMSE(path, sessionNum, sessionNum_):
"""
计算RMSE
:param path: xls数据地址
:return: 单场次RMSE值
"""
RMSEAll = []
for i in range(1, sessionNum + 1):
RMSEList = []
for j in range(1, sessionNum_ + 1):
pathNew = path + "/" + str(i) + "-" + str(j) + ".xls" # 命名规则"1-1.xls"
try:
dataDf = readXls(pathNew)
cleanDf = CleanData(dataDf)
sumPow_col1 = pow(abs(cleanDf['Z'] - cleanDf['RASTERVALU']), 2)
sumPowNp = np.array(sumPow_col1)
RMSE = math.sqrt(np.sum(sumPowNp) / len(sumPowNp))
RMSEList.append(RMSE)
except:
continue
RMSE_ = sum(RMSEList) / len(RMSEList)
RMSEAll.append(RMSE_)
return RMSEAll
def CalcuLoD(RMSEAll):
"""
计算LoD
:param RMSEAll: RMSE数据
:return: 单场次LoD
"""
# 计算单场次LoD
LoDAlone = []
for i in range(len(RMSEAll)):
if i != len(RMSEAll) - 1:
accuLoD = 1.96 * math.sqrt(pow(RMSEAll[i], 2) + pow(RMSEAll[i+1], 2))
LoDAlone.append(accuLoD)
else:
continue
# 计算累计场次LoD
LoDSum = []
for i in range(1, len(RMSEAll)):
accuLoD = 1.96 * math.sqrt(pow(RMSEAll[0], 2) + pow(RMSEAll[i], 2))
LoDSum.append(accuLoD)
return LoDAlone, LoDSum
if __name__ == "__main__":
path = "File/temp/DoD/dempoint" # ArcGIS "表转excel"的保存地址(写到文件存放一级即可)
sessionNum = 15 # 场次
sessionNum_ = 3 # 同一场次内需处理的最大点云个数
RMSEAll = CalcuRMSE(path, sessionNum, sessionNum_)
LoDAlone, LoDSum = CalcuLoD(RMSEAll)
print("单场次RMSE:")
print(RMSEAll)
print("单场次LoD:")
print(LoDAlone)
print("累计场次LoD:")
print(LoDSum)