py-ewr 2.2.4__py3-none-any.whl → 2.2.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.
py_ewr/data_inputs.py CHANGED
@@ -121,7 +121,7 @@ def get_MDBA_codes() -> pd.DataFrame:
121
121
  pd.DataFrame: dataframe for linking MDBA model nodes to gauges
122
122
 
123
123
  '''
124
- metadata = pd.read_csv( BASE_PATH / 'model_metadata/SiteID_MDBA.csv', engine = 'python', dtype=str, encoding='windows-1252')
124
+ metadata = pd.read_csv( BASE_PATH / 'model_metadata/SiteID_MDBA.csv', engine = 'python', dtype=str)#, encoding='windows-1252')
125
125
 
126
126
  return metadata
127
127
 
@@ -392,12 +392,12 @@ def get_gauges(category: str, ewr_table_path: str = None) -> set:
392
392
  multi_gauges = get_multi_gauges('gauges')
393
393
  multi_gauges = list(multi_gauges.values())
394
394
  if category == 'all gauges':
395
- return set(EWR_table['Gauge'].to_list() + menindee_gauges + wp_gauges + multi_gauges)
395
+ return set(EWR_table['Gauge'].to_list()+menindee_gauges+wp_gauges+multi_gauges+flow_barrage_gauges+level_barrage_gauges+qld_flow_gauges+qld_level_gauges+vic_level_gauges)
396
396
  elif category == 'flow gauges':
397
397
  return set(EWR_table['Gauge'].to_list() + multi_gauges + flow_barrage_gauges + qld_flow_gauges)
398
398
  elif category == 'level gauges':
399
399
  level_gauges = EWR_table[EWR_table['FlowLevelVolume']=='L']['Gauge'].to_list()
400
- return set(menindee_gauges + wp_gauges + level_barrage_gauges + qld_level_gauges + level_gauges)
400
+ return set(menindee_gauges + wp_gauges + level_barrage_gauges + qld_level_gauges + level_gauges + vic_level_gauges)
401
401
  else:
402
402
  raise ValueError('''No gauge category sent to the "get_gauges" function''')
403
403
 
@@ -439,4 +439,18 @@ def gauge_groups(parameter_sheet: pd.DataFrame) -> dict:
439
439
 
440
440
  return flow_gauges, level_gauges, lake_level_gauges
441
441
 
442
- # def gauges_to_measurand()
442
+ # def gauges_to_measurand()
443
+
444
+ def get_causal_ewr() -> dict:
445
+
446
+ ewr2obj_path = os.path.join(BASE_PATH, "parameter_metadata/ewr2obj.csv")
447
+ obj2target_path = os.path.join(BASE_PATH, "parameter_metadata/obj2target.csv")
448
+ obj2yrtarget_path = os.path.join(BASE_PATH, "parameter_metadata/obj2yrtarget.csv")
449
+
450
+ causal_ewr = {
451
+ "ewr2obj": pd.read_csv(ewr2obj_path),
452
+ "obj2target": pd.read_csv(obj2target_path),
453
+ "obj2yrtarget":pd.read_csv(obj2yrtarget_path)
454
+ }
455
+
456
+ return causal_ewr
py_ewr/evaluate_EWRs.py CHANGED
@@ -445,10 +445,19 @@ def get_index_date(date_index:Any)-> datetime.date:
445
445
  """
446
446
  if type(date_index) == pd._libs.tslibs.timestamps.Timestamp:
447
447
  return date_index.date()
448
- # if type(date_index) == pd._libs.tslibs.period.Period:
449
- # return date_index.date()#.to_timestamp()
450
- else:
448
+ if type(date_index) == pd._libs.tslibs.period.Period:
449
+ date_index_str = date_index.strftime('%Y-%m-%d')
450
+ # For dates between the years 100 and 999 we need to add a 0 onto the date string so strptime doesnt break
451
+ if ((int(date_index_str.split('-')[0]) >= 100) and (int(date_index_str.split('-')[0]) < 1000)):
452
+ date_index_str = '0' + date_index_str
453
+ n = datetime.datetime.strptime(date_index_str, '%Y-%m-%d').date()
454
+ return n
455
+ if type(date_index) == str:
456
+ n = datetime.datetime.strptime(date_index, '%Y-%m-%d').date()
457
+ return n
458
+ if type(date_index) == datetime.date:
451
459
  return date_index
460
+ # return date_index #TODO: should this break? i.e. we arent expecting other date formats
452
461
 
453
462
  #----------------------------------- EWR handling functions --------------------------------------#
454
463
 
@@ -1958,7 +1967,8 @@ def water_stability_check(EWR_info:Dict, iteration:int, flows:List, all_events:D
1958
1967
  if levels_are_stable:
1959
1968
  # record event opportunity for the next n days for the total period of (EggDaysSpell)+ larvae (LarvaeDaysSpell)
1960
1969
  # if the last day of the event is not over the last day of the event window
1961
- iteration_date = flow_date.date()#flow_date.to_timestamp().date()
1970
+ iteration_date = get_index_date(flow_date)
1971
+ # iteration_date = flow_date.date()#flow_date.to_timestamp().date()
1962
1972
  last_day_window = get_last_day_of_window(iteration_date, EWR_info['end_month'])
1963
1973
  event_size = EWR_info['eggs_days_spell'] + EWR_info['larvae_days_spell']
1964
1974
  if is_date_in_window(iteration_date, last_day_window, event_size):
@@ -1995,7 +2005,8 @@ def water_stability_level_check(EWR_info:Dict, iteration:int, all_events:Dict, w
1995
2005
  if levels_are_stable:
1996
2006
  # record event opportunity for the next n days for the total period of (EggDaysSpell)+ larvae (LarvaeDaysSpell)
1997
2007
  # if the last day of the event is not over the last day of the event window
1998
- iteration_date = flow_date.date()#flow_date.to_timestamp().date()
2008
+ iteration_date = get_index_date(flow_date)
2009
+ # iteration_date = flow_date.date()#flow_date.to_timestamp().date()
1999
2010
  last_day_window = get_last_day_of_window(iteration_date, EWR_info['end_month'])
2000
2011
  event_size = EWR_info['eggs_days_spell'] + EWR_info['larvae_days_spell']
2001
2012
  if is_date_in_window(iteration_date, last_day_window, event_size):
@@ -2617,7 +2628,8 @@ def create_water_stability_event(flow_date: pd.Timestamp, flows:List, iteration:
2617
2628
  """
2618
2629
  event_size = EWR_info['eggs_days_spell'] + EWR_info['larvae_days_spell']
2619
2630
  event_flows = flows[iteration: iteration + event_size]
2620
- start_event_date = flow_date.date()#flow_date.to_timestamp().date()
2631
+ start_event_date = get_index_date(flow_date)
2632
+ # start_event_date = flow_date.date()#flow_date.to_timestamp().date()
2621
2633
  event_dates = [ start_event_date + timedelta(i) for i in range(event_size)]
2622
2634
 
2623
2635
  return [(d, flow) for d, flow in zip(event_dates, event_flows)]
@@ -3800,6 +3812,7 @@ def nest_calc_percent_trigger(EWR_info:Dict, flows:List, water_years:List, dates
3800
3812
  Returns:
3801
3813
  tuple: final output with the calculation of volume all_events, durations
3802
3814
  """
3815
+ #TODO can we clean up the flow_date and iteration_date parts
3803
3816
  event = []
3804
3817
  total_event = 0
3805
3818
  all_events = construct_event_dict(water_years)
@@ -3807,19 +3820,25 @@ def nest_calc_percent_trigger(EWR_info:Dict, flows:List, water_years:List, dates
3807
3820
  gap_track = 0
3808
3821
  for i, flow in enumerate(flows[:-1]):
3809
3822
  flow_date = dates[i]
3823
+ iteration_date = get_index_date(flow_date)
3810
3824
  flow_percent_change = calc_flow_percent_change(i, flows)
3811
3825
  trigger_day = date(dates[i].year,EWR_info["trigger_month"], EWR_info["trigger_day"])
3812
3826
  cut_date = calc_nest_cut_date(EWR_info, i, dates)
3813
- is_in_trigger_window = dates[i].date() >= trigger_day \
3814
- and dates[i].date() <= trigger_day + timedelta(days=14) #.to_timestamp() .to_timestamp()
3827
+ is_in_trigger_window = iteration_date >= trigger_day \
3828
+ and iteration_date <= trigger_day + timedelta(days=14) #.to_timestamp() .to_timestamp()
3829
+ # is_in_trigger_window = dates[i].date() >= trigger_day \
3830
+ # and dates[i].date() <= trigger_day + timedelta(days=14) #.to_timestamp() .to_timestamp()
3815
3831
  iteration_no_event = 0
3816
3832
 
3817
3833
  ## if there IS an ongoing event check if we are on the trigger season window
3818
3834
  # if yes then check the current flow
3819
3835
  if total_event > 0:
3820
- if (dates[i].date() >= trigger_day) and (dates[i].date() <= cut_date):
3836
+ if (iteration_date >= trigger_day) and (iteration_date <= cut_date):
3821
3837
  event, all_events, gap_track, total_event, iteration_no_event = nest_flow_check(EWR_info, i, flow, event, all_events,
3822
3838
  gap_track, water_years, total_event, flow_date, flow_percent_change, iteration_no_event) #.to_timestamp() .to_timestamp()
3839
+ # if (dates[i].date() >= trigger_day) and (dates[i].date() <= cut_date):
3840
+ # event, all_events, gap_track, total_event, iteration_no_event = nest_flow_check(EWR_info, i, flow, event, all_events,
3841
+ # gap_track, water_years, total_event, flow_date, flow_percent_change, iteration_no_event) #.to_timestamp() .to_timestamp()
3823
3842
 
3824
3843
  # this path will only be executed if an event extends beyond the cut date
3825
3844
  else:
@@ -3840,18 +3859,23 @@ def nest_calc_percent_trigger(EWR_info:Dict, flows:List, water_years:List, dates
3840
3859
 
3841
3860
  # Check final iteration in the flow timeseries, saving any ongoing events/event gaps to their spots in the dictionaries:
3842
3861
  # reset all variable to last flow
3843
- flow_date = dates[-1].date()#.to_timestamp()
3862
+
3863
+ # flow_date = dates[-1].date()#.to_timestamp()
3864
+ flow_date = dates[-1]
3865
+ iteration_date = get_index_date(dates[-1])
3844
3866
  flow_percent_change = calc_flow_percent_change(-1, flows)
3845
3867
  trigger_day = date(dates[-1].year,EWR_info["trigger_month"], EWR_info["trigger_day"])
3846
3868
  cut_date = calc_nest_cut_date(EWR_info, -1, dates)
3847
- is_in_trigger_window = dates[-1].date() >= trigger_day - timedelta(days=7) \
3848
- and dates[-1].date() <= trigger_day + timedelta(days=7) #.to_timestamp() .to_timestamp()
3869
+ is_in_trigger_window = iteration_date >= trigger_day - timedelta(days=7) \
3870
+ and iteration_date <= trigger_day + timedelta(days=7) #.to_timestamp() .to_timestamp()
3871
+ # is_in_trigger_window = dates[-1].date() >= trigger_day - timedelta(days=7) \
3872
+ # and dates[-1].date() <= trigger_day + timedelta(days=7) #.to_timestamp() .to_timestamp()
3849
3873
  iteration_no_event = 0
3850
3874
 
3851
3875
  if total_event > 0:
3852
3876
 
3853
- if (flow_date >= trigger_day ) \
3854
- and (flow_date <= cut_date):
3877
+ if (iteration_date >= trigger_day ) \
3878
+ and (iteration_date <= cut_date): # Was flow_date instead of iteration date in both instances
3855
3879
  event, all_events, gap_track, total_event, iteration_no_event = nest_flow_check(EWR_info, -1, flows[-1], event, all_events,
3856
3880
  gap_track, water_years, total_event, flow_date, flow_percent_change, iteration_no_event)
3857
3881
 
@@ -4835,7 +4859,7 @@ def event_stats(df:pd.DataFrame, PU_df:pd.DataFrame, gauge:str, EWR:str, EWR_inf
4835
4859
  years_with_events = get_event_years_volume_achieved(events, unique_water_years)
4836
4860
 
4837
4861
  YWE = pd.Series(name = str(EWR + '_eventYears'), data = years_with_events, index = unique_water_years)
4838
- PU_df = pd.concat([PU_df, YWE], axis = 1)
4862
+ # PU_df = pd.concat([PU_df, YWE], axis = 1)
4839
4863
  # Number of event achievements:
4840
4864
  num_event_achievements = get_achievements(EWR_info, events, unique_water_years, durations)
4841
4865
 
@@ -4843,64 +4867,84 @@ def event_stats(df:pd.DataFrame, PU_df:pd.DataFrame, gauge:str, EWR:str, EWR_inf
4843
4867
  num_event_achievements = get_achievements_connecting_events(events, unique_water_years)
4844
4868
 
4845
4869
  NEA = pd.Series(name = str(EWR + '_numAchieved'), data= num_event_achievements, index = unique_water_years)
4846
- PU_df = pd.concat([PU_df, NEA], axis = 1)
4870
+ # PU_df = pd.concat([PU_df, NEA], axis = 1)
4847
4871
  # Total number of events THIS ONE IS ONLY ACHIEVED due to Filter Applied
4848
4872
  num_events = get_number_events(EWR_info, events, unique_water_years, durations)
4849
4873
  NE = pd.Series(name = str(EWR + '_numEvents'), data= num_events, index = unique_water_years)
4850
- PU_df = pd.concat([PU_df, NE], axis = 1)
4874
+ # PU_df = pd.concat([PU_df, NE], axis = 1)
4851
4875
  # Total number of events THIS ONE IS ALL EVENTS
4852
4876
  num_events_all = get_all_events(events)
4853
4877
  NEALL = pd.Series(name = str(EWR + '_numEventsAll'), data= num_events_all, index = unique_water_years)
4854
- PU_df = pd.concat([PU_df, NEALL], axis = 1)
4878
+ # PU_df = pd.concat([PU_df, NEALL], axis = 1)
4855
4879
  # Max inter event period
4856
4880
  max_inter_period = get_max_inter_event_days(no_events, unique_water_years)
4857
4881
  MIP = pd.Series(name = str(EWR + '_maxInterEventDays'), data= max_inter_period, index = unique_water_years)
4858
- PU_df = pd.concat([PU_df, MIP], axis = 1)
4882
+ # PU_df = pd.concat([PU_df, MIP], axis = 1)
4859
4883
  # Max inter event period achieved
4860
4884
  max_inter_period_achieved = get_event_max_inter_event_achieved(EWR_info, no_events, unique_water_years)
4861
4885
  MIPA = pd.Series(name = str(EWR + '_maxInterEventDaysAchieved'), data= max_inter_period_achieved, index = unique_water_years)
4862
- PU_df = pd.concat([PU_df, MIPA], axis = 1)
4886
+ # PU_df = pd.concat([PU_df, MIPA], axis = 1)
4863
4887
  # Average length of events
4864
4888
  av_length = get_average_event_length(events, unique_water_years)
4865
4889
  AL = pd.Series(name = str(EWR + '_eventLength'), data = av_length, index = unique_water_years)
4866
- PU_df = pd.concat([PU_df, AL], axis = 1)
4890
+ # PU_df = pd.concat([PU_df, AL], axis = 1)
4867
4891
  # Average length of events ONLY the ACHIEVED
4868
4892
  av_length_achieved = get_average_event_length_achieved(EWR_info, events)
4869
4893
  ALA = pd.Series(name = str(EWR + '_eventLengthAchieved' ), data = av_length_achieved, index = unique_water_years)
4870
- PU_df = pd.concat([PU_df, ALA], axis = 1)
4894
+ # PU_df = pd.concat([PU_df, ALA], axis = 1)
4871
4895
  # Total event days
4872
4896
  total_days = get_total_days(events, unique_water_years)
4873
- TD = pd.Series(name = str(EWR + '_totalEventDays'), data = total_days, index = unique_water_years)
4874
- PU_df = pd.concat([PU_df, TD], axis = 1)
4897
+ TD_A = pd.Series(name = str(EWR + '_totalEventDays'), data = total_days, index = unique_water_years)
4898
+ # PU_df = pd.concat([PU_df, TD], axis = 1)
4875
4899
  # Total event days ACHIEVED
4876
4900
  total_days_achieved = get_achieved_event_days(EWR_info, events)
4877
4901
  TDA = pd.Series(name = str(EWR + '_totalEventDaysAchieved'), data = total_days_achieved, index = unique_water_years)
4878
- PU_df = pd.concat([PU_df, TDA], axis = 1)
4902
+ # PU_df = pd.concat([PU_df, TDA], axis = 1)
4879
4903
  # Max event days
4880
4904
  max_days = get_max_event_days(events, unique_water_years)
4881
4905
  MD = pd.Series(name = str(EWR + '_maxEventDays'), data = max_days, index = unique_water_years)
4882
- PU_df = pd.concat([PU_df, MD], axis = 1)
4906
+ # PU_df = pd.concat([PU_df, MD], axis = 1)
4883
4907
  # Max rolling consecutive event days
4884
4908
  try:
4885
4909
  max_consecutive_days = get_max_consecutive_event_days(events, unique_water_years)
4886
4910
  MR = pd.Series(name = str(EWR + '_maxRollingEvents'), data = max_consecutive_days, index = unique_water_years)
4887
- PU_df = pd.concat([PU_df, MR], axis = 1)
4911
+ # PU_df = pd.concat([PU_df, MR], axis = 1)
4888
4912
  except Exception as e:
4889
4913
  max_consecutive_days = [0]*len(unique_water_years)
4890
4914
  MR = pd.Series(name = str(EWR + '_maxRollingEvents'), data = max_consecutive_days, index = unique_water_years)
4891
- PU_df = pd.concat([PU_df, MR], axis = 1)
4915
+ # PU_df = pd.concat([PU_df, MR], axis = 1)
4892
4916
  log.error(e)
4893
4917
  # Max rolling duration achieved
4894
4918
  achieved_max_rolling_duration = get_max_rolling_duration_achievement(durations, max_consecutive_days)
4895
4919
  MRA = pd.Series(name = str(EWR + '_maxRollingAchievement'), data = achieved_max_rolling_duration, index = unique_water_years)
4896
- PU_df = pd.concat([PU_df, MRA], axis = 1)
4920
+ # PU_df = pd.concat([PU_df, MRA], axis = 1)
4897
4921
  # Append information around available and missing data:
4898
4922
  yearly_gap = get_data_gap(df, water_years, gauge)
4899
4923
  total_days = get_total_series_days(water_years)
4900
4924
  YG = pd.Series(name = str(EWR + '_missingDays'), data = yearly_gap, index = unique_water_years)
4901
- TD = pd.Series(name = str(EWR + '_totalPossibleDays'), data = total_days, index = unique_water_years)
4902
- PU_df = pd.concat([PU_df, YG], axis = 1)
4903
- PU_df = pd.concat([PU_df, TD], axis = 1)
4925
+ TD_B = pd.Series(name = str(EWR + '_totalPossibleDays'), data = total_days, index = unique_water_years)
4926
+ # PU_df = pd.concat([PU_df, YG], axis = 1)
4927
+ # PU_df = pd.concat([PU_df, TD], axis = 1)
4928
+ PU_df = pd.concat(
4929
+ [PU_df,
4930
+ YWE,
4931
+ NEA,
4932
+ NE,
4933
+ NEALL,
4934
+ MIP,
4935
+ MIPA,
4936
+ AL,
4937
+ ALA,
4938
+ TD_A,
4939
+ TDA,
4940
+ MD,
4941
+ MR,
4942
+ MRA,
4943
+ YG,
4944
+ TD_B
4945
+ ],
4946
+ axis=1
4947
+ )
4904
4948
 
4905
4949
  return PU_df
4906
4950