cloudnetpy 1.55.20__py3-none-any.whl → 1.55.22__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. cloudnetpy/categorize/atmos.py +46 -14
  2. cloudnetpy/categorize/atmos_utils.py +11 -1
  3. cloudnetpy/categorize/categorize.py +38 -21
  4. cloudnetpy/categorize/classify.py +31 -9
  5. cloudnetpy/categorize/containers.py +19 -7
  6. cloudnetpy/categorize/droplet.py +24 -8
  7. cloudnetpy/categorize/falling.py +17 -7
  8. cloudnetpy/categorize/freezing.py +19 -5
  9. cloudnetpy/categorize/insects.py +27 -14
  10. cloudnetpy/categorize/lidar.py +38 -36
  11. cloudnetpy/categorize/melting.py +19 -9
  12. cloudnetpy/categorize/model.py +28 -9
  13. cloudnetpy/categorize/mwr.py +4 -2
  14. cloudnetpy/categorize/radar.py +58 -22
  15. cloudnetpy/cloudnetarray.py +15 -6
  16. cloudnetpy/concat_lib.py +39 -16
  17. cloudnetpy/constants.py +7 -0
  18. cloudnetpy/datasource.py +39 -19
  19. cloudnetpy/instruments/basta.py +6 -2
  20. cloudnetpy/instruments/campbell_scientific.py +33 -16
  21. cloudnetpy/instruments/ceilo.py +30 -13
  22. cloudnetpy/instruments/ceilometer.py +76 -37
  23. cloudnetpy/instruments/cl61d.py +8 -3
  24. cloudnetpy/instruments/cloudnet_instrument.py +2 -1
  25. cloudnetpy/instruments/copernicus.py +27 -14
  26. cloudnetpy/instruments/disdrometer/common.py +51 -32
  27. cloudnetpy/instruments/disdrometer/parsivel.py +79 -48
  28. cloudnetpy/instruments/disdrometer/thies.py +10 -6
  29. cloudnetpy/instruments/galileo.py +23 -12
  30. cloudnetpy/instruments/hatpro.py +27 -11
  31. cloudnetpy/instruments/instruments.py +4 -1
  32. cloudnetpy/instruments/lufft.py +20 -11
  33. cloudnetpy/instruments/mira.py +60 -49
  34. cloudnetpy/instruments/mrr.py +31 -20
  35. cloudnetpy/instruments/nc_lidar.py +15 -6
  36. cloudnetpy/instruments/nc_radar.py +31 -22
  37. cloudnetpy/instruments/pollyxt.py +36 -21
  38. cloudnetpy/instruments/radiometrics.py +32 -18
  39. cloudnetpy/instruments/rpg.py +48 -22
  40. cloudnetpy/instruments/rpg_reader.py +39 -30
  41. cloudnetpy/instruments/vaisala.py +39 -27
  42. cloudnetpy/instruments/weather_station.py +15 -11
  43. cloudnetpy/metadata.py +3 -1
  44. cloudnetpy/model_evaluation/file_handler.py +31 -21
  45. cloudnetpy/model_evaluation/metadata.py +3 -1
  46. cloudnetpy/model_evaluation/model_metadata.py +1 -1
  47. cloudnetpy/model_evaluation/plotting/plot_tools.py +20 -15
  48. cloudnetpy/model_evaluation/plotting/plotting.py +114 -64
  49. cloudnetpy/model_evaluation/products/advance_methods.py +48 -28
  50. cloudnetpy/model_evaluation/products/grid_methods.py +44 -19
  51. cloudnetpy/model_evaluation/products/model_products.py +22 -18
  52. cloudnetpy/model_evaluation/products/observation_products.py +15 -9
  53. cloudnetpy/model_evaluation/products/product_resampling.py +14 -4
  54. cloudnetpy/model_evaluation/products/tools.py +16 -7
  55. cloudnetpy/model_evaluation/statistics/statistical_methods.py +28 -15
  56. cloudnetpy/model_evaluation/tests/e2e/conftest.py +3 -3
  57. cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +9 -5
  58. cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +14 -13
  59. cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +9 -5
  60. cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +14 -13
  61. cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +9 -5
  62. cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +14 -13
  63. cloudnetpy/model_evaluation/tests/unit/conftest.py +11 -11
  64. cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +33 -27
  65. cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +83 -83
  66. cloudnetpy/model_evaluation/tests/unit/test_model_products.py +23 -21
  67. cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +24 -25
  68. cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +40 -39
  69. cloudnetpy/model_evaluation/tests/unit/test_plotting.py +12 -11
  70. cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +30 -30
  71. cloudnetpy/model_evaluation/tests/unit/test_tools.py +18 -17
  72. cloudnetpy/model_evaluation/utils.py +3 -2
  73. cloudnetpy/output.py +45 -19
  74. cloudnetpy/plotting/plot_meta.py +35 -11
  75. cloudnetpy/plotting/plotting.py +172 -104
  76. cloudnetpy/products/classification.py +20 -8
  77. cloudnetpy/products/der.py +25 -10
  78. cloudnetpy/products/drizzle.py +41 -26
  79. cloudnetpy/products/drizzle_error.py +10 -5
  80. cloudnetpy/products/drizzle_tools.py +43 -24
  81. cloudnetpy/products/ier.py +10 -5
  82. cloudnetpy/products/iwc.py +16 -9
  83. cloudnetpy/products/lwc.py +34 -12
  84. cloudnetpy/products/mwr_multi.py +4 -1
  85. cloudnetpy/products/mwr_single.py +4 -1
  86. cloudnetpy/products/product_tools.py +33 -10
  87. cloudnetpy/utils.py +175 -74
  88. cloudnetpy/version.py +1 -1
  89. {cloudnetpy-1.55.20.dist-info → cloudnetpy-1.55.22.dist-info}/METADATA +11 -10
  90. cloudnetpy-1.55.22.dist-info/RECORD +114 -0
  91. docs/source/conf.py +2 -2
  92. cloudnetpy-1.55.20.dist-info/RECORD +0 -114
  93. {cloudnetpy-1.55.20.dist-info → cloudnetpy-1.55.22.dist-info}/LICENSE +0 -0
  94. {cloudnetpy-1.55.20.dist-info → cloudnetpy-1.55.22.dist-info}/WHEEL +0 -0
  95. {cloudnetpy-1.55.20.dist-info → cloudnetpy-1.55.22.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  import netCDF4
2
2
  import numpy as np
3
- import numpy.testing as testing
4
3
  import pytest
4
+ from numpy import testing
5
5
 
6
6
  from cloudnetpy.model_evaluation.products.model_products import ModelManager
7
7
 
@@ -14,31 +14,31 @@ PRODUCT = "iwc"
14
14
  "cycle, model, answer",
15
15
  [("test_file_12-23", "icon", "_12-23"), ("test_file", "ecmwf", "")],
16
16
  )
17
- def test_read_cycle_name(cycle, model, answer, model_file):
17
+ def test_read_cycle_name(cycle, model, answer, model_file) -> None:
18
18
  obj = ModelManager(str(model_file), model, OUTPUT_FILE, PRODUCT)
19
19
  x = obj._read_cycle_name(cycle)
20
20
  assert x == answer
21
21
 
22
22
 
23
- def test_get_cf(model_file):
23
+ def test_get_cf(model_file) -> None:
24
24
  obj = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
25
25
  obj._get_cf()
26
- assert f"{MODEL}_cf" in obj.data.keys()
26
+ assert f"{MODEL}_cf" in obj.data
27
27
 
28
28
 
29
- def test_get_iwc(model_file):
29
+ def test_get_iwc(model_file) -> None:
30
30
  obj = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
31
31
  obj._get_iwc()
32
- assert f"{MODEL}_iwc" in obj.data.keys()
32
+ assert f"{MODEL}_iwc" in obj.data
33
33
 
34
34
 
35
- def test_get_lwc(model_file):
35
+ def test_get_lwc(model_file) -> None:
36
36
  obj = ModelManager(str(model_file), MODEL, OUTPUT_FILE, "lwc")
37
37
  obj._get_lwc()
38
- assert f"{MODEL}_lwc" in obj.data.keys()
38
+ assert f"{MODEL}_lwc" in obj.data
39
39
 
40
40
 
41
- def test_read_config(model_file):
41
+ def test_read_config(model_file) -> None:
42
42
  obj = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
43
43
  var = obj.get_model_var_names(("p",))
44
44
  assert "pressure" in var
@@ -47,7 +47,7 @@ def test_read_config(model_file):
47
47
 
48
48
 
49
49
  @pytest.mark.parametrize("key", ["pressure", "temperature"])
50
- def test_set_variables(key, model_file):
50
+ def test_set_variables(key, model_file) -> None:
51
51
  obj = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
52
52
  var = obj.getvar(key)
53
53
  x = netCDF4.Dataset(model_file).variables[key]
@@ -55,41 +55,43 @@ def test_set_variables(key, model_file):
55
55
 
56
56
 
57
57
  @pytest.mark.parametrize("p, T, q", [(1, 2, 3), (20, 40, 80), (0.3, 0.6, 0.9)])
58
- def test_calc_water_content(p, T, q, model_file):
58
+ def test_calc_water_content(p, T, q, model_file) -> None:
59
59
  obj = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
60
60
  x = q * p / (287 * T)
61
61
  testing.assert_almost_equal(x, obj._calc_water_content(q, p, T))
62
62
 
63
63
 
64
64
  @pytest.mark.parametrize(
65
- "key", ["time", "level", "horizontal_resolution", "latitude", "longitude"]
65
+ "key",
66
+ ["time", "level", "horizontal_resolution", "latitude", "longitude"],
66
67
  )
67
- def test_add_common_variables_false(key, model_file):
68
+ def test_add_common_variables_false(key, model_file) -> None:
68
69
  obj = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
69
70
  obj._is_file = False
70
71
  obj._add_variables()
71
- assert key in obj.data.keys()
72
+ assert key in obj.data
72
73
 
73
74
 
74
75
  @pytest.mark.parametrize(
75
- "key", ["time", "level", "horizontal_resolution", "latitude", "longitude"]
76
+ "key",
77
+ ["time", "level", "horizontal_resolution", "latitude", "longitude"],
76
78
  )
77
- def test_add_common_variables_true(key, model_file, regrid_file):
79
+ def test_add_common_variables_true(key, model_file, regrid_file) -> None:
78
80
  obj = ModelManager(str(model_file), MODEL, regrid_file, PRODUCT)
79
81
  obj._is_file = True
80
82
  obj._add_variables()
81
- assert key not in obj.data.keys()
83
+ assert key not in obj.data
82
84
 
83
85
 
84
86
  @pytest.mark.parametrize("key", ["height", "forecast_time"])
85
- def test_add_cycle_variables_no_products(key, model_file):
87
+ def test_add_cycle_variables_no_products(key, model_file) -> None:
86
88
  obj = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
87
89
  obj._is_file = False
88
90
  obj._add_variables()
89
- assert f"{MODEL}_{key}" in obj.data.keys()
91
+ assert f"{MODEL}_{key}" in obj.data
90
92
 
91
93
 
92
- def test_cut_off_extra_levels(model_file):
94
+ def test_cut_off_extra_levels(model_file) -> None:
93
95
  obj = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
94
96
  data = np.array([np.arange(100), np.arange(100)])
95
97
  compare = np.array([np.arange(88), np.arange(88)])
@@ -97,7 +99,7 @@ def test_cut_off_extra_levels(model_file):
97
99
  testing.assert_array_almost_equal(x, compare)
98
100
 
99
101
 
100
- def test_calculate_wind_speed(model_file):
102
+ def test_calculate_wind_speed(model_file) -> None:
101
103
  obj = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
102
104
  u = obj.getvar("uwind")
103
105
  v = obj.getvar("vwind")
@@ -1,9 +1,8 @@
1
- from datetime import datetime
1
+ from datetime import datetime, timezone
2
2
 
3
3
  import numpy as np
4
- import numpy.ma as ma
5
- import numpy.testing as testing
6
4
  import pytest
5
+ from numpy import ma, testing
7
6
 
8
7
  from cloudnetpy.model_evaluation.products.product_resampling import ObservationManager
9
8
  from cloudnetpy.products.product_tools import CategorizeBits
@@ -12,7 +11,7 @@ PRODUCT = "iwc"
12
11
 
13
12
 
14
13
  class CatBits:
15
- def __init__(self):
14
+ def __init__(self) -> None:
16
15
  self.category_bits = {
17
16
  "droplet": np.asarray([[1, 0, 1, 1, 1, 1], [0, 1, 1, 1, 0, 0]], dtype=bool),
18
17
  "falling": np.asarray([[0, 0, 0, 0, 1, 0], [0, 0, 0, 1, 1, 1]], dtype=bool),
@@ -23,26 +22,26 @@ class CatBits:
23
22
  }
24
23
 
25
24
 
26
- def test_get_date(obs_file):
25
+ def test_get_date(obs_file) -> None:
27
26
  obj = ObservationManager(PRODUCT, str(obs_file))
28
- date = datetime(2019, 5, 23, 0, 0, 0)
27
+ date = datetime(2019, 5, 23, 0, 0, 0, tzinfo=timezone.utc)
29
28
  assert obj._get_date() == date
30
29
 
31
30
 
32
31
  @pytest.mark.parametrize("key", ["iwc", "lwc", "cf"])
33
- def test_generate_product(key, obs_file):
32
+ def test_generate_product(key, obs_file) -> None:
34
33
  obj = ObservationManager(key, str(obs_file))
35
34
  obj._generate_product()
36
- assert key in obj.data.keys()
35
+ assert key in obj.data
37
36
 
38
37
 
39
- def test_add_height(obs_file):
38
+ def test_add_height(obs_file) -> None:
40
39
  obj = ObservationManager(PRODUCT, str(obs_file))
41
40
  obj._generate_product()
42
- assert "height" in obj.data.keys()
41
+ assert "height" in obj.data
43
42
 
44
43
 
45
- def test_generate_cf(obs_file):
44
+ def test_generate_cf(obs_file) -> None:
46
45
  obj = ObservationManager("cf", str(obs_file))
47
46
  x = obj._generate_cf()
48
47
  compare = ma.array(
@@ -53,13 +52,13 @@ def test_generate_cf(obs_file):
53
52
  [0, 0, 0, 1],
54
53
  [1, 0, 0, 0],
55
54
  [0, 0, 0, 0],
56
- ]
55
+ ],
57
56
  )
58
57
  compare[~obj._rain_index(), :] = ma.masked
59
58
  testing.assert_array_almost_equal(compare, x)
60
59
 
61
60
 
62
- def test_basic_cloud_mask(obs_file):
61
+ def test_basic_cloud_mask(obs_file) -> None:
63
62
  cat = CategorizeBits(str(obs_file))
64
63
  obj = ObservationManager("cf", str(obs_file))
65
64
  x = obj._classify_basic_mask(cat.category_bits)
@@ -71,12 +70,12 @@ def test_basic_cloud_mask(obs_file):
71
70
  [0, 0, 0, 1],
72
71
  [0, 0, 6, 6],
73
72
  [7, 2, 0, 7],
74
- ]
73
+ ],
75
74
  )
76
75
  testing.assert_array_almost_equal(x, compare)
77
76
 
78
77
 
79
- def test_mask_cloud_bits(obs_file):
78
+ def test_mask_cloud_bits(obs_file) -> None:
80
79
  cat = CategorizeBits(str(obs_file))
81
80
  obj = ObservationManager("cf", str(obs_file))
82
81
  mask = obj._classify_basic_mask(cat.category_bits)
@@ -89,12 +88,12 @@ def test_mask_cloud_bits(obs_file):
89
88
  [0, 0, 0, 1],
90
89
  [0, 0, 0, 0],
91
90
  [0, 0, 0, 0],
92
- ]
91
+ ],
93
92
  )
94
93
  testing.assert_array_almost_equal(x, compare)
95
94
 
96
95
 
97
- def test_basic_cloud_mask_all_values(obs_file):
96
+ def test_basic_cloud_mask_all_values(obs_file) -> None:
98
97
  cat = CatBits()
99
98
  obj = ObservationManager("cf", str(obs_file))
100
99
  x = obj._classify_basic_mask(cat.category_bits)
@@ -102,7 +101,7 @@ def test_basic_cloud_mask_all_values(obs_file):
102
101
  testing.assert_array_almost_equal(x, compare)
103
102
 
104
103
 
105
- def test_mask_cloud_bits_all_values(obs_file):
104
+ def test_mask_cloud_bits_all_values(obs_file) -> None:
106
105
  cat = CatBits()
107
106
  obj = ObservationManager("cf", str(obs_file))
108
107
  mask = obj._classify_basic_mask(cat.category_bits)
@@ -111,19 +110,19 @@ def test_mask_cloud_bits_all_values(obs_file):
111
110
  testing.assert_array_almost_equal(x, compare)
112
111
 
113
112
 
114
- def test_check_rainrate(obs_file):
113
+ def test_check_rainrate(obs_file) -> None:
115
114
  obj = ObservationManager("cf", str(obs_file))
116
115
  x = obj._check_rainrate()
117
116
  assert x is True
118
117
 
119
118
 
120
- def test_get_rainrate_threshold(obs_file):
119
+ def test_get_rainrate_threshold(obs_file) -> None:
121
120
  obj = ObservationManager("cf", str(obs_file))
122
121
  x = obj._get_rainrate_threshold()
123
122
  assert x == 8
124
123
 
125
124
 
126
- def test_rain_index(obs_file):
125
+ def test_rain_index(obs_file) -> None:
127
126
  obj = ObservationManager("cf", str(obs_file))
128
127
  x = obj._rain_index()
129
128
  compare = np.array([0, 0, 0, 1, 0, 1], dtype=bool)
@@ -131,13 +130,13 @@ def test_rain_index(obs_file):
131
130
 
132
131
 
133
132
  @pytest.mark.parametrize("key", ["iwc", "iwc_att", "iwc_rain"])
134
- def test_generate_iwc_masks(key, obs_file):
133
+ def test_generate_iwc_masks(key, obs_file) -> None:
135
134
  obj = ObservationManager(PRODUCT, str(obs_file))
136
135
  obj._generate_iwc_masks()
137
- assert key in obj.data.keys()
136
+ assert key in obj.data
138
137
 
139
138
 
140
- def test_get_rain_iwc(obs_file):
139
+ def test_get_rain_iwc(obs_file) -> None:
141
140
  obj = ObservationManager("iwc", str(obs_file))
142
141
  iwc_status = obj.getvar("iwc_retrieval_status")
143
142
  x = np.zeros(iwc_status.shape)
@@ -148,7 +147,7 @@ def test_get_rain_iwc(obs_file):
148
147
  testing.assert_array_almost_equal(x, compare[:])
149
148
 
150
149
 
151
- def test_mask_iwc_att(obs_file):
150
+ def test_mask_iwc_att(obs_file) -> None:
152
151
  obj = ObservationManager("iwc", str(obs_file))
153
152
  iwc = obj.getvar("iwc")
154
153
  iwc_status = obj.getvar("iwc_retrieval_status")
@@ -4,58 +4,59 @@ from numpy import ma, testing
4
4
  from cloudnetpy.model_evaluation.plotting import plot_tools as plt
5
5
 
6
6
 
7
- def test_parse_wanted_names(regrid_file):
7
+ def test_parse_wanted_names(regrid_file) -> None:
8
8
  """nc_file: str, name: str, model: str,
9
9
  vars: list | None = None,
10
- advance: bool = False"""
10
+ advance: bool = False
11
+ """
11
12
  compare = ["ecmwf_cf", "cf_ecmwf"]
12
13
  x, _ = plt.parse_wanted_names(regrid_file, "cf", "ecmwf")
13
14
  assert x == compare
14
15
 
15
16
 
16
- def test_parse_wanted_names_adv(regrid_file):
17
+ def test_parse_wanted_names_adv(regrid_file) -> None:
17
18
  compare = ["ecmwf_cf", "cf_adv_ecmwf"]
18
19
  _, x_adv = plt.parse_wanted_names(regrid_file, "cf", "ecmwf")
19
20
  assert x_adv == compare
20
21
 
21
22
 
22
- def test_parse_wanted_names_advance_False(regrid_file):
23
+ def test_parse_wanted_names_advance_False(regrid_file) -> None:
23
24
  compare = ["ecmwf_cf", "cf_ecmwf"]
24
25
  x, _ = plt.parse_wanted_names(regrid_file, "cf", "ecmwf", advance=False)
25
26
  assert x == compare
26
27
 
27
28
 
28
- def test_parse_wanted_names_advance_True(regrid_file):
29
+ def test_parse_wanted_names_advance_True(regrid_file) -> None:
29
30
  compare = ["ecmwf_cf", "ecmwf_cf_cirrus", "ecmwf_cf_snow", "cf_ecmwf"]
30
31
  x, _ = plt.parse_wanted_names(regrid_file, "cf", "ecmwf", advance=True)
31
32
  assert x == compare
32
33
 
33
34
 
34
- def test_parse_wanted_names_adv_advance_True(regrid_file):
35
+ def test_parse_wanted_names_adv_advance_True(regrid_file) -> None:
35
36
  compare = ["ecmwf_cf", "ecmwf_cf_cirrus", "ecmwf_cf_snow", "cf_adv_ecmwf"]
36
37
  _, x_adv = plt.parse_wanted_names(regrid_file, "cf", "ecmwf", advance=True)
37
38
  assert x_adv == compare
38
39
 
39
40
 
40
- def test_parse_wanted_names_adv_advance_False(regrid_file):
41
+ def test_parse_wanted_names_adv_advance_False(regrid_file) -> None:
41
42
  compare = ["ecmwf_cf", "cf_adv_ecmwf"]
42
43
  _, x_adv = plt.parse_wanted_names(regrid_file, "cf", "ecmwf", advance=False)
43
44
  assert x_adv == compare
44
45
 
45
46
 
46
- def test_parse_wanted_names_fixed_list(regrid_file):
47
+ def test_parse_wanted_names_fixed_list(regrid_file) -> None:
47
48
  compare = ["ecmwf_cf", "ecmwf_cf_cirrus"]
48
49
  x, _ = plt.parse_wanted_names(regrid_file, "cf", "ecmwf", variables=compare)
49
50
  assert x == compare
50
51
 
51
52
 
52
- def test_parse_wanted_names_adv_fixed_list(regrid_file):
53
+ def test_parse_wanted_names_adv_fixed_list(regrid_file) -> None:
53
54
  compare = ["ecmwf_cf_cirrus", "cf_adv_ecmwf"]
54
55
  x_adv, _ = plt.parse_wanted_names(regrid_file, "cf", "ecmwf", variables=compare)
55
56
  assert x_adv == compare
56
57
 
57
58
 
58
- def test_sort_model2first_element():
59
+ def test_sort_model2first_element() -> None:
59
60
  a = ["ec_i", "cf_ec_i", "cf_ec_ii", "ec_ii"]
60
61
  e = "ec"
61
62
  compare = ["ec_i", "ec_ii", "cf_ec_i", "cf_ec_ii"]
@@ -63,7 +64,7 @@ def test_sort_model2first_element():
63
64
  assert x == compare
64
65
 
65
66
 
66
- def test_sort_cycles_vars():
67
+ def test_sort_cycles_vars() -> None:
67
68
  a = ["era5_cf_1-12", "era5_cf_7-18", "cf_era5_1-12", "cf_era5_7-18"]
68
69
  e = "era5"
69
70
  compare = [
@@ -74,7 +75,7 @@ def test_sort_cycles_vars():
74
75
  assert x == compare
75
76
 
76
77
 
77
- def test_sort_cycles_simo():
78
+ def test_sort_cycles_simo() -> None:
78
79
  a = ["era5_cf_1-12", "era5_cf_7-18", "cf_era5_1-12", "cf_era5_7-18"]
79
80
  e = "era5"
80
81
  compare = ["1-12", "7-18"]
@@ -82,7 +83,7 @@ def test_sort_cycles_simo():
82
83
  assert y == compare
83
84
 
84
85
 
85
- def test_sort_cycles_vars_missing():
86
+ def test_sort_cycles_vars_missing() -> None:
86
87
  a = ["icon_cf_12-23", "icon_cf_36-47", "cf_icon_12-23", "cf_icon_36-47"]
87
88
  e = "icon"
88
89
  compare = [
@@ -93,7 +94,7 @@ def test_sort_cycles_vars_missing():
93
94
  assert x == compare
94
95
 
95
96
 
96
- def test_sort_cycles_cycles_missing():
97
+ def test_sort_cycles_cycles_missing() -> None:
97
98
  a = ["icon_cf_12-23", "icon_cf_36-47", "cf_icon_12-23", "cf_icon_36-47"]
98
99
  e = "icon"
99
100
  compare = ["12-23", "36-47"]
@@ -101,7 +102,7 @@ def test_sort_cycles_cycles_missing():
101
102
  assert y == compare
102
103
 
103
104
 
104
- def test_read_data_characters(regrid_file):
105
+ def test_read_data_characters(regrid_file) -> None:
105
106
  t = np.array([[2, 2], [6, 6], [10, 10]])
106
107
  h = np.array([[0.01, 0.014], [0.008, 0.014], [0.009, 0.015]])
107
108
  data = np.array([[0, 2], [3, 6], [5, 8]])
@@ -112,7 +113,7 @@ def test_read_data_characters(regrid_file):
112
113
  testing.assert_array_almost_equal(compare[i], test[i])
113
114
 
114
115
 
115
- def test_mask_small_values_lwc():
116
+ def test_mask_small_values_lwc() -> None:
116
117
  name = "lwc_lol"
117
118
  data = ma.array([[0, 1], [3, 6], [5, 8]])
118
119
  data = plt.mask_small_values(data, name)
@@ -121,7 +122,7 @@ def test_mask_small_values_lwc():
121
122
  testing.assert_array_almost_equal(data.mask, compare.mask)
122
123
 
123
124
 
124
- def test_mask_small_values_lwc_mask():
125
+ def test_mask_small_values_lwc_mask() -> None:
125
126
  name = "lwc_lol"
126
127
  data = ma.array([[0, 0.000001], [3, 6], [5, 8]])
127
128
  data = plt.mask_small_values(data, name)
@@ -131,7 +132,7 @@ def test_mask_small_values_lwc_mask():
131
132
  testing.assert_array_almost_equal(data.mask, compare.mask)
132
133
 
133
134
 
134
- def test_mask_small_values_iwc():
135
+ def test_mask_small_values_iwc() -> None:
135
136
  name = "iwc_lol"
136
137
  data = ma.array([[0, 1], [3, 6], [5, 8]])
137
138
  data = plt.mask_small_values(data, name)
@@ -140,7 +141,7 @@ def test_mask_small_values_iwc():
140
141
  testing.assert_array_almost_equal(data.mask, compare.mask)
141
142
 
142
143
 
143
- def test_mask_small_values_iwc_mask():
144
+ def test_mask_small_values_iwc_mask() -> None:
144
145
  name = "iwc_lol"
145
146
  data = ma.array([[0, 0.00000001], [3, 6], [5, 8]])
146
147
  data = plt.mask_small_values(data, name)
@@ -150,7 +151,7 @@ def test_mask_small_values_iwc_mask():
150
151
  testing.assert_array_almost_equal(data.mask, compare.mask)
151
152
 
152
153
 
153
- def test_mask_small_values():
154
+ def test_mask_small_values() -> None:
154
155
  name = "cf_lol"
155
156
  data = ma.array([[0, 1], [3, 6], [5, 8]])
156
157
  data = plt.mask_small_values(data, name)
@@ -159,7 +160,7 @@ def test_mask_small_values():
159
160
  testing.assert_array_almost_equal(data.mask, compare.mask)
160
161
 
161
162
 
162
- def test_mask_small_values_mask():
163
+ def test_mask_small_values_mask() -> None:
163
164
  name = "cf_lol"
164
165
  data = ma.array([[0, -0.000001], [3, 6], [5, 8]])
165
166
  data_mask = plt.mask_small_values(data, name)
@@ -169,7 +170,7 @@ def test_mask_small_values_mask():
169
170
  testing.assert_array_equal(data_mask.mask, compare.mask)
170
171
 
171
172
 
172
- def test_reshape_1d2nd():
173
+ def test_reshape_1d2nd() -> None:
173
174
  oned = np.array([1, 2, 3, 4])
174
175
  twod = np.array([[0, 0], [0, 0], [0, 0], [0, 0]])
175
176
  compare = np.array([[1, 1], [2, 2], [3, 3], [4, 4]])
@@ -177,7 +178,7 @@ def test_reshape_1d2nd():
177
178
  testing.assert_array_almost_equal(x, compare)
178
179
 
179
180
 
180
- def test_create_segment_values():
181
+ def test_create_segment_values() -> None:
181
182
  model_mask = np.array([[0, 1, 1, 0], [0, 0, 1, 0], [1, 0, 0, 0]], dtype=bool)
182
183
  obs_mask = np.array([[0, 0, 0, 0], [0, 0, 1, 0], [1, 0, 1, 1]], dtype=bool)
183
184
  x, _ = plt.create_segment_values([model_mask, obs_mask])
@@ -185,21 +186,21 @@ def test_create_segment_values():
185
186
  testing.assert_array_almost_equal(x, compare)
186
187
 
187
188
 
188
- def test_rolling_mean():
189
+ def test_rolling_mean() -> None:
189
190
  data = np.ma.array([1, 2, 7, 4, 2, 3, 8, 5])
190
191
  x = plt.rolling_mean(data, 2)
191
192
  compare = np.array([1.5, 4.5, 5.5, 3, 2.5, 5.5, 6.5, 5])
192
193
  testing.assert_array_almost_equal(x, compare)
193
194
 
194
195
 
195
- def test_rolling_mean_nan():
196
+ def test_rolling_mean_nan() -> None:
196
197
  data = np.ma.array([1, 2, np.nan, 4, 2, np.nan, 8, 5])
197
198
  x = plt.rolling_mean(data, 2)
198
199
  compare = np.array([1.5, 2, 4, 3, 2, 8, 6.5, 5])
199
200
  testing.assert_array_almost_equal(x, compare)
200
201
 
201
202
 
202
- def test_rolling_mean_mask():
203
+ def test_rolling_mean_mask() -> None:
203
204
  data = np.ma.array([1, 2, 7, 4, 2, 3, 8, 5])
204
205
  data.mask = np.array([0, 0, 1, 0, 1, 0, 0, 1])
205
206
  x = plt.rolling_mean(data, 2)
@@ -207,7 +208,7 @@ def test_rolling_mean_mask():
207
208
  testing.assert_array_almost_equal(x, compare)
208
209
 
209
210
 
210
- def test_rolling_mean_all_mask():
211
+ def test_rolling_mean_all_mask() -> None:
211
212
  data = np.ma.array([1, 2, 7, 4, 2, 3, 8, 5])
212
213
  data.mask = np.array([0, 1, 1, 1, 1, 0, 0, 1])
213
214
  x = plt.rolling_mean(data, 2)
@@ -215,16 +216,16 @@ def test_rolling_mean_all_mask():
215
216
  testing.assert_array_almost_equal(x, compare)
216
217
 
217
218
 
218
- def test_change2one_dim_axes_maskY():
219
+ def test_change2one_dim_axes_maskY() -> None:
219
220
  x = np.ma.array(
220
- [[1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4]]
221
+ [[1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4]],
221
222
  )
222
223
  y = np.ma.array(
223
- [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
224
+ [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]],
224
225
  )
225
226
  y[1] = np.ma.masked
226
227
  data = np.ma.array(
227
- [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]
228
+ [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]],
228
229
  )
229
230
  x, y, data = plt.change2one_dim_axes(x, y, data)
230
231
  compare_x = np.array([1, 2, 3, 4])
@@ -233,16 +234,16 @@ def test_change2one_dim_axes_maskY():
233
234
  testing.assert_array_almost_equal(y, compare_y)
234
235
 
235
236
 
236
- def test_change2one_dim_axes_maskX():
237
+ def test_change2one_dim_axes_maskX() -> None:
237
238
  x = np.ma.array(
238
- [[1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4]]
239
+ [[1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4]],
239
240
  )
240
241
  y = np.ma.array(
241
- [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
242
+ [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]],
242
243
  )
243
244
  x[1] = np.ma.masked
244
245
  data = np.ma.array(
245
- [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]
246
+ [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]],
246
247
  )
247
248
  x, y, data = plt.change2one_dim_axes(x, y, data)
248
249
  compare_x = np.array([1, 2, 3, 4])
@@ -251,17 +252,17 @@ def test_change2one_dim_axes_maskX():
251
252
  testing.assert_array_almost_equal(y, compare_y)
252
253
 
253
254
 
254
- def test_change2one_dim_axes():
255
+ def test_change2one_dim_axes() -> None:
255
256
  x = np.ma.array(
256
- [[1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4]]
257
+ [[1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4]],
257
258
  )
258
259
  compare_x = np.copy(x)
259
260
  y = np.ma.array(
260
- [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
261
+ [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]],
261
262
  )
262
263
  compare_y = np.copy(y)
263
264
  data = np.ma.array(
264
- [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]
265
+ [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]],
265
266
  )
266
267
  x, y, data = plt.change2one_dim_axes(x, y, data)
267
268
  testing.assert_array_almost_equal(x, compare_x)
@@ -11,7 +11,7 @@ class VariableInfo:
11
11
 
12
12
 
13
13
  @pytest.mark.parametrize("key", ["cf_V", "cf_A", "cf_V_adv", "cf_A_adv"])
14
- def test_get_cf_title(key):
14
+ def test_get_cf_title(key) -> None:
15
15
  var = VariableInfo()
16
16
  field_name = key + "_" + MODEL
17
17
  value = "Product, Volume"
@@ -22,7 +22,7 @@ def test_get_cf_title(key):
22
22
 
23
23
 
24
24
  @pytest.mark.parametrize("key", ["cf_V", "cf_A", "cf_V_adv", "cf_A_adv"])
25
- def test_get_cf_title_cycle(key):
25
+ def test_get_cf_title_cycle(key) -> None:
26
26
  var = VariableInfo()
27
27
  field_name = key + "_" + MODEL + "_001"
28
28
  value = "Product, Volume"
@@ -43,7 +43,7 @@ def test_get_cf_title_cycle(key):
43
43
  ("iwc_rain_adv", "Product with rain"),
44
44
  ],
45
45
  )
46
- def test_get_iwc_title(key, value):
46
+ def test_get_iwc_title(key, value) -> None:
47
47
  var = VariableInfo()
48
48
  field_name = key + "_" + MODEL
49
49
  x = pl._get_iwc_title(field_name, var)
@@ -61,21 +61,21 @@ def test_get_iwc_title(key, value):
61
61
  ("iwc_rain_adv", "Product with rain"),
62
62
  ],
63
63
  )
64
- def test_get_iwc_title_cycle(key, value):
64
+ def test_get_iwc_title_cycle(key, value) -> None:
65
65
  var = VariableInfo()
66
66
  field_name = key + "_" + MODEL + "_001"
67
67
  x = pl._get_iwc_title(field_name, var)
68
68
  assert x == value
69
69
 
70
70
 
71
- def test_get_product_title():
71
+ def test_get_product_title() -> None:
72
72
  var = VariableInfo()
73
73
  value = "Product"
74
74
  x = pl._get_product_title(var)
75
75
  assert x == value
76
76
 
77
77
 
78
- def test_get_product_title_cycle():
78
+ def test_get_product_title_cycle() -> None:
79
79
  var = VariableInfo()
80
80
  value = "Product"
81
81
  x = pl._get_product_title(var)
@@ -83,9 +83,10 @@ def test_get_product_title_cycle():
83
83
 
84
84
 
85
85
  @pytest.mark.parametrize(
86
- "key, title", [("lwc", "Product"), ("lwc_adv", "Product (Advection time)")]
86
+ "key, title",
87
+ [("lwc", "Product"), ("lwc_adv", "Product (Advection time)")],
87
88
  )
88
- def test_get_stat_titles(key, title):
89
+ def test_get_stat_titles(key, title) -> None:
89
90
  field_name = key + "_" + MODEL
90
91
  var = VariableInfo()
91
92
  x = pl._get_stat_titles(field_name, key, var)
@@ -93,7 +94,7 @@ def test_get_stat_titles(key, title):
93
94
 
94
95
 
95
96
  @pytest.mark.parametrize("key", ["cf_V", "cf_A", "cf_V_adv", "cf_A_adv"])
96
- def test_get_cf_title_stat(key):
97
+ def test_get_cf_title_stat(key) -> None:
97
98
  field_name = key + "_" + MODEL
98
99
  var = VariableInfo()
99
100
  x = pl._get_cf_title_stat(field_name, var)
@@ -111,7 +112,7 @@ def test_get_cf_title_stat(key):
111
112
  ("iwc_rain", "Product with rain"),
112
113
  ],
113
114
  )
114
- def test_get_iwc_title_stat(key, value):
115
+ def test_get_iwc_title_stat(key, value) -> None:
115
116
  field_name = key + "_" + MODEL
116
117
  var = VariableInfo()
117
118
  x = pl._get_iwc_title_stat(field_name, var)
@@ -119,7 +120,7 @@ def test_get_iwc_title_stat(key, value):
119
120
 
120
121
 
121
122
  @pytest.mark.parametrize("key", ["lwc"])
122
- def test_get_product_title_stat(key):
123
+ def test_get_product_title_stat(key) -> None:
123
124
  var = VariableInfo()
124
125
  x = pl._get_product_title_stat(var)
125
126
  assert x == "Product"