Python:如何统计特定返回周期下的GEV分布值和实际观测值的超越概率?

处理数据样式如下:

在这里插入图片描述

01 reuturn_periods函数说明

def return_periods(data, years=[10, 20, 30, 50, 80, 100]):
    data = np.array(data)  # data为ndarray格式
    # Fit the generalized extreme value distribution to the data.
    shape, loc, scale = genextreme.fit(data)
    print("Fit parameters:")
    print(f"  shape: {shape:.4f}")
    print(f"  loc:   {loc:.4f}")
    print(f"  scale: {scale:.4f}")
    # Compute the return levels for several return periods.
    P_years = np.array(years)
    return_levels = genextreme.isf(1 / P_years, shape, loc, scale)

    print("P_years:")
    print("Period    Level")
    for period, level in zip(P_years, return_levels):
        print(f'{period:4.0f}  {level:9.2f}')
    return return_levels

这个函数实际上是基于给定数据(单列数据),利用scipy.stats.genextreme对数据进行拟合,找到最适合数据的GEV分布参数:形状参数(shape)、位置参数(loc)和尺度参数(scale),这三个参数共同定义了一个GEV分布,它可以描述极值事件的概率分布特征。(值得注意的是,形状参数shape对分布类型的影响很大:shape > 0 对应Frechet分布,shape = 0 对应Gumbel分布,shape < 0 对应Weibull分布。不同类型的分布适用于不同的极端事件类型。),接着基于拟合得到的GEV分布确定特定返回周期下的极值水平

那么这个函数到底在干什么?说人话就是:

我给你一部分时间序列数据,那么你可以依据这个部分时间序列找出一些规律和分布,并告诉我假定有这么一场极端事件或者灾难,那么它的强度将达到多少呢?

科学一点就是:

基于提供的时间序列数据,我们将采用统计学方法分析其规律和分布特性。通过拟合广义极值分布(GEV),我们可以估计特定返回周期下极端事件的强度。这一分析将帮助我们理解在给定的时间跨度内,极端事件发生时可能达到的最大强度。

那么运行结果将类似下方:

在这里插入图片描述

他输出的是当前循环列数据下基于GEV拟合得到10年一遇、20年一遇、30年一遇···的极端事件该数据值(例如降水值、温度值)达到的强度值、以及基于该数据拟合得到的GEV分布的分布特征:shape、loc、scale值。

Note:此处的10年一遇并非准确描述,它实际上是一个通俗的理解,但未必准确,应该说是如果有一个极端事件,这个极端事件每年有10%的概率(超越概率)会发生,那么这个极端事件的强度水平有多大?所以前面的P_years 实际上是指的是给定返回周期的超越概率。

02 GEV/GEV_Gumbel函数说明

def GEV_Gumbel(data):
    # sigma0 = np.std(data)
    # avr0 = np.mean(data)
    # Cv0 = sigma0 / avr0
    # print("avr:", avr0,"Cv:", Cv0)
    shape, loc, scale = genextreme.fit(data)
    c = 0
    GEV_f = (1 - genextreme.cdf(data, c, loc=loc, scale=scale)) * 100
    # shape = 0, GEV1, Gumbel distribution
    # shape > 0, GEV2, Fréchet distribution
    # shape < 0, GEV3, Weibull distribution
    return GEV_f

GEV函数与上述GEV_Gumbel函数区别仅在于c = shape,c=0即将其视为标准的Gumbel分布

那么这个函数在进行何种处理呢?genextreme.fit在对单列数据进行GEV分布拟合,得到该分布的分布特征,然后使用genextreme.cdf累积分布函数基于得到的GEV分布特征,对传入的单列数据的每一值进行计算,给出对于当前数据值的非超越概率(*100 百分化),再用1减去意为超越概率,也就是说,当前值发生的概率有多大。

例如,某个站点的在某天发生了降水事件,日降水值是300mm,那么我们通过GEV分布得知它的非超越概率是95%,那么超越概率就是5%,也就是说,这次降水事件发生的概率是5%,换言之,在所有降水事件,几乎有95%的降水事件的强度都小于此次降水的强度。

03 主程序说明

if __name__ == '__main__':
    out_path = r'I:\ObjectRS\软著_绘姐\SC2_ReturnPeriod'
    data = pd.read_csv(r'I:\ObjectRS\软著_绘姐\SC2_ReturnPeriod\TJ2st_TEM_WIN_WO_snow.csv')
    # data为ndarray格式

    Years = pd.DataFrame([10, 20, 30, 50, 80, 100])
    Return = Years
    data_f = data
    for i in range(1, 13):
        print(i)
        var = data.iloc[:, i].dropna(axis=0)
        bd = pd.DataFrame(return_periods(var))
        Return = pd.concat([Return, bd], axis=1)
    Return.to_csv('I:\ObjectRS\软著_绘姐\SC2_ReturnPeriod\Return_TEM_WIN_snow_P.csv')

    var = data.iloc[:, 1].dropna(axis=0)
    sigma = np.std(var)
    avr = np.mean(var)
    Cv = sigma / avr
    # f0 = GEV(var)
    f0 = GEV_Gumbel(var)
    fig, ax = plt.subplots(figsize=(8, 8))
    ax.scatter(f0, var)
    # add a grid(only horizontal lines)
    # ax.grid(axis='y', alpha=0.8, linestyle='--')
    ax.grid(alpha=0.8, linestyle='--')
    # # add scale
    ax.axis([0,100,28,38])
    ax.set_xticks(range(0, 110, 10))
    ax.set_yticks(range(28, 39, 1)) #useless!
    ax.tick_params(labelsize=18)
    ax.set_xlabel('P频率(%)', fontsize=18)
    ax.set_ylabel('气温(℃)', fontsize=18)
    z = np.polyfit(f0, var,1)
    p = np.poly1d(z)
    ax.plot(f0, p(f0), "k-")
    ax.text(50, 37, f"均值={round(avr, 2)}, Cv = {round(Cv,2)}", fontsize=18)
    # plt.show()
    # save fig
    fig.savefig(out_path + r'\JH_TEMmax.png', dpi=300)

3.1 计算特定返回周期的返回水平

out_path = r'I:\ObjectRS\软著_绘姐\SC2_ReturnPeriod'
data = pd.read_csv(r'I:\ObjectRS\软著_绘姐\SC2_ReturnPeriod\TJ2st_TEM_WIN_WO_snow.csv')
# data为ndarray格式

Years = pd.DataFrame([10, 20, 30, 50, 80, 100])
Return = Years
data_f = data
for i in range(1, 13):
    print(i)
    var = data.iloc[:, i].dropna(axis=0)
    bd = pd.DataFrame(return_periods(var))
    Return = pd.concat([Return, bd], axis=1)
Return.to_csv('I:\ObjectRS\软著_绘姐\SC2_ReturnPeriod\Return_TEM_WIN_snow_P.csv')

上述代码,思路非常清晰,就是计算各个列标签(不同标签指示不同观测值例如温度、降水等)下各个返回周期的返回水平(或者说在1/返回周期这个超越概率下的GEV分布值,例如返回周期是10,那么将得到有10%的超越概率给定测量值会超越这个极值水平)。

输出结果如下:

在这里插入图片描述

3.2 计算变异系数、均值以及绘制气温和超越概率关系图

var = data.iloc[:, 1].dropna(axis=0)
sigma = np.std(var)
avr = np.mean(var)
Cv = sigma / avr
# f0 = GEV(var)
f0 = GEV_Gumbel(var)
fig, ax = plt.subplots(figsize=(8, 8))
ax.scatter(f0, var)
# add a grid(only horizontal lines)
# ax.grid(axis='y', alpha=0.8, linestyle='--')
ax.grid(alpha=0.8, linestyle='--')
# # add scale
ax.axis([0,100,28,38])
ax.set_xticks(range(0, 110, 10))
ax.set_yticks(range(28, 39, 1)) #useless!
ax.tick_params(labelsize=18)
ax.set_xlabel('P频率(%)', fontsize=18)
ax.set_ylabel('气温(℃)', fontsize=18)
z = np.polyfit(f0, var,1)
p = np.poly1d(z)
ax.plot(f0, p(f0), "k-")
ax.text(50, 37, f"均值={round(avr, 2)}, Cv = {round(Cv,2)}", fontsize=18)
# plt.show()
# save fig
fig.savefig(out_path + r'\JH_TEMmax.png', dpi=300)

这部分代码就是计算个均值、然后变异系数(标准差/均值,表示单列数据相对于平均值的差异程度,即数据的离散程度),接着计算各个数据点的超越概率即发生的概率与该数据点的散点图,并进行线性拟合。

输出结果如下:

在这里插入图片描述

  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1.版本:matlab2014/2019a/2021a,内含运行结果,不会运行可私信 2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 3.内容:标题所示,对于介绍可点击主页搜索博客 4.适合人群:本科,硕士等教研学习使用 5.博客介绍:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可si信 %% 开发者:Matlab科研助手 %% 更多咨询关注天天Matlab微信公众号 ### 团队长期从事下列领域算法的研究和改进: ### 1 智能优化算法及应用 **1.1 改进智能优化算法方面(单目标和多目标)** **1.2 生产调度方面** 1.2.1 装配线调度研究 1.2.2 车间调度研究 1.2.3 生产线平衡研究 1.2.4 水库梯度调度研究 **1.3 路径规划方面** 1.3.1 旅行商问题研究(TSP、TSPTW) 1.3.2 各类车辆路径规划问题研究(vrp、VRPTW、CVRP) 1.3.3 机器人路径规划问题研究 1.3.4 无人机三维路径规划问题研究 1.3.5 多式联运问题研究 1.3.6 无人机结合车辆路径配送 **1.4 三维装箱求解** **1.5 物流选址研究** 1.5.1 背包问题 1.5.2 物流选址 1.5.4 货位优化 ##### 1.6 电力系统优化研究 1.6.1 微电网优化 1.6.2 配电网系统优化 1.6.3 配电网重构 1.6.4 有序充电 1.6.5 储能双层优化调度 1.6.6 储能优化配置 ### 2 神经网络回归预测、时序预测、分类清单 **2.1 bp预测和分类** **2.2 lssvm预测和分类** **2.3 svm预测和分类** **2.4 cnn预测和分类** ##### 2.5 ELM预测和分类 ##### 2.6 KELM预测和分类 **2.7 ELMAN预测和分类** ##### 2.8 LSTM预测和分类 **2.9 RBF预测和分类** ##### 2.10 DBN预测和分类 ##### 2.11 FNN预测 ##### 2.12 DELM预测和分类 ##### 2.13 BIlstm预测和分类 ##### 2.14 宽度学习预测和分类 ##### 2.15 模糊小波神经网络预测和分类 ##### 2.16 GRU预测和分类 ### 3 图像处理算法 **3.1 图像识别** 3.1.1 车牌、交通标志识别(新能源、国内外、复杂环境下车牌) 3.1.2 发票、身份证、银行卡识别 3.1.3 人脸类别和表情识别 3.1.4 打靶识别 3.1.5 字符识别(字母、数字、手写体、汉字、验证码) 3.1.6 病灶识别 3.1.7 花朵、药材、水果蔬菜识别 3.1.8 指纹、手势、虹膜识别 3.1.9 路面状态和裂缝识别 3.1.10 行为识别 3.1.11 万用表和表盘识别 3.1.12 人民币识别 3.1.13 答题卡识别 **3.2 图像分割** **3.3 图像检测** 3.3.1 显著性检测 3.3.2 缺陷检测 3.3.3 疲劳检测 3.3.4 病害检测 3.3.5 火灾检测 3.3.6 行人检测 3.3.7 水果分级 **3.4 图像隐藏** **3.5 图像去噪** **3.6 图像融合** **3.7 图像配准** **3.8 图像增强** **3.9 图像压缩** ##### 3.10 图像重建 ### 4 信号处理算法 **4.1 信号识别** **4.2 信号检测** **4.3 信号嵌入和提取** **4.4 信号去噪** ##### 4.5 故障诊断 ##### 4.6 脑电信号 ##### 4.7 心电信号 ##### 4.8 肌电信号 ### 5 元胞自动机仿真 **5.1 模拟交通流** **5.2 模拟人群疏散** **5.3 模拟病毒扩散** **5.4 模拟晶体生长** ### 6 无线传感器网络 ##### 6.1 无线传感器定位(Dv-Hop定位优化、RSSI定位优化) ##### 6.2 无线传感器覆盖优化 ##### 6.3 无线传感器通信及优化(Leach协议优化) ##### 6.4 无人机通信中继优化(组播优化)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炒茄子

不装逼我浑身难受aaa

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值