pypromice 1.4.3__py3-none-any.whl → 1.5.0__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.

Potentially problematic release.


This version of pypromice might be problematic. Click here for more details.

pypromice/process/aws.py CHANGED
@@ -94,7 +94,7 @@ class AWS(object):
94
94
  formats = {dataset.attrs["format"].lower() for dataset in self.L0}
95
95
  if "raw" in formats:
96
96
  self.format = "raw"
97
- elif "STM" in formats:
97
+ elif "stm" in formats:
98
98
  self.format = "STM"
99
99
  elif "tx" in formats:
100
100
  self.format = "tx"
@@ -123,22 +123,6 @@ class AWS(object):
123
123
  self.getL2()
124
124
  self.getL3()
125
125
 
126
- def writeL2(self, outpath):
127
- """Write L2 data to .csv and .nc file"""
128
- if os.path.isdir(outpath):
129
- self.writeArr(self.L2, outpath)
130
- else:
131
- logger.info(f"Outpath f{outpath} does not exist. Unable to save to file")
132
- pass
133
-
134
- def writeL3(self, outpath):
135
- """Write L3 data to .csv and .nc file"""
136
- if os.path.isdir(outpath):
137
- self.writeArr(self.L3, outpath)
138
- else:
139
- logger.info(f"Outpath f{outpath} does not exist. Unable to save to file")
140
- pass
141
-
142
126
  def getL1(self):
143
127
  """Perform L0 to L1 data processing"""
144
128
  logger.info("Level 1 processing...")
@@ -164,28 +148,6 @@ class AWS(object):
164
148
  logger.info("Level 3 processing...")
165
149
  self.L3 = toL3(self.L2, data_adjustments_dir=self.data_issues_repository / "adjustments")
166
150
 
167
- def writeArr(self, dataset, outpath, t=None):
168
- """Write L3 data to .nc and .csv hourly and daily files
169
-
170
- Parameters
171
- ----------
172
- dataset : xarray.Dataset
173
- Dataset to write to file
174
- outpath : str
175
- Output directory
176
- t : str
177
- Resampling string. This is automatically defined based
178
- on the data type if not given. The default is None.
179
- """
180
- if t is not None:
181
- write.prepare_and_write(dataset, outpath, self.vars, self.meta, t)
182
- else:
183
- f = [l.attrs["format"] for l in self.L0]
184
- if "raw" in f or "STM" in f:
185
- write.prepare_and_write(dataset, outpath, self.vars, self.meta, "10min")
186
- else:
187
- write.prepare_and_write(dataset, outpath, self.vars, self.meta, "60min")
188
-
189
151
  def loadConfig(self, config_file, inpath):
190
152
  """Load configuration from .toml file
191
153
 
@@ -538,9 +538,9 @@ def join_l3(config_folder, site, folder_l3, folder_gcnet, outpath, variables, me
538
538
  v = pypromice.resources.load_variables(variables)
539
539
  m = pypromice.resources.load_metadata(metadata)
540
540
  if outpath is not None:
541
- prepare_and_write(l3_merged, outpath, v, m, "60min")
542
- prepare_and_write(l3_merged, outpath, v, m, "1D")
543
- prepare_and_write(l3_merged, outpath, v, m, "M")
541
+ prepare_and_write(l3_merged, outpath, v, m, "60min", nc_compression=True)
542
+ prepare_and_write(l3_merged, outpath, v, m, "1D", nc_compression=True)
543
+ prepare_and_write(l3_merged, outpath, v, m, "M", nc_compression=True)
544
544
  return l3_merged, sorted_list_station_data
545
545
 
546
546
 
@@ -51,12 +51,13 @@ def resample_dataset(ds_h, t):
51
51
  # taking the 10 min data and using it as instantaneous values:
52
52
  is_10_minutes_timestamp = (ds_h.time.diff(dim='time') / np.timedelta64(1, 's') == 600)
53
53
  if (t == '60min') and is_10_minutes_timestamp.any():
54
- cols_to_update = ['p_i', 't_i', 'rh_i', 'rh_i_cor', 'wspd_i', 'wdir_i','wspd_x_i','wspd_y_i']
54
+ cols_to_update = ['p_i', 't_i', 'rh_i', 'rh_i_wrt_ice_or_water', 'wspd_i', 'wdir_i','wspd_x_i','wspd_y_i']
55
+ cols_origin = ['p_u', 't_u', 'rh_u', 'rh_u_wrt_ice_or_water', 'wspd_u', 'wdir_u','wspd_x_u','wspd_y_u']
55
56
  timestamp_10min = ds_h.time.where(is_10_minutes_timestamp, drop=True).to_index()
56
57
  timestamp_round_hour = df_d.index
57
58
  timestamp_to_update = timestamp_round_hour.intersection(timestamp_10min)
58
59
 
59
- for col in cols_to_update:
60
+ for col, col_org in zip(cols_to_update, cols_origin):
60
61
  if col not in df_d.columns:
61
62
  df_d[col] = np.nan
62
63
  else:
@@ -67,7 +68,7 @@ def resample_dataset(ds_h, t):
67
68
  timestamp_to_update = timestamp_to_update[missing_instantaneous]
68
69
  df_d.loc[timestamp_to_update, col] = ds_h.reindex(
69
70
  time= timestamp_to_update
70
- )[col.replace('_i','_u')].values
71
+ )[col_org].values
71
72
  if col == 'p_i':
72
73
  df_d.loc[timestamp_to_update, col] = df_d.loc[timestamp_to_update, col].values-1000
73
74
 
@@ -95,8 +96,8 @@ def resample_dataset(ds_h, t):
95
96
 
96
97
  df_d[var] = (p_vap.to_series().resample(t).mean() \
97
98
  / es_wtr.to_series().resample(t).mean())*100
98
- if var+'_cor' in df_d.keys():
99
- df_d[var+'_cor'] = (p_vap.to_series().resample(t).mean() \
99
+ if var+'_wrt_ice_or_water' in df_d.keys():
100
+ df_d[var+'_wrt_ice_or_water'] = (p_vap.to_series().resample(t).mean() \
100
101
  / es_cor.to_series().resample(t).mean())*100
101
102
 
102
103
  # passing each variable attribute to the ressample dataset
@@ -2,6 +2,8 @@ import numpy as np
2
2
  import pandas
3
3
  import xarray
4
4
 
5
+ from pypromice.utilities.dependency_graph import DependencyGraph
6
+
5
7
 
6
8
  def clip_values(
7
9
  ds: xarray.Dataset,
@@ -9,8 +11,6 @@ def clip_values(
9
11
  ):
10
12
  """
11
13
  Clip values in dataset to defined "hi" and "lo" variables from dataframe.
12
- There is a special treatment here for rh_u and rh_l variables, where values
13
- are clipped and not assigned to NaN. This is for replication purposes
14
14
 
15
15
  Parameters
16
16
  ----------
@@ -27,9 +27,15 @@ def clip_values(
27
27
  cols = ["lo", "hi", "OOL"]
28
28
  assert set(cols) <= set(var_configurations.columns)
29
29
 
30
- variable_limits = var_configurations[cols].dropna(how="all")
31
- for var, row in variable_limits.iterrows():
30
+ variable_limits = var_configurations[cols].assign(
31
+ dependents=lambda df: df.OOL.fillna("").str.split(),
32
+ # Find the closure of dependents using the DependencyGraph class
33
+ dependents_closure=lambda df: DependencyGraph.from_child_mapping(
34
+ df.dependents
35
+ ).child_closure_mapping(),
36
+ )
32
37
 
38
+ for var, row in variable_limits.iterrows():
33
39
  if var not in list(ds.variables):
34
40
  continue
35
41
 
@@ -38,15 +44,10 @@ def clip_values(
38
44
  if ~np.isnan(row.hi):
39
45
  ds[var] = ds[var].where(ds[var] <= row.hi)
40
46
 
41
- other_vars = row.OOL
42
- if isinstance(other_vars, str) and ~ds[var].isnull().all():
43
- for o in other_vars.split():
44
- if o not in list(ds.variables):
45
- continue
46
- else:
47
- if ~np.isnan(row.lo):
48
- ds[var] = ds[var].where(ds[var] >= row.lo)
49
- if ~np.isnan(row.hi):
50
- ds[var] = ds[var].where(ds[var] <= row.hi)
47
+ # Flag dependents as NaN if parent is NaN
48
+ for o in row.dependents_closure:
49
+ if o not in list(ds.variables):
50
+ continue
51
+ ds[o] = ds[o].where(ds[var].notnull())
51
52
 
52
53
  return ds
@@ -17,7 +17,13 @@ logger = logging.getLogger(__name__)
17
17
 
18
18
 
19
19
  def prepare_and_write(
20
- dataset, output_path: Path | str, vars_df=None, meta_dict=None, time="60min", resample=True
20
+ dataset,
21
+ output_path: Path | str,
22
+ vars_df=None,
23
+ meta_dict=None,
24
+ time="60min",
25
+ resample=True,
26
+ nc_compression:bool=False,
21
27
  ):
22
28
  """Prepare data with resampling, formating and metadata population; then
23
29
  write data to .nc and .csv hourly and daily files
@@ -100,14 +106,14 @@ def prepare_and_write(
100
106
  elif t == 86400:
101
107
  # removing instantaneous values from daily and monthly files
102
108
  for v in col_names:
103
- if ("_i" in v) and ("_i_" not in v):
109
+ if v in ['p_i', 't_i', 'rh_i', 'wspd_i', 'wdir_i', 'wspd_x_i', 'wspd_y_i']:
104
110
  col_names.remove(v)
105
111
  out_csv = output_dir / f"{name}_day.csv"
106
112
  out_nc = output_dir / f"{name}_day.nc"
107
113
  else:
108
114
  # removing instantaneous values from daily and monthly files
109
115
  for v in col_names:
110
- if ("_i" in v) and ("_i_" not in v):
116
+ if v in ['p_i', 't_i', 'rh_i', 'wspd_i', 'wdir_i', 'wspd_x_i', 'wspd_y_i']:
111
117
  col_names.remove(v)
112
118
  out_csv = output_dir / f"{name}_month.csv"
113
119
  out_nc = output_dir / f"{name}_month.nc"
@@ -117,40 +123,11 @@ def prepare_and_write(
117
123
  writeCSV(out_csv, d2, col_names)
118
124
 
119
125
  # Write to netcdf file
120
- writeNC(out_nc, d2, col_names)
126
+ writeNC(out_nc, d2, col_names, compression=nc_compression)
121
127
  logger.info(f"Written to {out_csv}")
122
128
  logger.info(f"Written to {out_nc}")
123
129
 
124
130
 
125
- def writeAll(outpath, station_id, l3_h, l3_d, l3_m, csv_order=None):
126
- """Write L3 hourly, daily and monthly datasets to .nc and .csv
127
- files
128
-
129
- Parameters
130
- ----------
131
- outpath : str
132
- Output file path
133
- station_id : str
134
- Station name
135
- l3_h : xr.Dataset
136
- L3 hourly data
137
- l3_d : xr.Dataset
138
- L3 daily data
139
- l3_m : xr.Dataset
140
- L3 monthly data
141
- csv_order : list, optional
142
- List order of variables
143
- """
144
- if not os.path.isdir(outpath):
145
- os.mkdir(outpath)
146
- outfile_h = os.path.join(outpath, station_id + "_hour")
147
- outfile_d = os.path.join(outpath, station_id + "_day")
148
- outfile_m = os.path.join(outpath, station_id + "_month")
149
- for o, l in zip([outfile_h, outfile_d, outfile_m], [l3_h, l3_d, l3_m]):
150
- writeCSV(o + ".csv", l, csv_order)
151
- writeNC(o + ".nc", l)
152
-
153
-
154
131
  def writeCSV(outfile, Lx, csv_order):
155
132
  """Write data product to CSV file
156
133
 
@@ -170,8 +147,8 @@ def writeCSV(outfile, Lx, csv_order):
170
147
  Lcsv.to_csv(outfile)
171
148
 
172
149
 
173
- def writeNC(outfile, Lx, col_names=None):
174
- """Write data product to NetCDF file
150
+ def writeNC(outfile, Lx, col_names=None, compression=False):
151
+ """Write data product to NetCDF file with compression
175
152
 
176
153
  Parameters
177
154
  ----------
@@ -187,7 +164,14 @@ def writeNC(outfile, Lx, col_names=None):
187
164
  else:
188
165
  names = list(Lx.keys())
189
166
 
190
- Lx[names].to_netcdf(outfile, mode="w", format="NETCDF4", compute=True)
167
+ encoding = {var: dict() for var in names}
168
+
169
+ if compression:
170
+ comp = dict(zlib=True, complevel=4)
171
+ for var in names:
172
+ encoding[var].update(comp)
173
+
174
+ Lx[names].to_netcdf(outfile, mode="w", format="NETCDF4", compute=True, encoding=encoding)
191
175
 
192
176
 
193
177
  def getColNames(vars_df, ds, remove_nan_fields=False):
@@ -484,7 +468,7 @@ def reformat_time(dataset):
484
468
  return dataset
485
469
 
486
470
 
487
- def reformat_lon(dataset, exempt=["UWN", "Roof_GEUS", "Roof_PROMICE"]):
471
+ def reformat_lon(dataset, exempt=["UWN", "Roof_GEUS", "Roof_PROMICE", "ORO"]):
488
472
  """Switch gps_lon to negative values (degrees_east). We do this here, and
489
473
  NOT in addMeta, otherwise we switch back to positive when calling getMeta
490
474
  in joinL2"""
@@ -5,10 +5,10 @@ p_l,
5
5
  t_u,TA2
6
6
  t_l,TA1
7
7
  rh_u,RH2
8
- rh_u_cor,RH2_cor
8
+ rh_u_wrt_ice_or_water,RH2_cor
9
9
  qh_u,Q2
10
10
  rh_l,RH1
11
- rh_l_cor,RH1_cor
11
+ rh_l_wrt_ice_or_water,RH1_cor
12
12
  qh_l,Q1
13
13
  wspd_u,VW2
14
14
  wspd_l,VW1
@@ -1,53 +1,53 @@
1
1
  field,standard_name,long_name,units,coverage_content_type,coordinates,instantaneous_hourly,where_to_find,lo,hi,OOL,station_type,L0,L2,L3,max_decimals
2
2
  time,time,Time,yyyy-mm-dd HH:MM:SS,physicalMeasurement,time,,,,,,all,1,1,1,
3
3
  rec,record,Record,-,referenceInformation,time,,L0 or L2,,,,all,1,1,0,0
4
- p_u,air_pressure,Air pressure (upper boom),hPa,physicalMeasurement,time,FALSE,,650,1100,z_pt z_pt_cor dshf_u dlhf_u qh_u,all,1,1,1,4
5
- p_l,air_pressure,Air pressure (lower boom),hPa,physicalMeasurement,time,FALSE,,650,1100,dshf_l dlhf_l qh_l,two-boom,1,1,1,4
6
- t_u,air_temperature,Air temperature (upper boom),degrees_C,physicalMeasurement,time,FALSE,,-80,40,rh_u_cor cc dsr_cor usr_cor z_boom z_stake dshf_u dlhf_u qh_u,all,1,1,1,4
7
- t_l,air_temperature,Air temperature (lower boom),degrees_C,physicalMeasurement,time,FALSE,,-80,40,rh_l_cor z_boom_l dshf_l dlhf_l qh_l,two-boom,1,1,1,4
8
- rh_u,relative_humidity,Relative humidity (upper boom),%,physicalMeasurement,time,FALSE,,0,100,rh_u_cor,all,1,1,1,4
9
- rh_u_cor,relative_humidity_corrected,Relative humidity (upper boom) - corrected,%,modelResult,time,FALSE,L2 or later,0,150,dshf_u dlhf_u qh_u,all,0,1,1,4
10
- qh_u,specific_humidity,Specific humidity (upper boom),kg/kg,modelResult,time,FALSE,L2 or later,0,100,,all,0,1,1,4
11
- rh_l,relative_humidity,Relative humidity (lower boom),%,physicalMeasurement,time,FALSE,,0,100,rh_l_cor,two-boom,1,1,1,4
12
- rh_l_cor,relative_humidity_corrected,Relative humidity (lower boom) - corrected,%,modelResult,time,FALSE,L2 or later,0,150,dshf_l dlhf_l qh_l,two-boom,0,1,1,4
4
+ p_u,air_pressure,Air pressure (upper boom),hPa,physicalMeasurement,time,FALSE,,650,1100,"",all,1,1,1,4
5
+ p_l,air_pressure,Air pressure (lower boom),hPa,physicalMeasurement,time,FALSE,,650,1100,"",two-boom,1,1,1,4
6
+ t_u,air_temperature,Air temperature (upper boom),degrees_C,physicalMeasurement,time,FALSE,,-80,40,"",all,1,1,1,4
7
+ t_l,air_temperature,Air temperature (lower boom),degrees_C,physicalMeasurement,time,FALSE,,-80,40,"",two-boom,1,1,1,4
8
+ rh_u,relative_humidity,Relative humidity (upper boom),%,physicalMeasurement,time,FALSE,,0,100,"",all,1,1,1,4
9
+ rh_u_wrt_ice_or_water,relative_humidity_with_respect_to_ice_or_water,Relative humidity (upper boom) with respect to saturation over ice in subfreezing conditions and over water otherwise,%,modelResult,time,FALSE,L2 or later,0,150,"",all,0,1,1,4
10
+ qh_u,specific_humidity,Specific humidity (upper boom),kg/kg,modelResult,time,FALSE,L2 or later,0,100,"",all,0,1,1,4
11
+ rh_l,relative_humidity,Relative humidity (lower boom),%,physicalMeasurement,time,FALSE,,0,100,"",two-boom,1,1,1,4
12
+ rh_l_wrt_ice_or_water,relative_humidity_with_respect_to_ice_or_water,Relative humidity (lower boom) with respect to saturation over ice in subfreezing conditions and over water otherwise,%,modelResult,time,FALSE,L2 or later,0,150,"",two-boom,0,1,1,4
13
13
  qh_l,specific_humidity,Specific humidity (lower boom),kg/kg,modelResult,time,FALSE,L2 or later,0,100,,two-boom,0,1,1,4
14
- wspd_u,wind_speed,Wind speed (upper boom),m s-1,physicalMeasurement,time,FALSE,,0,100,"wdir_u wspd_x_u wspd_y_u dshf_u dlhf_u qh_u, precip_u",all,1,1,1,4
15
- wspd_l,wind_speed,Wind speed (lower boom),m s-1,physicalMeasurement,time,FALSE,,0,100,"wdir_l wspd_x_l wspd_y_l dshf_l dlhf_l qh_l , precip_l",two-boom,1,1,1,4
14
+ wspd_u,wind_speed,Wind speed (upper boom),m s-1,physicalMeasurement,time,FALSE,,0,100,wdir_u wspd_x_u wspd_y_u,all,1,1,1,4
15
+ wspd_l,wind_speed,Wind speed (lower boom),m s-1,physicalMeasurement,time,FALSE,,0,100,wdir_l wspd_x_l wspd_y_l,two-boom,1,1,1,4
16
16
  wdir_u,wind_from_direction,Wind from direction (upper boom),degrees,physicalMeasurement,time,FALSE,,1,360,wspd_x_u wspd_y_u,all,1,1,1,4
17
17
  wdir_std_u,wind_from_direction_standard_deviation,Wind from direction (standard deviation),degrees,qualityInformation,time,FALSE,L0 or L2,,,,one-boom,1,1,0,4
18
18
  wdir_l,wind_from_direction,Wind from direction (lower boom),degrees,physicalMeasurement,time,FALSE,,1,360,wspd_x_l wspd_y_l,two-boom,1,1,1,4
19
- wspd_x_u,wind_speed_from_x_direction,Wind speed from x direction (upper boom),m s-1,modelResult,time,FALSE,L0 or L2,-100,100,wdir_u wspd_u,all,0,1,1,4
20
- wspd_y_u,wind_speed_from_y_direction,Wind speed from y direction (upper boom),m s-1,modelResult,time,FALSE,L0 or L2,-100,100,wdir_u wspd_u,all,0,1,1,4
21
- wspd_x_l,wind_speed_from_x_direction,Wind speed from x direction (lower boom),m s-1,modelResult,time,FALSE,L0 or L2,-100,100,wdir_l wspd_l,two-boom,0,1,1,4
22
- wspd_y_l,wind_speed_from_y_direction,Wind speed from y direction (lower boom),m s-1,modelResult,time,FALSE,L0 or L2,-100,100,wdir_l wspd_l,two-boom,0,1,1,4
23
- dsr,surface_downwelling_shortwave_flux,Downwelling shortwave radiation,W m-2,physicalMeasurement,time,FALSE,,-10,1500,albedo dsr_cor usr_cor,all,1,1,1,4
19
+ wspd_x_u,wind_speed_from_x_direction,Wind speed from x direction (upper boom),m s-1,modelResult,time,FALSE,L0 or L2,-100,100,"",all,0,1,1,4
20
+ wspd_y_u,wind_speed_from_y_direction,Wind speed from y direction (upper boom),m s-1,modelResult,time,FALSE,L0 or L2,-100,100,"",all,0,1,1,4
21
+ wspd_x_l,wind_speed_from_x_direction,Wind speed from x direction (lower boom),m s-1,modelResult,time,FALSE,L0 or L2,-100,100,"",two-boom,0,1,1,4
22
+ wspd_y_l,wind_speed_from_y_direction,Wind speed from y direction (lower boom),m s-1,modelResult,time,FALSE,L0 or L2,-100,100,"",two-boom,0,1,1,4
23
+ dsr,surface_downwelling_shortwave_flux,Downwelling shortwave radiation,W m-2,physicalMeasurement,time,FALSE,,-10,1500,"",all,1,1,1,4
24
24
  dsr_cor,surface_downwelling_shortwave_flux_corrected,Downwelling shortwave radiation - corrected,W m-2,modelResult,time,FALSE,L2 or later,,,,all,0,1,1,4
25
- usr,surface_upwelling_shortwave_flux,Upwelling shortwave radiation,W m-2,physicalMeasurement,time,FALSE,,-10,1000,albedo dsr_cor usr_cor,all,1,1,1,4
25
+ usr,surface_upwelling_shortwave_flux,Upwelling shortwave radiation,W m-2,physicalMeasurement,time,FALSE,,-10,1000,"",all,1,1,1,4
26
26
  usr_cor,surface_upwelling_shortwave_flux_corrected,Upwelling shortwave radiation - corrected,W m-2,modelResult,time,FALSE,L2 or later,0,1000,,all,0,1,1,4
27
27
  albedo,surface_albedo,Albedo,-,modelResult,time,FALSE,L2 or later,,,,all,0,1,1,4
28
- dlr,surface_downwelling_longwave_flux,Downwelling longwave radiation,W m-2,physicalMeasurement,time,FALSE,,50,500,albedo dsr_cor usr_cor cc t_surf,all,1,1,1,4
29
- ulr,surface_upwelling_longwave_flux,Upwelling longwave radiation,W m-2,physicalMeasurement,time,FALSE,,50,500,t_surf,all,1,1,1,4
28
+ dlr,surface_downwelling_longwave_flux,Downwelling longwave radiation,W m-2,physicalMeasurement,time,FALSE,,50,500,"",all,1,1,1,4
29
+ ulr,surface_upwelling_longwave_flux,Upwelling longwave radiation,W m-2,physicalMeasurement,time,FALSE,,50,500,"",all,1,1,1,4
30
30
  cc,cloud_area_fraction,Cloud cover,%,modelResult,time,FALSE,L2 or later,,,,all,0,1,1,4
31
- t_surf,surface_temperature,Surface temperature,C,modelResult,time,FALSE,L2 or later,-80,40,dshf_u dlhf_u qh_u,all,0,1,1,4
31
+ t_surf,surface_temperature,Surface temperature,C,modelResult,time,FALSE,L2 or later,-80,40,"",all,0,1,1,4
32
32
  dlhf_u,surface_downward_latent_heat_flux,Latent heat flux (upper boom),W m-2,modelResult,time,FALSE,L3 or later,,,,all,0,0,1,4
33
33
  dlhf_l,surface_downward_latent_heat_flux,Latent heat flux (lower boom),W m-2,modelResult,time,FALSE,L3 or later,,,,two-boom,0,0,1,4
34
34
  dshf_u,surface_downward_sensible_heat_flux,Sensible heat flux (upper boom),W m-2,modelResult,time,FALSE,L3 or later,,,,all,0,0,1,4
35
35
  dshf_l,surface_downward_sensible_heat_flux,Sensible heat flux (lower boom),W m-2,modelResult,time,FALSE,L3 or later,,,,two-boom,0,0,1,4
36
- z_boom_u,distance_to_surface_from_boom,Upper boom height,m,physicalMeasurement,time,TRUE,,0.3,10,dshf_u dlhf_u qh_u,all,1,1,1,4
36
+ z_boom_u,distance_to_surface_from_boom,Upper boom height,m,physicalMeasurement,time,TRUE,,0.3,10,"",all,1,1,1,4
37
37
  z_boom_q_u,distance_to_surface_from_boom_quality,Upper boom height (quality),-,qualityInformation,time,TRUE,L0 or L2,,,,all,1,1,0,4
38
- z_boom_l,distance_to_surface_from_boom,Lower boom height,m,physicalMeasurement,time,TRUE,,0.3,5,dshf_l dlhf_l qh_l,two-boom,1,1,1,4
38
+ z_boom_l,distance_to_surface_from_boom,Lower boom height,m,physicalMeasurement,time,TRUE,,0.3,5,"",two-boom,1,1,1,4
39
39
  z_boom_q_l,distance_to_surface_from_boom_quality,Lower boom height (quality),-,qualityInformation,time,TRUE,L0 or L2,,,,two-boom,1,1,0,4
40
40
  z_stake,distance_to_surface_from_stake_assembly,Stake height,m,physicalMeasurement,time,TRUE,,0.3,8,,one-boom,1,1,1,4
41
41
  z_stake_q,distance_to_surface_from_stake_assembly_quality,Stake height (quality),-,qualityInformation,time,TRUE,L0 or L2,,,,one-boom,1,1,0,4
42
- z_pt,depth_of_pressure_transducer_in_ice,Depth of pressure transducer in ice,m,physicalMeasurement,time,FALSE,,0,30,z_pt_cor,one-boom,1,1,1,4
42
+ z_pt,depth_of_pressure_transducer_in_ice,Depth of pressure transducer in ice,m,physicalMeasurement,time,FALSE,,0,30,"",one-boom,1,1,1,4
43
43
  z_pt_cor,depth_of_pressure_transducer_in_ice_corrected,Depth of pressure transducer in ice - corrected,m,modelResult,time,FALSE,L2 or later,0,30,,one-boom,0,1,1,4
44
44
  z_surf_combined,height_of_surface_combined,"Surface height combined from multiple sensors, relative to ice surface height at installation",m,modelResult,time,FALSE,L3,,,,all,0,0,1,4
45
45
  z_ice_surf,height_of_ice_surface,"Ice surface height, relative to ice surface height at installation and calculated from pt_cor and z_stake",m,modelResult,time,FALSE,L3,,,,one-boom,0,0,1,4
46
46
  snow_height,height_of_snow,"Snow surface height, relative to ice surface",m,modelResult,time,FALSE,L3,0,,,one-boom,0,0,1,4
47
- precip_u,precipitation,Precipitation (upper boom) (cumulative solid & liquid),mm,physicalMeasurement,time,TRUE,,0,,precip_u_cor precip_u_rate,all,1,1,1,4
47
+ precip_u,precipitation,Precipitation (upper boom) (cumulative solid & liquid),mm,physicalMeasurement,time,TRUE,,0,,"",all,1,1,1,4
48
48
  precip_u_cor,precipitation_corrected,Precipitation (upper boom) (cumulative solid & liquid) – corrected,mm,modelResult,time,TRUE,L2 or later,0,,,all,0,1,1,4
49
49
  precip_u_rate,precipitation_rate,Precipitation rate (upper boom) (cumulative solid & liquid) – corrected,mm,modelResult,time,TRUE,L2 or later,0,,,all,0,1,1,4
50
- precip_l,precipitation,Precipitation (lower boom) (cumulative solid & liquid),mm,physicalMeasurement,time,TRUE,,0,,precip_l_cor precip_l_rate,two-boom,1,1,1,4
50
+ precip_l,precipitation,Precipitation (lower boom) (cumulative solid & liquid),mm,physicalMeasurement,time,TRUE,,0,,"",two-boom,1,1,1,4
51
51
  precip_l_cor,precipitation_corrected,Precipitation (lower boom) (cumulative solid & liquid) – corrected,mm,modelResult,time,TRUE,L2 or later,0,,,two-boom,0,1,1,4
52
52
  precip_l_rate,precipitation_rate,Precipitation rate (lower boom) (cumulative solid & liquid) – corrected,mm,modelResult,time,TRUE,L2 or later,0,,,two-boom,0,1,1,4
53
53
  t_i_1,ice_temperature_at_t1,Ice temperature at sensor 1,degrees_C,physicalMeasurement,time,FALSE,,-80,1,,all,1,1,1,4
@@ -73,8 +73,8 @@ d_t_i_9,depth_of_thermistor_9,Depth of thermistor 9,m,modelResult,time,FALSE,L3,
73
73
  d_t_i_10,depth_of_thermistor_10,Depth of thermistor 10,m,modelResult,time,FALSE,L3,-10,100,,two-boom,0,0,1,4
74
74
  d_t_i_11,depth_of_thermistor_11,Depth of thermistor 11,m,modelResult,time,FALSE,L3,-10,100,,two-boom,0,0,1,4
75
75
  t_i_10m,10m_subsurface_temperature,10 m subsurface temperature,degrees_C,modelResult,time,FALSE,L3,-70,0,,all,0,0,1,4
76
- tilt_x,platform_view_angle_x,Tilt to east,degrees,physicalMeasurement,time,FALSE,,-30,30,dsr_cor usr_cor albedo,all,1,1,1,4
77
- tilt_y,platform_view_angle_y,Tilt to north,degrees,physicalMeasurement,time,FALSE,,-30,30,dsr_cor usr_cor albedo,all,1,1,1,4
76
+ tilt_x,platform_view_angle_x,Tilt to east,degrees,physicalMeasurement,time,FALSE,,-30,30,"",all,1,1,1,4
77
+ tilt_y,platform_view_angle_y,Tilt to north,degrees,physicalMeasurement,time,FALSE,,-30,30,"",all,1,1,1,4
78
78
  rot,platform_azimuth_angle,Station rotation from true North,degrees,physicalMeasurement,time,FALSE,,0,360,,all,1,1,1,2
79
79
  gps_lat,gps_latitude,Latitude,degrees_north,physicalMeasurement,time,TRUE,,50,83,,all,1,1,1,6
80
80
  gps_lon,gps_longitude,Longitude,degrees_east,physicalMeasurement,time,TRUE,,5,70,,all,1,1,1,6
@@ -93,14 +93,14 @@ batt_v_ini,,,-,physicalMeasurement,time,TRUE,L0 or L2,0,30,,,1,1,0,2
93
93
  batt_v_ss,battery_voltage_at_sample_start,Battery voltage (sample start),V,physicalMeasurement,time,TRUE,L0 or L2,0,30,,,1,1,0,2
94
94
  fan_dc_u,fan_current,Fan current (upper boom),mA,physicalMeasurement,time,TRUE,L0 or L2,0,200,,all,1,1,0,2
95
95
  fan_dc_l,fan_current,Fan current (lower boom),mA,physicalMeasurement,time,TRUE,,0,200,,two-boom,1,1,0,2
96
- freq_vw,frequency_of_precipitation_wire_vibration,Frequency of vibrating wire in precipitation gauge,Hz,physicalMeasurement,time,TRUE,L0 or L2,0,10000,precip_u,,1,1,0,
96
+ freq_vw,frequency_of_precipitation_wire_vibration,Frequency of vibrating wire in precipitation gauge,Hz,physicalMeasurement,time,TRUE,L0 or L2,0,10000,"",,1,1,0,
97
97
  t_log,temperature_of_logger,Logger temperature,degrees_C,physicalMeasurement,time,TRUE,,-80,40,,one-boom,1,1,0,4
98
- t_rad,temperature_of_radiation_sensor,Radiation sensor temperature,degrees_C,physicalMeasurement,time,FALSE,,-80,40,t_surf dlr ulr,all,1,1,1,4
98
+ t_rad,temperature_of_radiation_sensor,Radiation sensor temperature,degrees_C,physicalMeasurement,time,FALSE,,-80,40,"",all,1,1,1,4
99
99
  p_i,air_pressure,Air pressure (instantaneous) minus 1000,hPa,physicalMeasurement,time,TRUE,,-350,100,,all,1,1,1,4
100
100
  t_i,air_temperature,Air temperature (instantaneous),degrees_C,physicalMeasurement,time,TRUE,,-80,40,,all,1,1,1,4
101
- rh_i,relative_humidity,Relative humidity (instantaneous),%,physicalMeasurement,time,TRUE,,0,150,rh_i_cor,all,1,1,1,4
102
- rh_i_cor,relative_humidity_corrected,Relative humidity (instantaneous) corrected,%,modelResult,time,TRUE,L2 or later,0,100,,all,0,1,1,4
101
+ rh_i,relative_humidity,Relative humidity (instantaneous),%,physicalMeasurement,time,TRUE,,0,150,"",all,1,1,1,4
102
+ rh_i_wrt_ice_or_water,relative_humidity_with_respect_to_ice_or_water,Relative humidity (instantaneous) with respect to saturation over ice in subfreezing conditions and over water otherwise,%,modelResult,time,TRUE,L2 or later,0,100,,all,0,1,1,4
103
103
  wspd_i,wind_speed,Wind speed (instantaneous),m s-1,physicalMeasurement,time,TRUE,,0,100,wdir_i wspd_x_i wspd_y_i,all,1,1,1,4
104
104
  wdir_i,wind_from_direction,Wind from direction (instantaneous),degrees,physicalMeasurement,time,TRUE,,1,360,wspd_x_i wspd_y_i,all,1,1,1,4
105
- wspd_x_i,wind_speed_from_x_direction,Wind speed from x direction (instantaneous),m s-1,modelResult,time,TRUE,L2 or later,-100,100,wdir_i wspd_i,all,0,1,1,4
106
- wspd_y_i,wind_speed_from_y_direction,Wind speed from y direction (instantaneous),m s-1,modelResult,time,TRUE,L2 or later,-100,100,wdir_i wspd_i,all,0,1,1,4
105
+ wspd_x_i,wind_speed_from_x_direction,Wind speed from x direction (instantaneous),m s-1,modelResult,time,TRUE,L2 or later,-100,100,"",all,0,1,1,4
106
+ wspd_y_i,wind_speed_from_y_direction,Wind speed from y direction (instantaneous),m s-1,modelResult,time,TRUE,L2 or later,-100,100,"",all,0,1,1,4
@@ -67,6 +67,7 @@ type,expected_values,format,description,flags,notes
67
67
  90,48, tfffffffffffffffffffffffffffffffffgnefffffffffff,THE GC-NET VERSION!,don’t use,GC-NET stations
68
68
  90,48,tfffffffffffffffffffffffffffffffffgnefffffffffff,THE GC-NET VERSION!,,GC-NET stations
69
69
  95,46,tfffffffffffffffffffffffffffffffgnefffffffffff,THE GC-NET VERSION!,,GC-NET stations
70
+ 115,47,tfffffffffffffffffffffffffffffffffgneffffffffff,PREMAS version,,PREMAS stations
70
71
  220,29,tfffffffffffffffffffffffnefff,ZAMG Freya 2015 summer message,,ZAMG Freya aws
71
72
  221,0,,,,ZAMG Freya aws
72
73
  222,29,tfffffffffffffffffffffffnefff,ZAMG Freya 2015 winter message,,ZAMG Freya aws
@@ -0,0 +1,101 @@
1
+ from typing import Mapping, Set, MutableMapping, Optional
2
+
3
+ import attr
4
+
5
+ __all__ = [
6
+ "DependencyNode",
7
+ "DependencyGraph",
8
+ ]
9
+
10
+
11
+ @attr.define
12
+ class DependencyNode:
13
+ name: str = attr.field()
14
+ parents: Set["DependencyNode"] = attr.field(factory=set)
15
+ children: Set["DependencyNode"] = attr.field(factory=set)
16
+
17
+ def add_child(self, child: "DependencyNode"):
18
+ self.children.add(child)
19
+ child.parents.add(self)
20
+
21
+ def get_children_closure(self, closure: Optional[Set[str]] = None) -> Set[str]:
22
+ is_root = closure is None
23
+ if closure is None:
24
+ closure = set()
25
+ if self.name in closure:
26
+ return closure
27
+ closure.add(self.name)
28
+ for child in self.children:
29
+ closure |= child.get_children_closure(closure)
30
+
31
+ if is_root:
32
+ closure.remove(self.name)
33
+ return closure
34
+
35
+ def get_parents_closure(self, closure: Optional[Set[str]] = None) -> Set[str]:
36
+ is_root = closure is None
37
+ if closure is None:
38
+ closure = set()
39
+ if self.name in closure:
40
+ return closure
41
+ closure.add(self.name)
42
+ for parent in self.parents:
43
+ closure |= parent.get_parents_closure(closure)
44
+
45
+ if is_root:
46
+ closure.remove(self.name)
47
+ return closure
48
+
49
+ def __hash__(self):
50
+ return hash(self.name)
51
+
52
+
53
+ @attr.define
54
+ class DependencyGraph:
55
+ nodes: MutableMapping[str, DependencyNode] = attr.field(factory=dict)
56
+
57
+ def add_node(self, name: str) -> DependencyNode:
58
+ if name not in self.nodes:
59
+ self.nodes[name] = DependencyNode(name)
60
+ return self.nodes[name]
61
+
62
+ def add_edge(self, parent: str, child: str):
63
+ parent_node = self.add_node(parent)
64
+ child_node = self.add_node(child)
65
+ parent_node.add_child(child_node)
66
+
67
+ @classmethod
68
+ def from_child_mapping(cls, mapping: Mapping[str, Set[str]]) -> "DependencyGraph":
69
+ graph = cls()
70
+ for var, children in mapping.items():
71
+ graph.add_node(var)
72
+ for child in children:
73
+ graph.add_edge(var, child)
74
+ return graph
75
+
76
+ @classmethod
77
+ def from_parent_mapping(cls, mapping: Mapping[str, Set[str]]) -> "DependencyGraph":
78
+ graph = cls()
79
+ for var, parents in mapping.items():
80
+ graph.add_node(var)
81
+ for parent in parents:
82
+ graph.add_edge(parent, var)
83
+ return graph
84
+
85
+ def child_mapping(self) -> Mapping[str, Set[str]]:
86
+ return {
87
+ node.name: {child.name for child in node.children}
88
+ for node in self.nodes.values()
89
+ }
90
+
91
+ def child_closure_mapping(self) -> Mapping[str, Set[str]]:
92
+ return {node.name: node.get_children_closure() for node in self.nodes.values()}
93
+
94
+ def parent_mapping(self) -> Mapping[str, Set[str]]:
95
+ return {
96
+ node.name: {parent.name for parent in node.parents}
97
+ for node in self.nodes.values()
98
+ }
99
+
100
+ def parent_closure_mapping(self) -> Mapping[str, Set[str]]:
101
+ return {node.name: node.get_parents_closure() for node in self.nodes.values()}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pypromice
3
- Version: 1.4.3
3
+ Version: 1.5.0
4
4
  Summary: PROMICE/GC-Net data processing toolbox
5
5
  Home-page: https://github.com/GEUS-Glaciology-and-Climate/pypromice
6
6
  Author: GEUS Glaciology and Climate
@@ -18,16 +18,16 @@ Classifier: Operating System :: OS Independent
18
18
  Requires-Python: >=3.10
19
19
  Description-Content-Type: text/markdown
20
20
  License-File: LICENSE.txt
21
- Requires-Dist: numpy ~=1.23
22
- Requires-Dist: pandas >=1.5.0
23
- Requires-Dist: xarray >=2022.6.0
21
+ Requires-Dist: numpy~=1.23
22
+ Requires-Dist: pandas>=1.5.0
23
+ Requires-Dist: xarray>=2022.6.0
24
24
  Requires-Dist: toml
25
- Requires-Dist: scipy >=1.9.0
25
+ Requires-Dist: scipy>=1.9.0
26
26
  Requires-Dist: Bottleneck
27
27
  Requires-Dist: netcdf4
28
- Requires-Dist: pyDataverse ==0.3.1
28
+ Requires-Dist: pyDataverse==0.3.1
29
29
  Requires-Dist: eccodes
30
- Requires-Dist: scikit-learn >=1.1.0
30
+ Requires-Dist: scikit-learn>=1.1.0
31
31
 
32
32
  # pypromice
33
33
  [![PyPI version](https://badge.fury.io/py/pypromice.svg)](https://badge.fury.io/py/pypromice) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/pypromice/badges/version.svg)](https://anaconda.org/conda-forge/pypromice) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/pypromice/badges/platforms.svg)](https://anaconda.org/conda-forge/pypromice) [![](<https://img.shields.io/badge/Dataverse DOI-10.22008/FK2/3TSBF0-orange>)](https://www.doi.org/10.22008/FK2/3TSBF0) [![DOI](https://joss.theoj.org/papers/10.21105/joss.05298/status.svg)](https://doi.org/10.21105/joss.05298) [![Documentation Status](https://readthedocs.org/projects/pypromice/badge/?version=latest)](https://pypromice.readthedocs.io/en/latest/?badge=latest)
@@ -5,26 +5,26 @@ pypromice/get/get.py,sha256=8tdIbvdeXCpRWU7KmcKGIP9ZPdqIry3MjtJp9krumvo,7705
5
5
  pypromice/get/get_promice_data.py,sha256=bluNCaP50iRlWBzdEOXLrSPepOQdGB7SeQLkTWiqK4c,1806
6
6
  pypromice/postprocess/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  pypromice/postprocess/bufr_to_csv.py,sha256=ntTJZhfBRYPbLn2u9GzO5PFCkg9DIypUZONYEs2XrqA,507
8
- pypromice/postprocess/bufr_utilities.py,sha256=bc9U7ZC_7jtPbzaLYNnsz-nq3xn_PHGkgk1bVWa3ltc,21176
8
+ pypromice/postprocess/bufr_utilities.py,sha256=O1vnpKipUC6nMPmSrPvWECJocjdsB9FAb2ILXD8b8fs,21264
9
9
  pypromice/postprocess/create_bufr_files.py,sha256=GizmNAW_v54MkvelPVzqIklBNHWH6nTRQC2qOo5amys,5657
10
10
  pypromice/postprocess/get_bufr.py,sha256=98BZ7tTbmvvrVAzhxJ8LgHib3w7Q3S_x757pCubHToU,16693
11
11
  pypromice/postprocess/make_metadata_csv.py,sha256=lUw8fZC6dzG10IePZ4d7eZIrTbquHYCDuppYP4r_dF0,9776
12
12
  pypromice/postprocess/positions_seed.csv,sha256=0kVCQ8UfEALdeXNYCddmwxpseRqLRudbFStqp_bZRBw,224
13
13
  pypromice/postprocess/real_time_utilities.py,sha256=2GZUua5R8ocp-TnIjEA4ig8lC4TlI3SkiimzLxoHXFE,9476
14
14
  pypromice/process/L0toL1.py,sha256=aQmVEXhtRisHNrJuPGIg7NA4hjjmV9jUBu1DClRIGzs,23175
15
- pypromice/process/L1toL2.py,sha256=Hcelx8kYDq5ERtzdAO1YUuBu8_aRwgWJ9FEDHuAVZu8,30478
16
- pypromice/process/L2toL3.py,sha256=xJXEHqfgWtKj5DxmuFq2F_Ynj0gMEpBxw3-RKpcnfUs,62311
15
+ pypromice/process/L1toL2.py,sha256=PM6lToL-WXbZk5p2m90XCxY9S_RNNV1QUB3klZlQDzc,30832
16
+ pypromice/process/L2toL3.py,sha256=XqnUGKO17ADJkTOn0p8TESeCAKQGtPXpFadNfF52g6E,61378
17
17
  pypromice/process/__init__.py,sha256=xvd0I-9nIyVw4M4qjgkQ5vXYpNuKcVSkIVIROQsZDo0,147
18
- pypromice/process/aws.py,sha256=SLVfJ4VMY6F3DGzlAQXvgHqdQnqppYZofSU2VEUeRkQ,8960
18
+ pypromice/process/aws.py,sha256=5N4rLptO23Ic9mgyR5K8NhtNmGPa9xb9Cu7SgzAgoi8,7561
19
19
  pypromice/process/get_l2.py,sha256=ALXJCMJ8qgg0_dEKx-dV5TQ9IAJnLLLGPUxlr5QVfpk,3076
20
20
  pypromice/process/get_l2tol3.py,sha256=4Qu2d5rT25H2dObyCc70ivtJg3vw6WA-hzI-kRD6ybQ,4544
21
21
  pypromice/process/join_l2.py,sha256=ifjuhFR9scVvZt3xuy-ELp-iRchxV1dEK9qJ4UNh5bE,4567
22
- pypromice/process/join_l3.py,sha256=nLLQbX0vuuvHET8r33ZAt5g1dtIk3foUJ9RZkwkEwE4,20158
22
+ pypromice/process/join_l3.py,sha256=F90uvcy85iSl6GWxyj6C3K4j2eAoQvhQB8XqOXpShvo,20221
23
23
  pypromice/process/load.py,sha256=iaFvJeaDanAA60caVj4BWupZpqgQNj3CiNU4csz9FdU,4585
24
- pypromice/process/resample.py,sha256=x0t9CE4YnwYMrn6wDRArhrQHqHOIJpYpTrgEcARUppo,7138
24
+ pypromice/process/resample.py,sha256=VhcQ0UD5LkqFPHlwEFmwYIz3kLkUfvxTenxYadmCsSE,7301
25
25
  pypromice/process/utilities.py,sha256=1pqSaF3bIbvRNtOjb25mbegHfuW9MY4KpCBDVXWyML8,1773
26
- pypromice/process/value_clipping.py,sha256=FkBiDT_HK_BDFiVjB7NdWH-_nab7vONG9LOd2PpEBI8,1573
27
- pypromice/process/write.py,sha256=fRCCK4g_W07M4EEsJErdTSN2Pldr9SLgqM2w_rsp2ZQ,16257
26
+ pypromice/process/value_clipping.py,sha256=_pTAxogsqfkjwBQslGyyE3jZzhYY6_Wp-g5ZPHcudMc,1506
27
+ pypromice/process/write.py,sha256=ZpA9NAgtnzJIbnjEiJ0sOtsE0J1haHASbjHqzMvBDJE,15818
28
28
  pypromice/qc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
29
  pypromice/qc/github_data_issues.py,sha256=gbbF62oMMWbXiLnsrs60vXbwfAqSUP113plhidVeqCU,13353
30
30
  pypromice/qc/persistence.py,sha256=2ruS5w_QXt8730jwh6dwN1F3h7MGKFYStfO3T0YmmCY,6582
@@ -34,19 +34,20 @@ pypromice/qc/percentiles/outlier_detector.py,sha256=5_458aMm9MAubfYv7oIz1Lp9ME6S
34
34
  pypromice/qc/percentiles/thresholds.csv,sha256=KTQcYsg2VCZmR-Rf1Zzx1Jn-ZmR5yPPWWXYZ0Z03PDQ,9516
35
35
  pypromice/resources/__init__.py,sha256=MpKmvV11R4tcqmyvJpXQt-_It3oRI0WEIQNbMST--4w,907
36
36
  pypromice/resources/file_attributes.csv,sha256=NFqfg6u0PmPzY2bqE2bp646E4LUiPLqvzhyxDauXoPU,7014
37
- pypromice/resources/variable_aliases_GC-Net.csv,sha256=Z4-S9wThgWxwZTgeIWjjAoAP2Rnuu5kdY4m3aAqnMIM,967
38
- pypromice/resources/variables.csv,sha256=YyYng6ZL2eA0EIDdNAT8ACp6kg49R_38mTD5dWz_Vps,13513
37
+ pypromice/resources/variable_aliases_GC-Net.csv,sha256=v881RUTozleq-f7q7sVT3fqidcBH7t-kVUqDnjtbDm8,993
38
+ pypromice/resources/variables.csv,sha256=cW8JbQMb5rlge9I3EjbWuKACg3nvbVmbd84W3ouFJdI,13282
39
39
  pypromice/tx/__init__.py,sha256=-62bhHWJGfzFh5JwHcLqRj2jcGzmqzYOLWByhO706YY,30
40
40
  pypromice/tx/get_l0tx.py,sha256=b34-96KGshTyTN2tBFaAIBl7oZZzbRB_JR7sXtDNfXA,6957
41
41
  pypromice/tx/get_msg.py,sha256=OGS60OHjy4Wf8JExTfOdK-9xhjFdjhuChxoTSPe_MjI,3417
42
- pypromice/tx/payload_formats.csv,sha256=tzTTNuvmVwlwd7z3aF8A2dhjKNQ4lVumpnNBs3e3YeQ,7816
42
+ pypromice/tx/payload_formats.csv,sha256=A46-XcYdpe9-gzmADylP2UVizLi_UphF-BPT5u3Lyn8,7903
43
43
  pypromice/tx/payload_types.csv,sha256=C1-xCmHytAqqAzgzPwBLWqabzWu6s6tKAd8AjVd935s,457
44
44
  pypromice/tx/tx.py,sha256=mghUjwGqUKe_4JWuAEgWMyH4ME2QRufeMPPHoL72R08,34267
45
45
  pypromice/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
+ pypromice/utilities/dependency_graph.py,sha256=bqoXasC8pg5ipjBd6rqDhfHwIq11t2_cFlNT72ncw4w,3135
46
47
  pypromice/utilities/git.py,sha256=7EUGjDs_VZucrckakXKyZEclDAZ_mKIxhTWzhopCIxM,1785
47
- pypromice-1.4.3.dist-info/LICENSE.txt,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
48
- pypromice-1.4.3.dist-info/METADATA,sha256=mMnZyZwB5jdkzlnxlj-2vxptCrrM1vUHk85tfObm90U,4762
49
- pypromice-1.4.3.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
50
- pypromice-1.4.3.dist-info/entry_points.txt,sha256=ufX1npmY3nqMPtSVRKVxn3MhG9IyFHD5FjPZQcELVXo,618
51
- pypromice-1.4.3.dist-info/top_level.txt,sha256=cBdfwgSbWDQq3a07nKRjrfmLC7jdaYXs98GG58HpTks,10
52
- pypromice-1.4.3.dist-info/RECORD,,
48
+ pypromice-1.5.0.dist-info/LICENSE.txt,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
49
+ pypromice-1.5.0.dist-info/METADATA,sha256=EJQZp4E1oGs0OyC39bwzG2wQdrfx5xH3RK8twy_b3iQ,4756
50
+ pypromice-1.5.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
51
+ pypromice-1.5.0.dist-info/entry_points.txt,sha256=ufX1npmY3nqMPtSVRKVxn3MhG9IyFHD5FjPZQcELVXo,618
52
+ pypromice-1.5.0.dist-info/top_level.txt,sha256=cBdfwgSbWDQq3a07nKRjrfmLC7jdaYXs98GG58HpTks,10
53
+ pypromice-1.5.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5