py-ewr 2.3.4__py3-none-any.whl → 2.3.6__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.
@@ -326,15 +326,24 @@ def cleaner_standard_timeseries(input_df: pd.DataFrame, ewr_table_path: str = No
326
326
  df_flow.index.name = 'Date'
327
327
  df_level.index.name = 'Date'
328
328
 
329
+ flow_gauges = data_inputs.get_gauges('flow gauges', ewr_table_path=ewr_table_path)
330
+ level_gauges = data_inputs.get_gauges('level gauges', ewr_table_path=ewr_table_path)
331
+
332
+ report = pd.DataFrame(index = list(set(list(flow_gauges) + list(level_gauges))), columns = ['flow', 'level'])
333
+ report['flow'] = 'N'
334
+ report['level'] = 'N'
335
+
329
336
  for gauge in cleaned_df.columns:
330
337
  gauge_only = extract_gauge_from_string(gauge)
331
338
  if 'flow' in gauge:
332
339
  df_flow[gauge_only] = cleaned_df[gauge].copy(deep=True)
340
+ report.at[gauge_only, 'flow'] = 'Y'
333
341
  if 'level' in gauge:
334
342
  df_level[gauge_only] = cleaned_df[gauge].copy(deep=True)
343
+ report.at[gauge_only, 'level'] = 'Y'
335
344
  if not gauge_only:
336
345
  log.info('Could not identify gauge in column name:', gauge, ', skipping analysis of data in this column.')
337
- return df_flow, df_level
346
+ return df_flow, df_level, report
338
347
 
339
348
  def cleaner_netcdf_werp(input_df: pd.DataFrame, stations: dict, ewr_table_path: str) -> pd.DataFrame:
340
349
 
@@ -486,7 +495,7 @@ def match_MDBA_nodes(input_df: pd.DataFrame, model_metadata: pd.DataFrame, ewr_t
486
495
  raise ValueError('No relevant gauges and or measurands found in dataset, the EWR tool cannot evaluate this model output file')
487
496
 
488
497
  # report.to_csv('report_v1.csv')
489
- return df_flow, df_level
498
+ return df_flow, df_level, report
490
499
 
491
500
 
492
501
  # def match_MDBA_nodes_old(input_df: pd.DataFrame, model_metadata: pd.DataFrame, ewr_table_path: str) -> tuple:
@@ -597,7 +606,10 @@ class ScenarioHandler:
597
606
 
598
607
  def process_scenarios(self):
599
608
 
600
- scenarios = self._get_file_names(self.scenario_file)
609
+ if self.model_format != 'All Bigmod':
610
+ scenarios = self._get_file_names(self.scenario_file)
611
+ else:
612
+ scenarios = [self.scenario_file]
601
613
 
602
614
  # Analyse all scenarios for EWRs
603
615
  detailed_results = {}
@@ -608,11 +620,12 @@ class ScenarioHandler:
608
620
  data, header = unpack_model_file(scenarios[scenario], 'Dy', 'Field')
609
621
  data = build_MDBA_columns(data, header)
610
622
  df_clean = cleaner_MDBA(data)
611
- df_F, df_L = match_MDBA_nodes(df_clean, data_inputs.get_MDBA_codes(), self.parameter_sheet)
623
+ self.df_clean = df_clean
624
+ df_F, df_L, self.report = match_MDBA_nodes(df_clean, data_inputs.get_MDBA_codes(), self.parameter_sheet)
612
625
 
613
626
  elif self.model_format == 'Standard time-series':
614
627
  df = pd.read_csv(scenarios[scenario], index_col = 'Date')
615
- df_F, df_L = cleaner_standard_timeseries(df, self.parameter_sheet)
628
+ df_F, df_L, self.report = cleaner_standard_timeseries(df, self.parameter_sheet)
616
629
 
617
630
  elif self.model_format == 'Source - NSW (res.csv)':
618
631
  data, header = unpack_model_file(scenarios[scenario], 'Date', 'Field')
@@ -627,7 +640,27 @@ class ScenarioHandler:
627
640
  elif self.model_format == 'ten thousand year':
628
641
  df = pd.read_csv(scenarios[scenario], index_col = 'Date')
629
642
  df_F, df_L = cleaner_ten_thousand_year(df, self.parameter_sheet)
630
-
643
+
644
+ elif self.model_format == 'All Bigmod':
645
+
646
+ all_data = []
647
+ for scenario_file in scenario:
648
+ print(scenario_file)
649
+ try:
650
+ data, header = unpack_model_file(scenario_file, 'Dy', 'Field')
651
+ data = build_MDBA_columns(data, header)
652
+ all_data.append(data)
653
+ except Exception:
654
+ print(f"failed on {scenario_file}!!")
655
+
656
+ merged_data = all_data[0]
657
+ for i in range(1, len(all_data)):
658
+ merged_data = merged_data.merge(all_data[i], on=['Dy','Mn','Year'])
659
+
660
+ df_clean = cleaner_MDBA(merged_data)
661
+ self.df_clean = df_clean
662
+ df_F, df_L, self.report = match_MDBA_nodes(df_clean, data_inputs.get_MDBA_codes(), self.parameter_sheet)
663
+
631
664
  gauge_results = {}
632
665
  gauge_events = {}
633
666
 
@@ -637,6 +670,10 @@ class ScenarioHandler:
637
670
  for gauge in all_locations:
638
671
  gauge_results[gauge], gauge_events[gauge] = evaluate_EWRs.calc_sorter(df_F, df_L, gauge,
639
672
  EWR_table, calc_config)
673
+
674
+ if self.model_format == 'All Bigmod':
675
+ scenario = scenario_file[-10:-4]
676
+
640
677
  detailed_results[scenario] = gauge_results
641
678
  detailed_events[scenario] = gauge_events
642
679
  self.pu_ewr_statistics = detailed_results
@@ -808,4 +845,227 @@ class ScenarioHandler:
808
845
  if not self.pu_ewr_statistics:
809
846
  self.process_scenarios()
810
847
 
811
- return summarise_results.summarise(self.pu_ewr_statistics , self.yearly_events, parameter_sheet_path=self.parameter_sheet)
848
+ self.ewr_results = summarise_results.summarise(self.pu_ewr_statistics , self.yearly_events, parameter_sheet_path=self.parameter_sheet)
849
+
850
+ return self.ewr_results
851
+
852
+
853
+ def log_analysed_results(self):
854
+ '''
855
+ For each unique ewr/pu/gauge - examines the ewr_results dataframe and if it exists here, then it is set to True in the logging_sheet dataframe.
856
+ Create corresponding column in logging_sheet to log info.
857
+ '''
858
+ results = self.ewr_results[["PlanningUnit", "Gauge", "EwrCode"]].copy()
859
+ results["Analysed?"] = True
860
+ self.logging_sheet = self.logging_sheet.merge(right = results, left_on=["PlanningUnitName", "Primary Gauge", "Code"], right_on=["PlanningUnit", "Gauge", "EwrCode"], how="left")
861
+ self.logging_sheet["Analysed?"] = ~self.logging_sheet["Analysed?"].isna()
862
+ self.logging_sheet["Gauge"] = self.logging_sheet["Gauge_x"].copy()
863
+
864
+
865
+ def log_if_node_in_siteID(self):
866
+ '''
867
+ For each node, checks if the node is in the siteid file. Note, this is a preliminary check, as it doesn't reveal if a match in the SITEID was made with model data.
868
+ Create corresponding column in logging_sheet to log info.
869
+ TODO: make work with non 'Bigmod - MDBA' siteid's
870
+ '''
871
+
872
+ if self.model_format == 'Bigmod - MDBA':
873
+ self.site_id_df = data_inputs.get_MDBA_codes()[["AWRC", "SITEID"]]
874
+ elif self.model_format == 'All Bigmod':
875
+ self.site_id_df = data_inputs.get_MDBA_codes()[["AWRC", "SITEID"]]
876
+ elif self.model_format == 'Source - NSW (res.csv)':
877
+ pass
878
+ elif self.model_format == 'Standard time-series':
879
+ self.site_id_df = data_inputs.get_MDBA_codes()[["AWRC", "SITEID"]]
880
+ elif self.model_format == 'IQQM - netcdf':
881
+ pass
882
+ elif self.model_format == 'ten thousand year':
883
+ pass
884
+
885
+ self.logging_sheet["node_in_siteID?"] = self.logging_sheet["Gauge"].isin(self.site_id_df["AWRC"].unique())
886
+
887
+ def log_if_gauge_in_model_file(self):
888
+ '''
889
+ For each gauge, check if is in the list of all gauges corresponding to siteID's in the model file.
890
+ Create corresponding column in logging_sheet to log info.
891
+ '''
892
+ site_id_in_model_file = [n for name in self.df_clean.columns for n in name.split("-")]
893
+ self.site_id_df["IN_MODELFILE"] = self.site_id_df["SITEID"].isin(site_id_in_model_file)
894
+ self.gauges_in_model_file = self.site_id_df[self.site_id_df.IN_MODELFILE]["AWRC"]
895
+ self.logging_sheet["gauge_in_model_file?"] = self.logging_sheet["Gauge"].isin(self.gauges_in_model_file)
896
+
897
+ def log_measurand_info(self):
898
+ '''
899
+ Log if the flow and level data has been read in for each gauge.
900
+ Create corresponding column in logging_sheet to log info.
901
+ '''
902
+ self.logging_sheet.loc[:, "gaugeANDmeasurand_in_model_file? (Yes/No)"] = False
903
+
904
+ for idx, row in self.logging_sheet[["Gauge", "GaugeType"]].drop_duplicates().iterrows():
905
+
906
+ gauge = row["Gauge"]
907
+ gauge_type = row["GaugeType"]
908
+
909
+ if gauge_type == 'F':
910
+ full_gauge_type = 'flow'
911
+ else:
912
+ full_gauge_type = 'level'
913
+
914
+ if gauge in set(self.report.index):
915
+ self.logging_sheet.loc[(self.logging_sheet.Gauge == gauge) & (self.logging_sheet.GaugeType == gauge_type), "gaugeANDmeasurand_in_model_file? (Yes/No)"] = self.report.loc[gauge, full_gauge_type] == 'Y'
916
+
917
+ return self.logging_sheet
918
+
919
+ def log_calc_config_info(self):
920
+ '''
921
+ See if a calc config matches for each gauge/pu/ewr combination.
922
+ TODO: make calc config a function with the option to just return the already calculated values
923
+ '''
924
+ calc_config = data_inputs.get_ewr_calc_config(self.calc_config_path)
925
+
926
+ invalid_calc_configs = []
927
+ ewr_keys_in_parameter_sheet = []
928
+ self.logging_sheet["EWR_key"] = None
929
+
930
+ for gauge in self.logging_sheet['Primary Gauge'].unique():
931
+
932
+ PU_items = self.logging_sheet.groupby(['PlanningUnitID', 'PlanningUnitName']).size().reset_index().drop([0], axis=1)
933
+ gauge_table = self.logging_sheet[self.logging_sheet['Primary Gauge'] == gauge]
934
+
935
+ for PU in set(gauge_table['PlanningUnitID']):
936
+
937
+ PU_table = gauge_table[gauge_table['PlanningUnitID'] == PU]
938
+ EWR_categories = PU_table['FlowLevelVolume'].values
939
+ EWR_codes = PU_table['Code']
940
+
941
+ for cat, EWR in zip(EWR_categories, EWR_codes):
942
+
943
+ ## CUSTOM MULTIGAUGE CHECK
944
+ item = self.logging_sheet[(self.logging_sheet['Primary Gauge']==gauge) & (self.logging_sheet['Code']==EWR) & (self.logging_sheet['PlanningUnitID']==PU)]
945
+ item = item.replace({np.nan: None})
946
+ mg = item['Multigauge'].to_list()
947
+
948
+ if not mg[0]:
949
+ gauge_calc_type = 'single'
950
+ elif mg[0] == '':
951
+ gauge_calc_type = 'single'
952
+ else:
953
+ gauge_calc_type = 'multigauge'
954
+ ####
955
+
956
+ ewr_key = f'{EWR}-{gauge_calc_type}-{cat}'
957
+ self.logging_sheet.loc[((self.logging_sheet['Primary Gauge']==gauge) & (self.logging_sheet['Code']==EWR) & (self.logging_sheet['PlanningUnitID']==PU)), "EWR_key"] = ewr_key
958
+ function_name = evaluate_EWRs.find_function(ewr_key, calc_config)
959
+ ewr_keys_in_parameter_sheet.append(ewr_key)
960
+
961
+ if function_name == 'unknown':
962
+ invalid_calc_configs.append(ewr_key)
963
+ continue
964
+ handle_function = evaluate_EWRs.get_handle_function(function_name)
965
+ if not handle_function:
966
+ invalid_calc_configs.append(ewr_key)
967
+ continue
968
+
969
+ self.logging_sheet["is_in_calc_config?"] = ~self.logging_sheet["EWR_key"].isin(invalid_calc_configs)
970
+
971
+ def log_siteID_info(self):
972
+ """
973
+ Add the siteID info to the logging_sheet. Add the siteID of that gauge it matched with, as well as a list of all siteIDs for that gauge that it didn't match with. (i.e. the "spares" not in the model file.)
974
+ """
975
+ ## add the matching siteID info
976
+ spare_siteID_df = self.site_id_df[self.site_id_df.AWRC.isin(self.gauges_in_model_file) & ~self.site_id_df.IN_MODELFILE].astype(str)
977
+ spare_siteID_df = spare_siteID_df.groupby("AWRC").agg({'SITEID': 'sum'})
978
+ # spare_siteID_df = spare_siteID_df.groupby("AWRC").agg({'SITEID': lambda x: list(x)})
979
+ spare_siteID_df = spare_siteID_df.rename(columns={"SITEID": "spare_SITEID"})
980
+
981
+ self.logging_sheet = self.logging_sheet.merge(right = spare_siteID_df, left_on=["Gauge"], right_index=True, how="left")
982
+
983
+ ### section to add the used SITEID
984
+ used_siteID_df = self.site_id_df[self.site_id_df.IN_MODELFILE][["AWRC", "SITEID"]]
985
+ used_siteID_df = used_siteID_df.rename(columns={"SITEID": "matched_SITEID"})
986
+ used_siteID_df = used_siteID_df.set_index("AWRC")
987
+
988
+ self.logging_sheet = self.logging_sheet.merge(right = used_siteID_df, left_on=["Gauge"], right_index=True, how="left")
989
+
990
+ # mark spare_SITEID column of those that dont have more than one SITEID to match with as EXACT MATCHES
991
+ self.logging_sheet.loc[~self.logging_sheet.matched_SITEID.isna() & self.logging_sheet.spare_SITEID.isna(), "spare_SITEID"] = "EXACT_MATCH"
992
+
993
+
994
+ def create_multi_index(self, logging_sheet):
995
+
996
+ logging_sheet.insert(loc=4, column='Primary Gauge', value=logging_sheet.Gauge.values)
997
+
998
+ ## Multigauge
999
+
1000
+ rows_to_duplicate = logging_sheet.loc[(~logging_sheet["Multigauge"].isna()),:]
1001
+
1002
+ for counter, (idx, row) in enumerate(rows_to_duplicate.iterrows()):
1003
+ updated_idx = counter + idx # update idx to account for all inserted rows
1004
+ duplicate_row = logging_sheet.loc[updated_idx, :].copy()
1005
+ duplicate_row["Gauge"] = logging_sheet.loc[updated_idx, "Multigauge"]
1006
+ logging_sheet = pd.DataFrame(np.insert(logging_sheet.values, updated_idx+1, values=duplicate_row.values, axis=0), columns=logging_sheet.columns)
1007
+
1008
+ ## Weirpool
1009
+
1010
+ rows_to_duplicate = logging_sheet.loc[(~logging_sheet["WeirpoolGauge"].isna()),:]
1011
+
1012
+ for counter, (idx, row) in enumerate(rows_to_duplicate.iterrows()):
1013
+ updated_idx = counter + idx # update idx to account for all inserted rows
1014
+ duplicate_row = logging_sheet.loc[updated_idx, :].copy()
1015
+ duplicate_row["Gauge"] = logging_sheet.loc[updated_idx, "WeirpoolGauge"]
1016
+ duplicate_row["GaugeType"] = "L"
1017
+ logging_sheet = pd.DataFrame(np.insert(logging_sheet.values, updated_idx+1, values=duplicate_row.values, axis=0), columns=logging_sheet.columns)
1018
+
1019
+ ## Barrage Gauges
1020
+
1021
+ barrage_flow_gauges = data_inputs.get_barrage_flow_gauges()
1022
+ barrage_level_gauges = data_inputs.get_barrage_level_gauges()
1023
+
1024
+ ## Because all barrage flow gauges have GaugeType flow, and all barrage level gauges have GaugeType level, the logic of the code to copy the GaugeType and modify the gauge name means they can be done at the same time.
1025
+
1026
+ dict_gauges = {**barrage_flow_gauges, **barrage_level_gauges}
1027
+
1028
+ for gauge, gauge_list in dict_gauges.items():
1029
+
1030
+ counter = 0
1031
+ rows_to_duplicate = logging_sheet.loc[(logging_sheet["Primary Gauge"] == gauge),:]
1032
+
1033
+ for idx, row in rows_to_duplicate.iterrows():
1034
+
1035
+ updated_idx = idx + counter # update idx to account for all inserted rows
1036
+ duplicate_row = logging_sheet.loc[updated_idx, :].copy()
1037
+
1038
+ rows_to_insert = pd.DataFrame([duplicate_row] * len(gauge_list))
1039
+ rows_to_insert["Gauge"] = gauge_list
1040
+
1041
+ logging_sheet.drop(index=updated_idx, axis=0, inplace=True)
1042
+
1043
+ logging_sheet = pd.DataFrame(np.insert(logging_sheet.values, updated_idx, values=rows_to_insert.values, axis=0), columns=logging_sheet.columns)
1044
+
1045
+ counter += len(gauge_list) - 1
1046
+
1047
+ return logging_sheet
1048
+
1049
+ def get_logs(self) -> pd.DataFrame:
1050
+ """
1051
+ Create the logging sheet
1052
+ TODO: ensure that self.get_ewr_results() has been run and if not make it run.
1053
+ """
1054
+ parameter_sheet = pd.read_csv(self.parameter_sheet)
1055
+
1056
+ self.logging_sheet = parameter_sheet.copy()[["PlanningUnitName", "Code", "Gauge", "GaugeType", 'PlanningUnitID', 'FlowLevelVolume', "Multigauge", "WeirpoolGauge"]]
1057
+
1058
+ self.logging_sheet = self.create_multi_index(self.logging_sheet)
1059
+
1060
+ self.log_analysed_results()
1061
+ self.log_if_node_in_siteID()
1062
+ self.log_if_gauge_in_model_file()
1063
+ self.log_measurand_info()
1064
+ self.log_calc_config_info()
1065
+ self.log_siteID_info()
1066
+
1067
+ self.logging_sheet = self.logging_sheet[["PlanningUnitName", "Code", "Primary Gauge", "Gauge", "GaugeType", "is_in_calc_config?", "node_in_siteID?", "gauge_in_model_file?", "gaugeANDmeasurand_in_model_file? (Yes/No)", "matched_SITEID", "spare_SITEID", "Analysed?"]]
1068
+
1069
+ return self.logging_sheet
1070
+
1071
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: py_ewr
3
- Version: 2.3.4
3
+ Version: 2.3.6
4
4
  Summary: Environmental Water Requirement calculator
5
5
  Home-page: https://github.com/MDBAuth/EWR_tool
6
6
  Author: Martin Job
@@ -43,9 +43,10 @@ Dynamic: summary
43
43
  [![PyPI](https://img.shields.io/pypi/v/py-ewr)](https://pypi.org/project/py-ewr/)
44
44
  [![DOI](https://zenodo.org/badge/342122359.svg)](https://zenodo.org/badge/latestdoi/342122359)
45
45
 
46
- ### **EWR tool version 2.3.4 README**
46
+ ### **EWR tool version 2.3.6 README**
47
47
 
48
48
  ### **Notes on recent version updates**
49
+ - Including metadata report (this is still being ironed out and tested)
49
50
  - CLLMM_c and CLLMM_d ewrs are now able to be calculated without all barrage level gauges being present in the model file.
50
51
  - Including draft objective mapping files in the package (see below sub heading **Objective mapping** for more information). Objective mapping has been therefore pulled out of the parameter sheet
51
52
  - Including an example parallel processing script for running the EWR tool
@@ -1,20 +1,20 @@
1
1
  py_ewr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  py_ewr/data_inputs.py,sha256=oUiEiLY_CmbvqF5GlV-3Yfz_JZ1qZNvta-VEYCzAcso,20124
3
- py_ewr/evaluate_EWRs.py,sha256=pCIqWysUuM-HbYn6U9bQnrHMhTl2CVhjWanpGJ6l0pc,231584
3
+ py_ewr/evaluate_EWRs.py,sha256=NC6FYWT5jEAEpV3bp5T1CuYUJjnz1bqiamRoKTptpqE,231607
4
4
  py_ewr/io.py,sha256=Is0xPAzLx6-ylpTFyYJxMimkNVxxoTxUcknTk6bQbgs,840
5
5
  py_ewr/observed_handling.py,sha256=JTSK_2obhqNWJ2QknykywevNMN0fsvGXSejFwUSpMoA,18112
6
- py_ewr/scenario_handling.py,sha256=D4P1rqrD6_3pwhifHCVVdLSEKsNI4VVzPu60g7ZyRXk,35982
6
+ py_ewr/scenario_handling.py,sha256=G7q2qpRU4xwusUeztDEHkRVdl4vnVaI_EfEchKTRhq0,48878
7
7
  py_ewr/summarise_results.py,sha256=rFaAUVR4jIsjeRl4ocPFE2RUoJJBZgZ2wPEBh-dfEsc,31761
8
8
  py_ewr/model_metadata/SiteID_MDBA.csv,sha256=orbh3QIRbOkUjCB2hcdpeUvhepnY_3ywldu22s45d5Y,168771
9
9
  py_ewr/model_metadata/SiteID_NSW.csv,sha256=UVBxN43Z5KWCvWhQ5Rh6TNEn35q4_sjPxKyHg8wPFws,6805
10
10
  py_ewr/model_metadata/iqqm_stations.csv,sha256=vl4CPtPslG5VplSzf_yLZulTrmab-mEBHOfzFtS1kf4,110
11
- py_ewr/parameter_metadata/ewr2obj.csv,sha256=r2uXzhZ-Rd1u3RLhNXmJnPYcHwouHBehEPnvednfz-I,3948677
12
- py_ewr/parameter_metadata/ewr_calc_config.json,sha256=NbhbB_fO0j191XDiz-2TxNasQGGe69FdhLyD0ZMj2eg,17980
11
+ py_ewr/parameter_metadata/ewr2obj.csv,sha256=qvD-skiQiiMq3YABPUte8OdYGQD5Nesr0UvQMAsXnXU,4509292
12
+ py_ewr/parameter_metadata/ewr_calc_config.json,sha256=XfaJnFrAkGGBY4MRcsO5CH9SJ_K0989C4NAZYIVr_b0,18369
13
13
  py_ewr/parameter_metadata/obj2target.csv,sha256=f6kLVyBhXUpGR4b0dzLbBvZbfpn3OxOhaB4aouO6Bvw,1593877
14
14
  py_ewr/parameter_metadata/obj2yrtarget.csv,sha256=G8XgdCrOpB0xhp6n7DIS4Vcq69Kpgb1Pum7Ay3a_YPU,54882
15
- py_ewr/parameter_metadata/parameter_sheet.csv,sha256=MxKE-649bIC6HGqh87MT_fR3Lmew8n10Oi6OsAF1N0Q,768524
16
- py_ewr-2.3.4.dist-info/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
17
- py_ewr-2.3.4.dist-info/METADATA,sha256=dcU2egWhsIje0d-nFTKImRkNusWuguvndhV40ixSqVg,12902
18
- py_ewr-2.3.4.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
19
- py_ewr-2.3.4.dist-info/top_level.txt,sha256=n3725d-64Cjyb-YMUMV64UAuIflzUh2_UZSxiIbrur4,7
20
- py_ewr-2.3.4.dist-info/RECORD,,
15
+ py_ewr/parameter_metadata/parameter_sheet.csv,sha256=-wYjN-5vkYlUCzmsBLIZ1w3BI1RHO1iXMxZAg1inguA,766656
16
+ py_ewr-2.3.6.dist-info/LICENSE,sha256=ogEPNDSH0_dhiv_lT3ifVIdgIzHAqNA_SemnxUfPBJk,7048
17
+ py_ewr-2.3.6.dist-info/METADATA,sha256=mi-YtShE31W-5G0kgY-MpeJLAyKpeG4VwPBd-TAFP5o,12974
18
+ py_ewr-2.3.6.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
19
+ py_ewr-2.3.6.dist-info/top_level.txt,sha256=n3725d-64Cjyb-YMUMV64UAuIflzUh2_UZSxiIbrur4,7
20
+ py_ewr-2.3.6.dist-info/RECORD,,
File without changes