diff --git a/.gitignore b/.gitignore index f33be3d..75d71db 100644 --- a/.gitignore +++ b/.gitignore @@ -130,4 +130,5 @@ dmypy.json .DS_Store .vscode -*.ipynb \ No newline at end of file +*.ipynb +_build \ No newline at end of file diff --git a/README.md b/README.md index 3c54130..d1da1ef 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,16 @@ [![Pytest](https://github.com/caiyunapp/cyeva/actions/workflows/pytest.yml/badge.svg)](https://github.com/caiyunapp/cyeva/actions/workflows/pytest.yml) [![Pypi publish](https://github.com/caiyunapp/cyeva/actions/workflows/pypi-publish.yml/badge.svg)](https://github.com/caiyunapp/cyeva/actions/workflows/pypi-publish.yml) +[![Anaconda.org](https://anaconda.org/conda-forge/cyeva/badges/version.svg)](https://anaconda.org/conda-forge/cyeva) +[![Downloads](https://anaconda.org/conda-forge/cyeva/badges/downloads.svg)](https://anaconda.org/conda-forge/cyeva) +[![Anaconda-Server Badge](https://anaconda.org/conda-forge/cyeva/badges/platforms.svg)](https://anaconda.org/conda-forge/cyeva) +[![Anaconda-Server Badge](https://anaconda.org/conda-forge/cyeva/badges/latest_release_date.svg)](https://anaconda.org/conda-forge/cyeva) [![Pypi](https://badge.fury.io/py/cyeva.svg)](https://badge.fury.io/py/cyeva) [![Documentation Status](https://readthedocs.org/projects/cyeva/badge/?version=latest)](https://cyeva.readthedocs.io/zh_CN/latest/?badge=latest) -[![Line statistic](https://tokei.rs/b1/github/caiyunapp/cyeva?category=lines)](https://github.com/caiyunapp/cyeva) [![Download statistic](https://pepy.tech/badge/cyeva)](https://pepy.tech/project/cyeva) [![codecov](https://codecov.io/gh/caiyunapp/cyeva/branch/main/graph/badge.svg?token=344FXDKAYD)](https://codecov.io/gh/caiyunapp/cyeva) [![style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) +[![Anaconda-Server Badge](https://anaconda.org/conda-forge/cyeva/badges/license.svg)](https://anaconda.org/conda-forge/cyeva) cyeva 是一个由彩云科技天气团队开发的用于对气象要素确定性预报准确率进行快速评测的 Python 开源工具库。 diff --git a/cyeva/core/statistic.py b/cyeva/core/statistic.py index 1ef5d6a..9605433 100644 --- a/cyeva/core/statistic.py +++ b/cyeva/core/statistic.py @@ -381,9 +381,9 @@ def calc_linregress( Returns: tuple: Aguments of linear regression as follow: - slope, intercept, r_value, p_value, std_err + slope, intercept, r_value, p_value """ - linreg_result = stats.linregress(forecast, observation) + linreg_result = stats.linregress(forecast, observation)[:4] return tuple(round(p, 4) for p in linreg_result) diff --git a/cyeva/core/wind.py b/cyeva/core/wind.py index efca850..6b405bd 100644 --- a/cyeva/core/wind.py +++ b/cyeva/core/wind.py @@ -271,6 +271,7 @@ def filter_wind_scales( class WindComparison(Comparison): + # FIXME: 需要加最小扇形逻辑 def __init__( self, obs_spd: Union[np.ndarray, list] = None, diff --git a/docs/source/content/api-ref.rst b/docs/source/content/api-ref.rst index d8e40a0..b33b926 100644 --- a/docs/source/content/api-ref.rst +++ b/docs/source/content/api-ref.rst @@ -1,2 +1,260 @@ +########### API参考 -========== \ No newline at end of file +########### + +cyeva.base +============ +base 模块主要存放基础对象相关的类和函数。 + +.. py:class:: Comparison(observation, forecast) + :module: cyeva.base + + 对比对象, 即预设预报和观测的两个等长数组, 该对象初始化以后可以进行其支持的相关指标计算。 + + :param np.ndarray or list observation: + 观测数组。 + + :param np.ndarray or list forecast: + 预报数组。 + + .. py:method:: calc_rmse(observation=None,forecast=None,*args,**kwargs) + + 计算 :ref:`rmse` + + :param np.ndarray or list observation: + 观测数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :param np.ndarray or list forecast: + 预报数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :return: + RMSE 均方根误差值 + + :rtype: float + + .. py:method:: calc_mae(observation=None,forecast=None,*args,**kwargs) + + 计算 :ref:`mae` + + :param np.ndarray or list observation: + 观测数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :param np.ndarray or list forecast: + 预报数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :return: + MAE 平均绝对误差 + + :rtype: float + + .. py:method:: calc_chi_square(observation=None,forecast=None,*args,**kwargs) + + 计算 :ref:`chi_square` + + :param np.ndarray or list observation: + 观测数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :param np.ndarray or list forecast: + 预报数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :return: + χ2 卡方 + + :rtype: float + + .. py:method:: calc_rss(observation=None,forecast=None,*args,**kwargs) + + 计算 :ref:`rss` + + :param np.ndarray or list observation: + 观测数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :param np.ndarray or list forecast: + 预报数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :return: + RSS 剩余平方和 + + :rtype: float + + .. py:method:: calc_linregress_args(observation=None,forecast=None,*args,**kwargs) + + 计算 :ref:`correlation coefficient` + + :param np.ndarray or list observation: + 观测数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :param np.ndarray or list forecast: + 预报数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :return: + (斜率, 截距, 相关系数, P值, 标准差) + + :rtype: tuple + + .. py:method:: calc_bias(observation=None,forecast=None,threshold=0,*args,**kwargs) + + 计算 :ref:`bias` + + :param np.ndarray or list observation: + 观测数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :param np.ndarray or list forecast: + 预报数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :param Number threshold: + 二值化阈值, 高于该值的成员被标记为 True, 否则标记为 False。默认为 0。 + + :return: + BIAS 评分 + + :rtype: float + + .. py:method:: calc_binary_accuracy_ratio(observation=None,forecast=None,threshold=0,*args,**kwargs) + + 计算 :ref:`binary_accuracy` + + :param np.ndarray or list observation: + 观测数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :param np.ndarray or list forecast: + 预报数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :param Number threshold: + 二值化阈值, 高于该值的成员被标记为 True, 否则标记为 False。默认为 0。 + + :return: + 二值化准确率 + + :rtype: float + + .. py:method:: calc_diff_accuracy_ratio(observation=None,forecast=None,limit=1,*args,**kwargs) + + 计算 :ref:`err_accuracy` + + :param np.ndarray or list observation: + 观测数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :param np.ndarray or list forecast: + 预报数组, 当为 None 时, 从实例化的对象中获取。默认为 None。 + + :param Number limit: + 预报与观测之间的差值限制, 二者的差值的绝对值低于该值则被认为是预报正确, 否则认为预报错误。默认为 1。 + + :return: + 误差准确率 + + :rtype: float + + +cyeva.binarize +================= +binarize 模块主要存放二值化相关的函数。 + +.. py:function:: threshold_binarize(observation, forecast, threshold = 0,compare= ">=") + :module: cyeva.binarize + + 基于阈值对观测和预报数组进行二值化 + + :param np.ndarray or list observation: + 观测数组 + + :param np.ndarray or list forecast: + 预报数组 + + :param Number threshold: + 二值化阈值, 高于该值的成员被标记为 True, 否则标记为 False。默认为 0。 + + :param str compare: + 过滤方式, 结合阈值满足此种方式的成员将被标记为 True, 否则为 False。默认为 ``">="`` + + :return: + 二值化后由 True 和 False 组成的观测和预报数组 + :rtype: + tuple + +cyeva.statistic +================= +statistic 模块主要存放统计相关的函数。 + +.. py:function:: calc_binary_quadrant_values(observation, forecast) + :module: cyeva.statistic + + 计算二值化象限值, 象限值包括:命中数(hits), 漏报数(misses), 空报数(false_alarms), 正确否定数(correct_rejects) + + :param np.ndarray or list observation: + 由 True 和 False 组成的二值化观测数组 + + :param np.ndarray or list forecast: + 由 True 和 False 组成的二值化预报数组 + + :return: + 二值化象限值, 内容为: (hits, misses, false_alarms, correct_rejects, total) + :rtype: + tuple + + +.. py:function:: calc_binary_accuracy_ratio(observation, forecast) + :module: cyeva.statistic + + 计算 :ref:`binary_accuracy` + + :param np.ndarray or list observation: + 由 True 和 False 组成的二值化观测数组 + + :param np.ndarray or list forecast: + 由 True 和 False 组成的二值化预报数组 + + :return: + 二值化准确率,单位 % + :rtype: + float + + +.. py:function:: calc_hit_ratio(observation, forecast) + :module: cyeva.statistic + + 计算 :ref:`hit_ratio` + + :param np.ndarray or list observation: + 由 True 和 False 组成的二值化观测数组 + + :param np.ndarray or list forecast: + 由 True 和 False 组成的二值化预报数组 + + :return: + 命中率,单位 % + :rtype: + float + +.. py:function:: calc_miss_ratio(observation, forecast) + :module: cyeva.statistic + + 计算 :ref:`miss_ratio` + + :param np.ndarray or list observation: + 由 True 和 False 组成的二值化观测数组 + + :param np.ndarray or list forecast: + 由 True 和 False 组成的二值化预报数组 + + :return: + 漏报率,单位 % + :rtype: + float + +.. py:function:: calc_false_alarm_ratio(observation, forecast) + :module: cyeva.statistic + + 计算 :ref:`false_alarm_ratio` + + :param np.ndarray or list observation: + 由 True 和 False 组成的二值化观测数组 + + :param np.ndarray or list forecast: + 由 True 和 False 组成的二值化预报数组 + + :return: + 空报率,单位 % + :rtype: + float \ No newline at end of file diff --git a/docs/source/content/appendix.rst b/docs/source/content/appendix.rst index 9202c44..e8d466f 100644 --- a/docs/source/content/appendix.rst +++ b/docs/source/content/appendix.rst @@ -24,6 +24,12 @@ | 6 | 特大暴雨 | | >=70.0 | >=140.0 | >=250.0 | +----------+----------+---------------+---------------+-----------------+-----------------+ +延伸阅读: :ref:`rain_level_rule` + +参考资料: + * `《中华人民共和国气象行业标准——降水量等级 GB/T 28592——2012》 `_ + * `《中华人民共和国气象行业标准——降雨过程等级 QX/T 489——2019》 `_ + .. _accum_precip_table: 累积降水等级表 @@ -47,47 +53,156 @@ | 6 | 特大暴雨 | | >=70.0 | >=140.0 | >=250.0 | +----------+----------+---------------+---------------+-----------------+-----------------+ +延伸阅读: :ref:`rain_level_rule` + .. _wind_scale_table: 风力等级表 ------------- -+----------+---------------+ -| 风力/级 | 风速 (m/s) | -+==========+===============+ -| 0 | 0.0 ~ 0.2 | -+----------+---------------+ -| 1 | 0.3 ~ 1.5 | -+----------+---------------+ -| 2 | 1.6 ~ 3.3 | -+----------+---------------+ -| 3 | 3.4 ~ 5.4 | -+----------+---------------+ -| 4 | 5.5 ~ 7.9 | -+----------+---------------+ -| 5 | 8.0 ~ 10.7 | -+----------+---------------+ -| 6 | 10.8 ~ 13.8 | -+----------+---------------+ -| 7 | 13.9 ~ 17.1 | -+----------+---------------+ -| 8 | 17.2 ~ 20.7 | -+----------+---------------+ -| 9 | 20.8 ~ 24.4 | -+----------+---------------+ -| 10 | 24.5 ~ 28.4 | -+----------+---------------+ -| 11 | 28.5 ~ 32.6 | -+----------+---------------+ -| 12 | 32.7 ~ 36.9 | -+----------+---------------+ -| 13 | 37.0 ~ 41.4 | -+----------+---------------+ -| 14 | 41.5 ~ 46.1 | -+----------+---------------+ -| 15 | 46.2 ~ 50.9 | -+----------+---------------+ -| 16 | 51.0 ~ 56.0 | -+----------+---------------+ -| 17 | >= 56.1 | -+----------+---------------+ ++----------+---------------+----------+---------------+ +| 风力/级 | 风速 (m/s) | 风力/级 | 风速 (m/s) | ++==========+===============+==========+===============+ +| 0 | 0.0 ~ 0.2 | 9 | 20.8 ~ 24.4 | ++----------+---------------+----------+---------------+ +| 1 | 0.3 ~ 1.5 | 10 | 24.5 ~ 28.4 | ++----------+---------------+----------+---------------+ +| 2 | 1.6 ~ 3.3 | 11 | 28.5 ~ 32.6 | ++----------+---------------+----------+---------------+ +| 3 | 3.4 ~ 5.4 | 12 | 32.7 ~ 36.9 | ++----------+---------------+----------+---------------+ +| 4 | 5.5 ~ 7.9 | 13 | 37.0 ~ 41.4 | ++----------+---------------+----------+---------------+ +| 5 | 8.0 ~ 10.7 | 14 | 41.5 ~ 46.1 | ++----------+---------------+----------+---------------+ +| 6 | 10.8 ~ 13.8 | 15 | 46.2 ~ 50.9 | ++----------+---------------+----------+---------------+ +| 7 | 13.9 ~ 17.1 | 16 | 51.0 ~ 56.0 | ++----------+---------------+----------+---------------+ +| 8 | 17.2 ~ 20.7 | 17 | >= 56.1 | ++----------+---------------+----------+---------------+ + +参考资料: + * `《中华人民共和国国家标准:风力等级 GB/T 28591-2012》 `_ + +.. _wind_scale_score_table: + +风速评分表 +------------- + ++------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | | 预报风级 | ++------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | ++------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| 观测风级 | 0 | 1 | 0.6 | 0.4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 1 | 0.6 | 1 | 0.6 | 0.4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 2 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 3 | 0 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 4 | 0 | 0 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 5 | 0 | 0 | 0 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 6 | 0 | 0 | 0 | 0 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 7 | 0 | 0 | 0 | 0 | 0 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 8 | 0 | 0 | 0 | 0 | 0 | 0 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | 0 | 0 | 0 | 0 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | 0 | 0 | 0 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 11 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | 0 | 0 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 12 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | 0 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 13 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | 0 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 14 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | 0 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.4 | 0.6 | 1 | 0.6 | 0.4 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 16 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.4 | 0.6 | 1 | 0.6 | +| +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| | 17 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.4 | 0.6 | 1 | ++------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ + +.. _wind_direction_table: + +风向方位符号表 +------------------ + +8 方位 +^^^^^^^^^^^ + ++----------+----------+------------------+-----------------+ +| 风向方位 | 风向符号 | 风向记录度数 | 风向角度范围 | ++==========+==========+==================+=================+ +| 北 | N | 360.0 | 348.76 ~ 11.25 | ++----------+----------+------------------+-----------------+ +| 东北 | NE | 45.0 | 11.26 ~ 78.75 | ++----------+----------+------------------+-----------------+ +| 东 | E | 90.0 | 78.76 ~ 101.25 | ++----------+----------+------------------+-----------------+ +| 东南 | SE | 135.0 | 101.26 ~ 168.75 | ++----------+----------+------------------+-----------------+ +| 南 | S | 180.0 | 168.76 ~ 191.25 | ++----------+----------+------------------+-----------------+ +| 西南 | SW | 225.0 | 191.26 ~ 258.75 | ++----------+----------+------------------+-----------------+ +| 西 | W | 270.0 | 258.76 ~ 281.25 | ++----------+----------+------------------+-----------------+ +| 西北 | NW | 315.0 | 281.26 ~ 348.75 | ++----------+----------+------------------+-----------------+ +| 静风 | C | 静风时,角度不定 | | ++----------+----------+------------------+-----------------+ + + +16 方位 +^^^^^^^^^^^ + ++----------+----------+--------------+-----------------+ +| 风向方位 | 风向符号 | 风向记录度数 | 风向角度范围 | ++==========+==========+==============+=================+ +| 北 | N | 360.0 | 348.76 ~ 11.25 | ++----------+----------+--------------+-----------------+ +| 北东北 | NNE | 22.5 | 11.26 ~ 33.75 | ++----------+----------+--------------+-----------------+ +| 东北 | NE | 45.0 | 33.76 ~ 56.25 | ++----------+----------+--------------+-----------------+ +| 东东北 | ENE | 67.5 | 56.26 ~ 78.75 | ++----------+----------+--------------+-----------------+ +| 东 | E | 90.0 | 78.76 ~ 101.25 | ++----------+----------+--------------+-----------------+ +| 东东南 | ESE | 112.5 | 101.26 ~ 123.75 | ++----------+----------+--------------+-----------------+ +| 东南 | SE | 135.0 | 123.76 ~ 146.25 | ++----------+----------+--------------+-----------------+ +| 南东南 | SSE | 157.5 | 146.26 ~ 168.75 | ++----------+----------+--------------+-----------------+ +| 南 | S | 180.0 | 168.76 ~ 191.25 | ++----------+----------+--------------+-----------------+ +| 南西南 | SSW | 202.5 | 191.26 ~ 213.75 | ++----------+----------+--------------+-----------------+ +| 西南 | SW | 225.0 | 213.76 ~ 236.25 | ++----------+----------+--------------+-----------------+ +| 西西南 | WSW | 247.5 | 236.26 ~ 258.75 | ++----------+----------+--------------+-----------------+ +| 西 | W | 270.0 | 258.76 ~ 281.25 | ++----------+----------+--------------+-----------------+ +| 西西北 | WNW | 292.5 | 281.26 ~ 303.75 | ++----------+----------+--------------+-----------------+ +| 西北 | NW | 315.0 | 303.76 ~ 326.25 | ++----------+----------+--------------+-----------------+ +| 北西北 | NNW | 337.7 | 326.26 ~ 348.75 | ++----------+----------+--------------+-----------------+ +| 静风 | C | 静风时,角度不定 | ++----------+----------+--------------+-----------------+ + +参考资料: + * `《中华人民共和国国家标准:地面气象观测规范 风向和风速 GB/T 35227-2017》 `_ \ No newline at end of file diff --git a/docs/source/content/indicator.rst b/docs/source/content/indicator.rst index 741c626..605221c 100644 --- a/docs/source/content/indicator.rst +++ b/docs/source/content/indicator.rst @@ -121,6 +121,8 @@ :math:`n`——总样本数量 +.. _rss: + 剩余平方和(RSS) ^^^^^^^^^^^^^^^^^^^^^ 剩余平方和是统计学术语,也称作残差平方和,是实际值与估计值之差的平方的总和,也就是误差项平方的总和,利用剩余平方和可以很好地表示剩余的总和。公式如下: @@ -137,14 +139,68 @@ :math:`F_{k}`——第 :math:`k` 个预报值。 +.. _correlation coefficient: + +线性回归参数 +^^^^^^^^^^^^^^^^^^^^ +线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。 + +斜率和截距 +"""""""""" +斜率表示直线的陡峭程度,截距表示直线与轴相交的位置。斜率和截距定义两个变量之间的线性关系,并可以用于估计变化的平均速度。斜率的量值越大,则直线越陡峭,且变化速度越大。通常,此关系可以由方程 :math:`y = ax + b` 表示,其中 :math:`b` 是截距,:math:`a` 是斜率。 + +皮尔逊相关系数 r +"""""""""""""""" +皮尔逊相关系数(Pearson correlation coefficient),是用于度量两个变量 x 和 y 之间的相关程度(线性相关),其值介于 -1 与 1 之间,公式如下: + +.. math:: + + r = \frac{\sum(F - \bar{F})(O - \bar{O})}{\sqrt{\sum(F-\bar{F})^2}\sqrt{\sum(O - \bar{O})^2}} + +式中: + +:math:`r`——皮尔逊相关系数。 + +:math:`O`——观测值。 + +:math:`\bar{O}`——观测平均值。 + +:math:`F`——预报值。 + +:math:`\bar{F}`——预报平均值。 + + +皮尔逊相关系数 r 的值在 -1 到 1 之间,若 r = 1,则为完美正相关,若 r = -1 则为完美负相关,若 r = 0 则完全不相关。 + +P值 +"""""""" +P值是t检验用于检测效果的一个衡量度,p值小于0.05就说明该变量前面的系数显著。 + + +.. _chi_square: 卡方(χ2) ^^^^^^^^^^^^^^^^^^^^^ +皮尔逊卡方检验是对分类数据的统计检验。它用于确定数据是否与预期的数据有显著差异。其公式如下: + +.. math:: + + \chi^2 = \sum \frac{(O - F)^2}{F} + +式中: + +:math:`\chi^2`——卡方值。 + +:math:`O`——观测值。 + +:math:`F`——预报值。 降水指标 ----------- +.. _rain_level_rule: + 降水分级规则 ^^^^^^^^^^^^^^^ 对于降水等级的划分,目前行业上有两个国家标准对12小时和24小时的等级判断阈值做了定义: @@ -226,6 +282,7 @@ 1小时降水未设置特大暴雨级别 +.. _acc_rain_level_rule: 累积降水分级规则 ^^^^^^^^^^^^^^^^^^ @@ -308,7 +365,7 @@ 晴雨命中率/空报率/漏报率 ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -对于晴雨来说,我们通常会计算命中率、空报率、漏报率等直观的指标来评估预报的准确性,在计算这些指标之前,我们需要先知道 **命中** 、 **空报** 、 **漏报** 和 **负正确** 的概念。 +对于晴雨来说,我们通常会计算命中率、空报率、漏报率等直观的指标来评估预报的准确性,在计算这些指标之前,我们需要先知道 **命中** 、 **空报** 、 **漏报** 和 **正确否定** 的概念。 +----------+----------------------------------------------------------+ | | 观测 | @@ -327,6 +384,8 @@ * **空报(false alarms)** 即为预报认为 *是* 而观测认为 *否* (例如预报下雨而观测无雨)的次数。 * **正确否定(correct negatives)** 即为预报认为 *否* 而观测认为 *否* (例如预报无雨且观测也无雨)的次数。 +.. _hit_ratio: + 命中率 """""""" 命中率是命中次数与观测为 *是* 事件次数的比值。公式如下: @@ -335,6 +394,7 @@ HR = \frac{hits}{hits + misses} \times 100\% +.. _false_alarm_ratio: 空报率 """""""" @@ -344,6 +404,7 @@ FAR = \frac{false\ alarms}{hits + false\ alarms} \times 100\% +.. _miss_ratio: 漏报率 """""""" @@ -354,38 +415,111 @@ MR = \frac{misses}{hits + misses} \times 100\% +.. _bias: + +晴雨BIAS评分 +^^^^^^^^^^^^^^ +倾向评分,是指测量预报事件频率与观测事件频率的比率。指示预报系统是否倾向于预报不足或预报过度事件。不测量预报与观测的对应程度,只测量相对频率。公式如下: + +.. math:: + + BIAS = \frac{hits + false\ alarms}{hits + misses} + + +BIAS评分在 0 到 ∞ 之间,BIAS > 1 时表示预报过度,BIAS < 1 时表示预报不足,BIAS = 1 时表示完美预报。 + +.. _ts: + 晴雨TS评分 ^^^^^^^^^^^^^^ +TS评分(Threat score)是一种衡量二值化预报与观测之间准确程度的指标,它可以视为将正确否定排除以后的准确率指标。TS评分只考虑预报的数量,对命中数量敏感,对漏报和空报施加处罚。对于晴雨这种二值化预报来说,TS 是一种普遍使用的评价指标。 + +TS 评分的计算也依赖于上述命中率/空报率/漏报率的表格,具体如下: + +.. math:: + + TS = \frac{hits}{hits + misses + false\ alarms} + +TS 评分的范围在 0 到 1 之间,数值越大则表示预报效果越好。 + +.. _ets: 晴雨ETS评分 ^^^^^^^^^^^^^^ +ETS 评分(Equitable threat score)是对 TS 评分的一种改进,它结合了降水随机概率以平衡由于气候区别而导致的评分不公平的情况(例如在降水较多的区域比降水稀少的区域更容易预报准确)。ETS 评分通常用于数值预报,因为它能够在对不同区域的评分中表现得更公证,它的公式如下: -晴雨BIAS评分 -^^^^^^^^^^^^^^^^ +.. math:: + + ETS = \frac{hits - hits_{random}}{hits + misses + false\ alarms - hits_{random}} + +式中: + +.. math:: + + hits_{random} = \frac{(hits + misses)(hits + false\ alarms)}{total} + +ETS 评分的范围在 -1/3 到 1 之间,数值越大则表示预报效果越好。 降水分级命中率/空报率/漏报率 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +降水分级命中率/空报率/漏报率与晴雨命中率/空报率/漏报率类似,只是在计算指标之前,需要先用降水分级的阈值对降水量进行二值化,将阈值限制之内的降水样本标记为 True,在阈值范围之外的样本设为 False,对于降水等级为 n 的降水事件,可以基于下表进行一系列指标的计算。 + ++----------+-------------------------------------------------------------------------------------------------------------------------------------+ +| | 观测 | ++==========+====================+================+======+=====================+================+====================+======+=====================+ +| 预报 | | :math:`雨级_0` | ... | :math:`雨级_{n-1}` | :math:`雨级_n` | :math:`雨级_{n+1}` | ... | :math:`雨级_{max}` | +| +--------------------+----------------+------+---------------------+----------------+--------------------+------+---------------------+ +| | :math:`雨级_0` | 正确否定 | ... | 正确否定 | **空报** | 正确否定 | ... | 正确否定 | +| +--------------------+----------------+------+---------------------+----------------+--------------------+------+---------------------+ +| | ... | 正确否定 | ... | 正确否定 | **空报** | 正确否定 | ... | 正确否定 | +| +--------------------+----------------+------+---------------------+----------------+--------------------+------+---------------------+ +| | :math:`雨级_{n-1}` | 正确否定 | ... | 正确否定 | **空报** | 正确否定 | ... | 正确否定 | +| +--------------------+----------------+------+---------------------+----------------+--------------------+------+---------------------+ +| | :math:`雨级_n` | **漏报** | ... | **漏报** | **命中** | **漏报** | ... | **漏报** | +| +--------------------+----------------+------+---------------------+----------------+--------------------+------+---------------------+ +| | :math:`雨级_{n+1}` | 正确否定 | ... | 正确否定 | **空报** | 正确否定 | ... | 正确否定 | +| +--------------------+----------------+------+---------------------+----------------+--------------------+------+---------------------+ +| | ... | 正确否定 | ... | 正确否定 | **空报** | 正确否定 | ... | 正确否定 | +| +--------------------+----------------+------+---------------------+----------------+--------------------+------+---------------------+ +| | :math:`雨级_{max}` | 正确否定 | ... | 正确否定 | **空报** | 正确否定 | ... | 正确否定 | ++----------+--------------------+----------------+------+---------------------+----------------+--------------------+------+---------------------+ + +* **命中(hits)** 即为观测和预报都落在同一个雨级的次数; +* **漏报(misses)** 即为预报未采纳的雨级被观测采纳的次数; +* **空报(false alarms)** 即为预报采纳的雨级未被观测采纳的次数。 +* **正确否定(correct negatives)** 即为预报和观测均为采纳的雨级的次数。 -降水分级TS评分 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. note:: -降水分级ETS评分 -^^^^^^^^^^^^^^^^^^^^ + 降水分级规则可以采用 :ref:`rain_level_rule` 和 :ref:`acc_rain_level_rule` 。 -降水分级BIAS评分 -^^^^^^^^^^^^^^^^^^^^^^ +命中率 +"""""""" +降水分级命中率基于降水分级的二值化逻辑后套用前述 :ref:`hit_ratio` 公式即可。 + +空报率 +"""""""" +降水分级空报率基于降水分级的二值化逻辑后套用前述 :ref:`false_alarm_ratio` 公式即可。 + +漏报率 +"""""""" +降水分级漏报率基于降水分级的二值化逻辑后套用前述 :ref:`miss_ratio` 公式即可。 -累积降水分级命中率/空报率/漏报率 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -累积降水分级TS评分 +降水分级TS评分 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +降水分级 TS 评分对单一等级降水的中间量套用 :ref:`ts` 公式即可。 + -累积降水分级ETS评分 +降水分级ETS评分 ^^^^^^^^^^^^^^^^^^^^ +降水分级 ETS 评分对单一等级降水的中间量套用 :ref:`ets` 公式即可。 -累积降水分级BIAS评分 + +降水分级BIAS评分 ^^^^^^^^^^^^^^^^^^^^^^ +降水分级 ETS 评分对单一等级降水的中间量套用 :ref:`ets` 公式即可。 + 风指标 -------- @@ -446,20 +580,54 @@ :math:`N_{s,k}` ——风力等级预报总次数。 -风级评分 +风速评分 ^^^^^^^^^^^^^^^^^^^^ +风速评分是衡量预报风级与观测风级之间匹配程度的分值。其算法为:若预报与观测处于同一风级,则记1分;若二者为相邻风级,则记0.6分;若二者风级相差2级,则记0.4分;其余情况不得分,累加所有样本的评分后取算数平均值即为样本的风速评分。风速评分表请见: :ref:`wind_scale_score_table` + 风向方位准确率 ^^^^^^^^^^^^^^^^^^^^ +风向方位准确率为预报风向方位与观测风向方位一致样本书与总样本数之间的比值,可分为 8 分位风向准确率和 16 分位风向准确率。其公式如下: + +.. math:: + + ACC_{d} = \frac{C_{d}}{N} \times 100\% + +式中: + +:math:`ACC_{d}`——风向方位准确率。 + +:math:`C_{d}`——风向预报与真值之间匹配一致的样本个数。 + +:math:`N`——预报的总样本个数。 + + +.. note:: + + 本项目的风向采用 `《中华人民共和国国家标准:地面气象观测规范 风向和风速 GB/T 35227-2017》 `_ 表1中的风向方位和符号,下同。具体等级表见附录 :ref:`wind_direction_table` 。 + + 风向角度均方根误差 ^^^^^^^^^^^^^^^^^^^^ +风向角度均方根误差,是对以°作为单位的风向角度计算的预报风向角度与观测风向角度的 :ref:`rmse` 。对于风向来说特殊的是,需要取两个角度之间最小扇形的角度作为差值进行计算。 + 风向角度平均绝对误差 ^^^^^^^^^^^^^^^^^^^^^^ +风向角度平均绝对误差,是对以°作为单位的风向角度计算的预报风向角度与观测风向角度的 :ref:`mae` 。对于风向来说特殊的是,需要取两个角度之间最小扇形的角度作为差值进行计算。 + 风向角度误差准确率 ^^^^^^^^^^^^^^^^^^^^ +风向角度误差准确率,是对以°作为单位的风向角度计算的预报风向角度与观测风向角度的 :ref:`err_accuracy` 。对于风向来说特殊的是,需要取两个角度之间最小扇形的角度作为差值进行计算。 + 风向评分 ^^^^^^^^^^^^^^^^^^^^ +风向评分是衡量风向准确率的一个指标,风向评分使用风向方位(而非风向角度)作为基准进行评估。 + +* 对于 8 分位风向,预报和观测风向方位完全匹配得 1 分,二者风向方位相差 1 个方位得 0.6 分,其余情况得 0 分。 +* 对于 16 分位风向,预报和观测风向方位完全匹配得 1 分,二者风向方位相差 1 个方位得 0.8 分,相差 2 个方位得 0.6 分,其余情况得 0 分。 + +风向方位采用::ref:`wind_direction_table` diff --git a/tests/case/__init__.py b/tests/case/__init__.py index 2e6af08..fb31def 100644 --- a/tests/case/__init__.py +++ b/tests/case/__init__.py @@ -57,17 +57,17 @@ { "obs": np.array([1, 2, 3, 0]), "fct": np.array([1, 2, 3, 0]), - "result": (1.0, 0.0, 1.0, 0.0, 0.0), + "result": (1.0, 0.0, 1.0, 0.0), }, { "obs": np.array([1, 2, 0, 0]), "fct": np.array([0, 0, 3, 4]), - "result": (-0.4118, 1.4706, -0.8866, 0.1134, 0.1519), + "result": (-0.4118, 1.4706, -0.8866, 0.1134), }, { "obs": np.array([1, 2, 0, np.nan]), "fct": np.array([0, 0, 3, 4]), - "result": (-0.5, 1.5, -0.866, 0.3333, 0.2887), + "result": (-0.5, 1.5, -0.866, 0.3333), }, ]