WRF后处理总结:wrf-python与NCL在WRF后处理中的基本应用——变量提取计算与可视化
Posted 什么都不会的张同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WRF后处理总结:wrf-python与NCL在WRF后处理中的基本应用——变量提取计算与可视化相关的知识,希望对你有一定的参考价值。
本内容相关视频讲述:WRF后处理总结
文章目录
什么是WRF后处理?为什么要后处理?
当我们跑完WRF,会有很多输出wrf_out文件,一般以nc格式储存,在wrfout文件里,有着大量的输出变量,使得我们在处理想要的变量时感到头疼,而同时,许多气象中常用的诊断变量无法直接从nc的变量中读出,而是封装在了其他变量里,这时,我们需要使用相应的函数进行诊断量的计算与提取。
此外,WRF本身使用的坐标是使用随地形改变的地形跟随坐标Terrain Following Coordinate (TFC),在WRF3.9以后,WRF又加入了混合垂直坐标Hybrid Vertical Coordinate (HVC) 选项。
简而言之,WRF中的垂直层并不是我们常用的等气压面,而是采用eta层区分,eta层的对应高度与对应区域海拔相关,而在气象中,我们通常选取等压面、等位高度面进行分析研究,这就涉及到了eta向等位势高度面、等气压面的转化与插值计算。
WRF中,使用的是格点中心位置平均来表示该网格里所有变量的值,当我们想使用站点观测数据与模式数据进行对比分析时,找出站点经纬度对应的最近格点经纬度索引并提取就非常重要。
总结一下,WRF后处理包括计算、绘图两部分,正确的计算是绘图的前提,不同的绘图类型也对应不同的变量计算处理方式,总结如下:
- 计算
- 读取、合并、基本计算
- 诊断量计算(cape、Cloud fraction、Precipitable Water等)
- 垂直插值、坐标索引转换
- 绘图
- 剖面图
- 填色图
- 折线/点线图
- 其他:3D、风玫瑰、Skew_T
数据信息
首先我们应当查看一下wrf输出变量的一些信息,可以使用ncdump-h
直接查看,也可以在ncl里让ncl打印:
a=addfile("wrfout_d01_2018-05-06_12:00:00","r")
print(a)
printVarSummary(a)
返回:
File path: wrfout_d01_2018-05-06_12:00:00
Number of global attributes: 150
Number of dimensions: 12
Number of variables: 279 …
以及一大串变量的信息,就不放了,实在太长了,建议直接将用:>out.txt
其输出查看。
计算部分
wrf-python和NCL都有对应的wrf变量提取、插值、诊断量计算的函数,其中常用函数总结如下表:
NCL与WRF-python常用计算函数
NCL | WRF-python | |
---|---|---|
wrf_user_get_var | wrf.getvar | Extract and computes varaiables |
wrf_user_interp_level | wrf.interplevel | Interpolate a 3D field at the given vertical level(s) |
wrf_user_vert_cross | wrf.vertcross | Interpolates a 3D field through a user-specified horizontal line |
wrf_user_interp_line | wrf.interpline | Interpolates a 2D field to a user-specified line |
wrf_user_ll_to_xy | wrf.ll_to_xy | Lat/Lon <-> XY Routines |
可以看出wrf-python与NCL在WRF处理中的一致性与相似性。
文件读取与诊断变量的计算
诊断变量的获取代码如下:
NCL:
DATADir ="/public/home/zhangzilu/Build_WRF/WRF-4.3/run/out/"
FILES = systemfunc (" ls -1 " + DATADir + "wrfout* ")
numFILES = dimsizes(FILES)
print("numFILES = " + numFILES)
print(FILES)
a = addfiles(FILES+".nc","r")
slp = wrf_user_getvar(a,"slp",-1)
wrf-python
os.chdir('F:/wrfout/wrfoutnew/')
file_list = os.listdir(filepath)
files = [os.path.join(filepath,x) for x in file_list]
wrflist=[Dataset(d) for d in files]
slp = getvar(wrflist, "slp",timeidx=ALL_TIMES, method="cat")
对于wrf文件中的诊断变量种类与对应变量,可参考:Available diagnostics
插值
1、水平面插值
将有的3D数据,插值至对应气压面上,如根据3D的位势高度变量,插值到500hPa等压面。
NCL:
ht = wrf_user_getvar(a, "z",time) ; height
p = wrf_user_getvar(a, "pressure",time) ; pressure
ht_500 = wrf_user_interp_level(ht,p,500,False)
wrf-python
z = getvar(ncfile, "z")
p = getvar(ncfile, "pressure")
ht_500 = interplevel(z, p, 500.)#500hPa位势高度
2、垂直剖面插值
主要是将等eta层的数据插到对应位势高度上,此时得到3D数据对应Z轴为位势高度。
主要用于绘制垂直剖面图使用。
NCL:
z = wrf_user_getvar(a, "z",time) ; grid point height
qv = wrf_user_getvar(a, "QVAPOR",time) ;
latlon = (/-118,38,-115,40/)
opt = True
opt@latlon = True
opt@linecoords = True ; returns lat/lon coordinates on line as attributes "lats","lons"
opt@file_handle = a
qv_latlon = wrf_user_vert_cross(qv,z,latlon,opt)
wrf-python:
z = getvar(ncfile, "z")
p = getvar(ncfile, "pressure")
# Define a start point and end point in grid coordinates
start_point = CoordPair(x=0, y=(z.shape[-2]-1)//2)
end_point = CoordPair(x=-1, y=(z.shape[-2]-1)//2)
p_vert = vertcross(p, z, start_point=start_point, end_point=end_point, latlon=True)
绘图与可视化
NCL:官方示例丰富,主要根据其脚本修改绘制即可官方示例脚本
对于NCL,可使用WRF专用的绘图函数WRF-specific plotting functions,同样,也可以使用常用的gsn_csm plotting functions。
NCL官方文档示例极其丰富,学习以官方手册为主。
Python:主要使用Cartopy/Basemap(已停止维护)与matplotlib包结合。
WRF-python提供绘图辅助函数,用于获取 cartopy,basemap,PyNgl使用的地图对象,如:
cart_proj = get_cartopy(wrfin=ncfile)
# 从文件中获取地理边界,默认使用 XLAT, XLONG
# 提供变量名,可以获取其栅格边界
bounds = geo_bounds(wrfin=ncfile)
NCL与wrf-python结合
NCL:读取与处理nc数据快速,用于后处理的变量读取计算部分
python:绘图美观,已有现成封装绘图脚本,用于绘图。
在NCL中,常用的数据计算与切片逻辑与python一致,NCL中,Statistics函数中,可实现python numpy库的基本计算功能。
可先使用python(或其他熟悉语言)完成计算部分代码,再将其替换为NCL对应语句。
以下为示例,代码用处为:批量读取Wrfout文件,提取对应变量,计算均值(时间平均),并输出。
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"
begin
; Make a list of all files we are interested in
DATADir ="/public/home/zhangzilu/Build_WRF/WRF-4.3/run/out/"
FILES = systemfunc (" ls -1 " + DATADir + "wrfout* ")
print(FILES)
a = addfiles(FILES+".nc","r")
times = wrf_user_getvar(a,"times",-1) ; get all times in the file
ntimes = dimsizes(times) ; number of times in the file
slp = wrf_user_getvar(a,"slp",-1) ; slp
z=wrf_user_getvar(a,"slp",-1) ; height
p=wrf_user_getvar(a,"pressure",-1) ; pressure
q=wrf_user_getvar(a,"QVAPOR",-1) ;humidity ratio
az=dim_avg_n(z, 0)
ap=dim_avg_n(p,0)
aq=dim_avg_n(q,0)
use_out=addfile("for_python.nc", "c")
use_out->z = az
use_out->p = ap
use_out->QVAPOR = q
end
Python可视化的示例
可参见我的其他博客:
总结
- 判断需要提取的变量与诊断量
确定后,使用getvar函数进行提取。
可使用ncdump-h命令查看wrfout中的变量,wrf中的诊断量分类也可从官方文档处查阅。
- 判断绘图类型
所需的可视化绘图类型,决定了你在WRF后处理中的计算步骤。
1D点线图:ll_to_xy interpline
2D填色图:interplevel
3D剖面图:vinterp vertcross
- 绘图、美化
色标、XY轴、标签的设置等等。
风控指标:净损失率NCL的计算流程整理
这段时间,经常会接触到NCL这个指标,在网上搜索这个指标后发现,基本上都是简单提一下概念和计算公式,对于NCL的计算过程没有一个完整的总结
所以这篇文章,来对NCL的计算做一个小小的整理,写的时间比较少,内容会比较粗糙。
净损失率(NCL%)
净损失率(NCL:net credit loss)可以用来衡量某个月放款在呆账(逾期180天以上,也即核销write-off)之后的损失情况,主要目的是计算表内净损失的指标。
其计算公式为:
净损失=当期呆帐金额 - 当期呆账回收金额
NCL = 净损失 / 呆账前应收金额
这里提一下核销的概念:
贷款核销就是“呆账贷款核销” 的简称,就是当某些贷款还没还清时,银行的审核部门会认定贷款将无法收回,那么银行就会按照规定把呆账的贷款予以核销。
净损失率NCL 可以计算 NCL1、NCL3、NCL6等
示例:计算NCL6
NCL6 只能在6个月以后才能观察
(1)计算月末在贷余额的分布情况
首先还是说明一下逾期期数的含义
- M0:当前未逾期(或用C表示,取自Current)
- M1: 逾期1-30日
- M2:逾期31-60日
- M3:逾期61-90日
- M4:逾期91-120日
- M5:逾期121-150日
- M6:逾期151-180日
- M7:逾期180日以上。此时也被称为呆账(Bad Debts)
而对于在贷余额:指到某一节点日期为止,借款人尚未归还放款人的贷款总额,尚未偿还的贷款余额等于贷款总额扣除已偿还的银行贷款。(就是用户仍未还清的贷款总额,其中包括之后每个月需要按期还的C,以及之前逾期的金额 M1+M2+M3+···)
所以
月末在贷余额 = C(后面需正常还款的金额) + M1(前面逾期1-30天的金额) + M2(前面逾期31-60天的金额) + M3 + M4 + ···· +(M7+)
示例
注:此虚构数据
(2)计算迁徙率
迁徙率是指某一贷款的状态变为另一种状态的一种变化过程
这里提一下滚动率和迁徙率的关系
滚动率是指客户从某个观测点之前的一段时间的逾期状态向观测点之后的一段时间的逾期状态转化的比例
而迁徙率应该只有一个方向,即前滚,而滚动率则可以是前滚,也可以是回滚。
迁徙率的计算公式如下:
- C→M1 月末时点M1的资产在贷余额/上月末时点C资产在贷余额
- M1→M2 月末时点M2的资产在贷余额/上月末时点M1资产在贷余额
- M2→M3 月末时点M3的资产在贷余额/上月末时点M2资产在贷余额
···- M6→M7 月末时点M7的资产在贷余额/上月末时点M6资产在贷余额
示例
(1)
(2)
注:此虚构数据
(3)计算平均迁徙率6
如图:
(1)
(2)
注:此虚构数据
(4)计算平均迁徙率_NCL6_
C→C (NCL6) = 100%
C→M1(NCL6) = C→C(NCL6) * C→M1(6)
C→M2(NCL6) = C→M1(NCL6) * M1→M2(6)
C→M3(NCL6) = C→M2(NCL6) * M2→M3(6)
····
如图:
(1)
(2)
注:此虚构数据
(5)计算NCL
公式:
NCL = 12*(C→M7)/(C→C+C→M1+……+C→M6)
如图:
注:此虚构数据
以上为计算NCL6的一种方法,如果要计算 NCL1,就不需要计算 平均迁徙率1,因为 迁徙率 = 平均迁徙率1
如果计算NCL3 ,只需要调节 平均迁徙率3 的计算公式,如下图:
除了以上的计算方式以外,我在网上也查阅了一下,有位大锅是这样计算的,可供参考
来自:18个互联网消费金融风控术语介绍及实例展示 - 知乎 (zhihu.com)
最后
虽然 NCL指标 计算复杂,但在风险控制过程中是非常具有参考价值的一个指标。
另外,除了 净损失率NCL 以外,还有GCL毛损失率、净收益率、回收率、转呆账率等等
净收益率
净收益率=((加权利率/在贷本金)*(1-渠道流量成本))/1.06-0.0492-[NCL1]
回收率
回收率与净损失率正好相反,一个是计算呆坏账之后的损失情况,一个是计算呆坏账的回收情况,两者加起来和值等于1。
转呆账率
引用:金融行业相关指标整理(超全面,欢迎交流~) - 爱码网 (likecs.com)
转呆账率WO 和净损失率NCL 常一起计算、显示,区别在于:前者不考虑呆账回收的部分。
以上是关于WRF后处理总结:wrf-python与NCL在WRF后处理中的基本应用——变量提取计算与可视化的主要内容,如果未能解决你的问题,请参考以下文章