gma 1.x 气候气象指数计算源代码(分享)

news2024/11/23 15:39:19

本模块的主要内建子模块如下:

如何获得完整代码: 回复博主 或者 留言/私信 。

注意:本代码完全开源,可随意修改使用。 但如果您的成果使用或参考了本段代码,给予一定的引用说明(非强制),包括但不限于:

  • 1.作者:洛
  • 2.网站:gma.luosgeo.com
  • 3.PyPI:https://pypi.org/project/gma/
  • 3.GitHub:https://github.com/LiChongrui

其中:

clindex:气候指标计算函数
cmana:气候诊断函数
et0:蒸散计算函数
static:气候常量
utils:通用工具

示例代:1:

from ..core.arraypro import *
from .utils import *

#################################### 累积概率计算
def GammaCP(Data, Axis):
    '''gamma 分布累积概率'''
    if np.nanmin(Data) < 0:
        Data = Data + np.abs(np.nanmin(Data)) * 2    
        # Data = Data + 1000

    PF = ParameterFitting(Data, Axis = Axis)
    Data = PF.Data
    Axis = PF.Axis

    # 计算 0 值概率并填充 0 值 为 NaN
    Zeros = (Data == 0).sum(axis = Axis, keepdims = True)
    ProbabilitiesOfZero = Zeros / Data.shape[Axis]
    Data[Data == 0] = np.nan

    Alphas, Betas = ParameterFitting(Data, Axis = Axis).MLE()
    # 使用gamma CDF 查找 gamma 概率值
    GammaProbabilities = stats.gamma.cdf(Data, a = Alphas, scale = Betas)
    
    Probabilities = ProbabilitiesOfZero + (1 - ProbabilitiesOfZero) * GammaProbabilities
    
    return Probabilities 

def LogLogisticCP(Data, Axis):
    '''Log-Logistic 分布累积概率'''
    PF = ParameterFitting(Data, Axis)
    Alpha, Beta, Gamma1 = PF.LMoment()
     
    Probabilities = 1 / (1 + (Alpha / (PF.Data - Gamma1)) ** Beta)
    
    # 由于 scipy 对 non 值处理过于简单,这里不使用 scipy 的函数
    # Probabilities = stats.fisk.cdf(PF.Data, Beta, loc = Gamma1, scale = Alpha)

    return Probabilities

def Pearson3CP(Data, Axis):
    '''pearson III 分布累积概率'''
    if np.nanmin(Data) < 0:
        Data = Data + np.abs(np.nanmin(Data)) * 2    

    PF = ParameterFitting(Data, Axis)
    Data = PF.Data
    Axis = PF.Axis  

    Loc, Scale, Skew = PF.LMoment2()

    Alpha = 4.0 / (Skew ** 2)
    MINPossible = Loc - ((Alpha * Scale * Skew) / 2.0)
    
    Zeros = (Data == 0).sum(axis = Axis, keepdims = True)
    ProbabilitiesOfZero = Zeros / Data.shape[Axis]

    Probabilities = stats.pearson3.cdf(Data, Skew, Loc, Scale)

    Probabilities[(Data < 0.0005) & (ProbabilitiesOfZero > 0.0)] = 0.0
    Probabilities[(Data < 0.0005) & (ProbabilitiesOfZero <= 0.0)] = 0.0005

    Probabilities[(Data <= MINPossible) & (Skew >= 0)] = 0.0005
    Probabilities[(Data >= MINPossible) & (Skew < 0)] = 0.9995

    Probabilities = ProbabilitiesOfZero + (1.0 - ProbabilitiesOfZero) * Probabilities

    return Probabilities

def _ReshapeAndExtend(Data, Axis, Periodicity):
    '''更改输入数据维度为 (Axis / Periodicity, Periodicity, N),并补充末尾缺失数据'''
    # 交换设置轴到 0 
    if Data.ndim > 1:
        Data = np.swapaxes(Data, 0, Axis)
        S = Data.shape
        S0, S1 = S[0], np.prod(S[1:], dtype = int)
        Data = Data.reshape((S0, S1))
    else:
        Data = np.expand_dims(Data, -1)
    
    # 填充不足 Data.shape[0] / Periodicity
    B = Data.shape[0] % Periodicity
    PW = 0 if B == 0 else Periodicity - B
    
    Data = np.pad(Data, ((0, PW), (0,0)), mode = "constant", constant_values = np.nan)
    
    # 更改为目标维度(3维)
    PeriodicityTimes = Data.shape[0] // Periodicity 
    
    return Data.reshape(PeriodicityTimes, Periodicity, Data.shape[1])

def _RestoreReshapeAndExtend(Data, Axis, Shape):
    '''对 _ReshapeAndExtend 修改的维度和数据进行还原'''
    # 还原为原始维度(2维)
    Data = Data.reshape(np.prod(Data.shape[:2]), *Data.shape[2:])

    # 去除尾部填充值
    Data = Data[:Shape[Axis]]

    # 还原到初始状态
    SHP = list(Shape)
    SHP.pop(Axis)
    SHP = [Shape[Axis]] + SHP

    Data = Data.reshape(SHP)
    Data = np.swapaxes(Data, Axis, 0)
    
    return Data

############### 不同的计算方式
def _Fit(WBInScale, Periodicity, Distribution):
    '''计算标准化指数'''
    # 1.计算累积概率
    Probabilities = eval(f'{Distribution}CP')(WBInScale, 0)
    if Periodicity == 1:
        Probabilities = np.expand_dims(Probabilities, 1)
        
    # 2.生成结果
    OutInScale = stats.norm.ppf(Probabilities)
    return OutInScale

def _API(WBInScale, Axis):
    '''计算距平指数'''
    # 1.计算平均值或趋势值
    Mean = np.nanmean(WBInScale, axis = Axis, dtype = np.float64, keepdims = True)
    
    # 4.生成结果
    OutInScale = (WBInScale - Mean) / Mean
    
    return OutInScale

############### 计算结果
def _Compute(Data, Axis, Scale, Periodicity, Distribution):
    '''自动计算'''   
    Periodicity = ValueType(Periodicity, 'pint')
    
    # 0.数据准备
    DP = DataPreparation(Data, Axis) 
    Data = DP.Data
    SHP = Data.shape
    Axis = DP.Axis
    
    # 1.计算尺度
    WBInScale = DP.SumScale(Scale)
    if not (SHP[Axis] > Periodicity) and (SHP[Axis] > Scale):
        return np.full(WBInScale.shape, np.nan)

    # 2.更改输入数据维度为 (Axis / Periodicity, Periodicity, N)
    WBInScale = _ReshapeAndExtend(WBInScale, Axis, Periodicity)

    # 3.生成结果
    if Distribution == 'API':
        OutInScale = _API(WBInScale, Axis)
    else:
        OutInScale = _Fit(WBInScale, Periodicity, Distribution)

    # 4.还原数据
    OutInScale = _RestoreReshapeAndExtend(OutInScale, Axis, SHP)    
    
    return OutInScale

示例代码2:

#################################### SPEI
def SPEI(PRE, PET, Axis = None, Scale = 1, Periodicity = 12, Distribution = 'LogLogistic'):
    '''计算SPEI'''
    Distribution = GetDistribution(Distribution)
    PRE, PET = INITArray(PRE, PET)

    WB = np.subtract(PRE, PET, dtype = PRE.dtype)
    
    SPEIInScale = _Compute(WB, Axis, Scale, Periodicity, Distribution)
    
    return SPEIInScale

#################################### SPI
def SPI(PRE, Axis = None, Scale = 1, Periodicity = 12, Distribution = 'Gamma'):
    '''计算 SPI'''
    Distribution = GetDistribution(Distribution)
    SPIInScale = _Compute(PRE, Axis, Scale, Periodicity, Distribution)
    
    return SPIInScale

#################################### PAP
def PAP(PRE, Axis = None, Scale = 1, Periodicity = 12):
    '''降水距平百分率'''
    PAPInScale = _Compute(PRE, Axis, Scale, Periodicity, 'API') 
    
    return PAPInScale

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1178713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用exec命令进入docker容器时的报错问题

进入Docker 容器 docker exec [CONTAINER ID] bin/bash报错问题 一、详细报错信息 执行docker exec -it [containerId] /bin/bash报错&#xff1a; OCI runtime exec failed: exec failed: unable to start container process: exec: "/bin/bash": stat /bin/ba…

安防视频监控平台EasyCVR调用接口出现报错与401提示,该如何解决?

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

Bash 4关联数组:错误“声明:-A:无效选项”

Bash 4 associative arrays: error “declare: -A: invalid option” 就是bash版本太低 1.先确定现在的版本 bash -version 我的就是版本太低 升级新版本bash4.2 即可 升级步骤 1.下载bash-4.2wget http://ftp.gnu.org/gnu/bash/bash-4.2.tar.gz 2. 下载完成解压 tar -zxvf…

功率放大器主要特点是什么

功率放大器是一种常见的电子设备&#xff0c;用于放大输入信号的电压。它在各种领域中都有广泛的应用&#xff0c;包括音频放大、通信系统、仪器仪表等。功率放大器具有以下主要特点&#xff1a; 功率放大器具有高放大增益。其主要功能是将输入信号的电压放大到所需的输出电压水…

2023/11/6 JAVA学习

处理编译异常的两种方法 第一种 第二种 问题比较容易犯,编译时异常

MIPI-CSI-2 RAW10笔记

好文&#xff1a; 【精选】摄像头的MIPI接口、DVP接口和CSI接口-CSDN博客【精选】摄像头的MIPI接口、DVP接口和CSI接口-CSDN博客 (56 封私信 / 24 条消息) 显示器的 VGA、HDMI、DVI 和 DisplayPort 接口有什么区别&#xff1f; - 知乎 (zhihu.com) 嵌入式工程师必备&#x…

输入系统应用编程

1. 什么是输入系统 ⚫先来了解什么是输入设备&#xff1f; 常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等等, 用户通过这些输入设备与 Linux 系统进行数据交换。 ⚫ 什么是输入系统&#xff1f; 输入设备种类繁多&#xff0c;能否统一它们的接口&#xff1f;既在…

10个超好用的Python实用库推荐~

文章目录 前言1.Dash2. Pillow3. Colorama4. JmesPath5. Simplejson6. Emoji7. 进度条&#xff1a;progress和tqdm8. Homeassistant9. Python-dateutil10. Pygame关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包…

Scientific colour maps颜色包--共35种--全平台可用

Scientific colour maps颜色包–共35种–全平台可用 往期推荐&#xff1a; SciCoMap颜色包_共180种–全平台可用 海洋专用cmocean颜色包_共22种–全平台可用 Python语言_matplotlib包_共80种–全平台可用 Python语言_single_color_共140种–全平台可用 R语言_RColorBrewer包–…

C++ day3作业

1> 思维导图 2> 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void s…

[Linux] GRUB引导 学习笔记(一)

目录 概念 2.1 BIOS 2.2 UEFI 2.3 MBR与GPT 2.3.1 MBR 2.3.2 GPT 2.3.3 总结 2.4 GRUB GRUB2和GRUB Legacy区别 进入GRUB命令行 命令 GRUB工具命令 GRUB2配置 1.主要配置文件 2. 通过/etc/default/grub文件生成grub.cfg 定制GRUB的步骤 概念 BIOS、UEFI、MBR、G…

ASP.NETCore6开启文件服务允许通过url访问附件(图片)

需求背景 最近在做一个工作台的文件上传下载功能&#xff0c;主要想实现上传图片之后&#xff0c;可以通过url直接访问。由于url直接访问文件不安全&#xff0c;所以需要手动开启文件服务。 配置 文件路径如下&#xff0c;其中Files是存放文件的目录&#xff1a; 那么&…

Linux友人帐之网络编程基础www服务器

一、概述 1.1www基础 WWW&#xff08;World Wide Web&#xff0c;万维网&#xff09;是一种分布式、全球性的信息服务系统&#xff0c;是集成Internet、Web浏览器和Web服务器等技术而形成的一个庞大的、涉及全球的信息网络。 用户在浏览器中输入www.cqvie.edu.cn访问该网站主页…

OpenGL_Learn07(变换)

1. 向量 向量有一个方向和一个大小。如果一个向量有2个维度&#xff0c;它表示一个平面的方向(想象一下2D的图像)&#xff0c;当它有3个维度的时候它可以表达一个3D世界的方向。 可以把这些2D向量当做z坐标为0的3D向量。 2. 向量内积和外积 向量的点乘&#xff08;内积&#x…

【数据结构】顺序表和链表

顺序表和链表 1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0c;也就说是连…

火山引擎云原生存储加速实践

在火山引擎相关的业务中绝大部分的机器学习和数据湖的算力都运行在云原生 K8s 平台上。云原生架构下存算分离和弹性伸缩的计算场景&#xff0c;极大的推动了存储加速这个领域的发展&#xff0c;目前业界也衍生出了多种存储加速服务。但是面对计算和客户场景的多样性&#xff0c…

MYSQL:主从复制简述

&#xff08;图片来自于马士兵教育&#xff09; 从节点的I/O线程会请求主节点的Binlog&#xff0c;并且将得到的Binlog写入到本地relay_log&#xff08;中继日志&#xff09;中&#xff0c;SQL线程会读取realy_log中的日志文件&#xff0c;并且解析成SQL逐行执行。 主库会生成…

小程序制作(超详解!!!)第十三节 随机数求和

1.题目 设计一个小程序&#xff0c;运行后产生一列100以内的随机数(保留小数点后2位) &#xff0c;并显示这些随机数的和;当点击按钮时&#xff0c;产生一列新的随机数&#xff0c;并显示这些随机数的和。 2.index.wxml <view class"box"> <view class&q…

千兆光模块和万兆光模块在数据中心中的应用

在现代的数据中心中&#xff0c;网络速度和带宽需求越来越高&#xff0c;对于数据传输的速度和容量提出了更高的要求。千兆光模块和万兆光模块作为常见的光模块类型&#xff0c;在数据中心中发挥着重要的作用。那么&#xff0c;千兆光模块和万兆光模块的特性、应用场合以及优劣…

基于8086简易洗衣机控制仿真设计

**单片机设计介绍&#xff0c;基于8086简易洗衣机控制仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于 8086 的简易洗衣机控制仿真设计主要包括以下几个方面&#xff1a; 硬件平台设计&#xff1a;需要确定微处理器、…