cloudnetpy 1.65.4__py3-none-any.whl → 1.65.5__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.
@@ -56,7 +56,7 @@ def hatpro2l1c(
56
56
  instrument_config=site_meta,
57
57
  )
58
58
  except MissingInputData as err:
59
- raise HatproDataError from err
59
+ raise HatproDataError(str(err)) from err
60
60
 
61
61
  hatpro = HatproL1c(hatpro_raw, site_meta)
62
62
 
@@ -678,29 +678,40 @@ class Plot1D(Plot):
678
678
  def _plot_moving_average(self, figure_data: FigureData) -> None:
679
679
  time = figure_data.time.copy()
680
680
  data = self._data_orig.copy()
681
- good_values = ~ma.getmaskarray(data)
682
- data = data[good_values]
683
- time = time[good_values]
684
- if self.sub_plot.variable.name == "wind_direction":
685
- wind_speed = figure_data.file["wind_speed"][good_values]
686
- sma = self._calculate_average_wind_direction(
687
- wind_speed, data, time, window=15
688
- )
689
- else:
690
- sma = self._calculate_moving_average(data, time, window=5)
691
- gap_time = _get_max_gap_in_minutes(figure_data)
692
- gaps = self._find_time_gap_indices(time, max_gap_min=gap_time)
693
- if len(gaps) > 0:
694
- sma[gaps] = np.nan
695
- if len(sma) == len(time):
696
- self._ax.plot(
697
- time,
698
- sma,
699
- color="slateblue",
700
- lw=2,
701
- label="_nolegend_",
702
- zorder=_get_zorder("mean_curve"),
703
- )
681
+ flags = self._read_flagged_data(figure_data)
682
+ is_invalid = ma.getmaskarray(data)
683
+ if np.any(flags):
684
+ is_invalid |= flags
685
+
686
+ is_wind_direction = self.sub_plot.variable.name == "wind_direction"
687
+ if is_wind_direction:
688
+ data = np.stack([figure_data.file["wind_speed"], data])
689
+
690
+ block_ind = np.where(np.diff(is_invalid))[0] + 1
691
+ valid_time_blocks = np.split(time, block_ind)[is_invalid[0] :: 2]
692
+ valid_data_blocks = np.split(data, block_ind)[is_invalid[0] :: 2]
693
+
694
+ for time1, data1 in zip(valid_time_blocks, valid_data_blocks, strict=False):
695
+ if is_wind_direction:
696
+ sma = self._calculate_average_wind_direction(
697
+ data1[0], data1[1], time1, window=15
698
+ )
699
+ else:
700
+ sma = self._calculate_moving_average(data1, time1, window=5)
701
+ gap_time = _get_max_gap_in_minutes(figure_data)
702
+ gaps = self._find_time_gap_indices(time1, max_gap_min=gap_time) + 1
703
+
704
+ for time2, data2 in zip(
705
+ np.split(time1, gaps), np.split(sma, gaps), strict=False
706
+ ):
707
+ self._ax.plot(
708
+ time2,
709
+ data2,
710
+ color="slateblue",
711
+ lw=2,
712
+ label="_nolegend_",
713
+ zorder=_get_zorder("mean_curve"),
714
+ )
704
715
 
705
716
  @staticmethod
706
717
  def _get_line_width(time: ndarray) -> float:
@@ -736,12 +747,11 @@ class Plot1D(Plot):
736
747
  window_size = int(window / 60 / time_delta_hours)
737
748
  if window_size < 1:
738
749
  window_size = 1
739
- if (window_size % 2) != 0:
750
+ if window_size % 2 == 0:
740
751
  window_size += 1
741
- weights = np.repeat(1.0, window_size) / window_size
742
- sma = np.convolve(data, weights, "valid")
743
- edge = window_size // 2
744
- return np.pad(sma, (edge, edge - 1), mode="constant", constant_values=np.nan)
752
+ weights = np.repeat(1 / window_size, window_size)
753
+ padded_data = np.pad(data, window_size // 2, mode="edge")
754
+ return np.convolve(padded_data, weights, "valid")
745
755
 
746
756
  @classmethod
747
757
  def _calculate_average_wind_direction(
cloudnetpy/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
2
  MINOR = 65
3
- PATCH = 4
3
+ PATCH = 5
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudnetpy
3
- Version: 1.65.4
3
+ Version: 1.65.5
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -8,7 +8,7 @@ cloudnetpy/metadata.py,sha256=v_VDo2vbdTxB0zIsfP69IcrwSKiRlLpsGdq6JPI4CoA,5306
8
8
  cloudnetpy/output.py,sha256=YkCaxVkG_Mt2hng_IVnhygHteV4UMKzKALkeFZwFJL8,14822
9
9
  cloudnetpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  cloudnetpy/utils.py,sha256=JV0Fawnme1HoZgoiidV3eIzsn6vx0AEjBNmI1CcrBsA,28517
11
- cloudnetpy/version.py,sha256=3qkQVA6846RRCQrY42eyuDb5Ol3VYWPQzO4HGNHWwVI,72
11
+ cloudnetpy/version.py,sha256=7taBpMQJ9IcUdGe8zT3heZNDf-x-mFFQ3gSVNYJYWjw,72
12
12
  cloudnetpy/categorize/__init__.py,sha256=gP5q3Vis1y9u9OWgA_idlbjfWXYN_S0IBSWdwBhL_uU,69
13
13
  cloudnetpy/categorize/atmos.py,sha256=vavMC_WQQyGH14eL4vAzKLKDDZt8tBrMYimztYHOjH8,12639
14
14
  cloudnetpy/categorize/atmos_utils.py,sha256=ns5ydiEN34Ng6mJiOBpxKBVDU2NXj6W3Q5IUynmNRYI,3586
@@ -34,7 +34,7 @@ cloudnetpy/instruments/cl61d.py,sha256=g6DNBFju3wYhLFl32DKmC8pUup7y-EupXoUU0fuoG
34
34
  cloudnetpy/instruments/cloudnet_instrument.py,sha256=RG5HJxGM6p0F-IGyr85fvOizcMmgx48OeD_XeIsrgSU,3367
35
35
  cloudnetpy/instruments/copernicus.py,sha256=nmgqGOjVQFngj7BNbpcuCwA-W3yksvBbqn__iq7MyDk,6469
36
36
  cloudnetpy/instruments/galileo.py,sha256=yQBedd7dmDnwuWi1MtXOsg4-RyRx0uRAXumCY4YuH9k,4686
37
- cloudnetpy/instruments/hatpro.py,sha256=2lEblvJ9m7QniWH1OH7ycWtywYqY6X3ulE4dNuQp-Z8,8749
37
+ cloudnetpy/instruments/hatpro.py,sha256=DzCWzTJxTc5BSOgoeyM8RjYkSXX6NDi3QXgKRp0uxlI,8759
38
38
  cloudnetpy/instruments/instruments.py,sha256=jG5TYnZ8bdCZXnI303ZsaJBEdSKaIjKMbkGtnq6kQX0,3261
39
39
  cloudnetpy/instruments/lufft.py,sha256=ugXF6pssHAAz1Y_hqPdpKuluAjxxHSR88xBmQuS6RlI,3705
40
40
  cloudnetpy/instruments/mira.py,sha256=EyzEBTpWfDlgaspZVuIfaP4l73GYSVnSzEzBZc0lZNg,9333
@@ -94,7 +94,7 @@ cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py,sha256=Ra3r4V
94
94
  cloudnetpy/model_evaluation/tests/unit/test_tools.py,sha256=Ia_VrLdV2NstX5gbx_3AZTOAlrgLAy_xFZ8fHYVX0xI,3817
95
95
  cloudnetpy/plotting/__init__.py,sha256=lg9Smn4BI0dVBgnDLC3JVJ4GmwoSnO-qoSd4ApvwV6Y,107
96
96
  cloudnetpy/plotting/plot_meta.py,sha256=JHrr-4A9fhqdi_tQFe6mR4Fdry3hkI-lmmVu5Ny2vco,15979
97
- cloudnetpy/plotting/plotting.py,sha256=rVaCsXTrhb0ahdXerSPLZWRASs_QktyLUbjyHoVuam8,33584
97
+ cloudnetpy/plotting/plotting.py,sha256=6Bnex4V1DI1G_8QscPzVQyukSposA89sP-FQtBEbLHQ,34059
98
98
  cloudnetpy/products/__init__.py,sha256=2hRb5HG9hNrxH1if5laJkLeFeaZCd5W1q3hh4ewsX0E,273
99
99
  cloudnetpy/products/classification.py,sha256=bNG8W1CMgGoUBpXopQjYAW3F-uEJGyojXb4A5jmErHo,7921
100
100
  cloudnetpy/products/der.py,sha256=1LDBbnbUg8feMUTGWJq3bObBhEcZ_Ee17MB1x0GwRdo,12669
@@ -108,8 +108,8 @@ cloudnetpy/products/mie_lu_tables.nc,sha256=It4fYpqJXlqOgL8jeZ-PxGzP08PMrELIDVe5
108
108
  cloudnetpy/products/mwr_tools.py,sha256=tN_sPDS3BdpFJfa5a2mnc3eCMoi7syjVJMaTt962hmo,5004
109
109
  cloudnetpy/products/product_tools.py,sha256=VNw2diJj30POz68-3qNVkJP7r9AUspT_d1Fp0BbeIx8,10414
110
110
  docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
111
- cloudnetpy-1.65.4.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
112
- cloudnetpy-1.65.4.dist-info/METADATA,sha256=03NRS2aq4SU7NYndDEgxYHOYUPyg4qQWnjlF4h5N8C8,5784
113
- cloudnetpy-1.65.4.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
114
- cloudnetpy-1.65.4.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
115
- cloudnetpy-1.65.4.dist-info/RECORD,,
111
+ cloudnetpy-1.65.5.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
112
+ cloudnetpy-1.65.5.dist-info/METADATA,sha256=CiSZoaISK9HEGkWWu0VRiYSjJ8E4YX3UUEQYXmLLqdg,5784
113
+ cloudnetpy-1.65.5.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
114
+ cloudnetpy-1.65.5.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
115
+ cloudnetpy-1.65.5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.0.0)
2
+ Generator: setuptools (74.1.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5