Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions pepsico/app_calc.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,8 @@ def seasonal_data(monthly_data, start_month, end_month, start_year=None, end_yea


def seasonal_wwc(
labelled_season_data, variable, frost_threshold, wet_threshold
labelled_season_data, variable, frost_threshold, wet_threshold,
rain_event_amount, rain_event_window,
):
# Boolean variables need the additional where to return NaNs from False/0 to Nans
# and the sum parameters for entirely NaNs seasons to remain NaNs and not turn to
Expand Down Expand Up @@ -162,6 +163,17 @@ def seasonal_wwc(
.sum(skipna=True, min_count=1)
)
wwc_units = "days"
if variable == "rain_events":
data_ds = (
labelled_season_data
.groupby(labelled_season_data["seasons_starts"])
.map(
number_extreme_events_within_days, threshold=rain_event_amount,
window=rain_event_window,
#skipna=True, min_count=1,
)
)
wwc_units = ""
# This is all a bit tedious but I didn't figure out another way to keep
# seasons_ends and renaming time dim T
# Can revisit later if this code has a future
Expand Down Expand Up @@ -656,7 +668,7 @@ def number_extreme_events_within_days(
Examples
--------
Number of rain events of >80mm in 2 days or less:
number_extreme_events_within_days(rain_daily_data_in_mm, "gt", 80, 2)
number_extreme_events_within_days(rain_daily_data_in_mm, 80, 2)
"""
count = 0
dd = daily_data.copy()
Expand Down
33 changes: 30 additions & 3 deletions pepsico/proj_wwc/layout.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def app_layout():
id="variable",
options=[
# "warm_nights",
# "rain_events",
"rain_events",
"mean_Tmax",
"mean_Tmin",
"dry_days",
Expand All @@ -57,7 +57,7 @@ def app_layout():
],
labels=[
# "Warm Nights",
# "Count of Rain Events",
"Count of Rain Events",
"Mean Max Temperature",
"Mean Min Temperature",
"Count of Dry Days",
Expand Down Expand Up @@ -96,7 +96,27 @@ def app_layout():
width="5em",
debounce=False,
),
"mm",
"mm; ",
"Rain event: ",
Number(
id="ret",
default=80,
min=0,
max=999,
width="5em",
debounce=False,
),
"mm or more; ",
"within: ",
Number(
id="rew",
default=2,
min=1,
max=99,
width="5em",
debounce=False,
),
"days or less",
),
Block("Season",
Number(
Expand Down Expand Up @@ -206,6 +226,13 @@ def app_layout():
Obtained through parametric Normal distributions.
"""
]),
html.P([
html.B("Count of Rain Events (rain_events):"),"""
Number of rain events in the season. A rain event accumulates
a user-defined threshold in mm or more in a user-defined number
of days or less.
"""
]),
),

lou.map(GLOBAL_CONFIG["zoom"]),
Expand Down
55 changes: 38 additions & 17 deletions pepsico/proj_wwc/maproom.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ def select_var(variable):
]:
data_var = "tasmax"
if variable in [
# "rain_events",
"rain_events",
"dry_days",
"wet_days",
# "longest_dry_spell",
Expand All @@ -115,7 +115,7 @@ def local_data(
lat, lng, region,
model, variable,
start_day, start_month, end_day, end_month,
frost_threshold, wet_threshold,
frost_threshold, wet_threshold, rain_event_amount, rain_event_window,
):
model = [model] if model != "Multi-Model-Average" else [
"GFDL-ESM4", "IPSL-CM6A-LR", "MPI-ESM1-2-HR","MRI-ESM2-0", "UKESM1-0-LL"
Expand Down Expand Up @@ -160,7 +160,8 @@ def local_data(
ac.daily_tobegroupedby_season(
data_ds, start_day, start_month, end_day, end_month,
),
variable, frost_threshold, wet_threshold,
variable, frost_threshold, wet_threshold, rain_event_amount,
rain_event_window,
)
return data_ds, error_msg

Expand Down Expand Up @@ -226,12 +227,14 @@ def invalid_button(lat, lng, lat_min, lng_min, lat_max, lng_max):
State("end_month", "value"),
State("frost", "value"),
State("wet", "value"),
State("ret", "value"),
State("rew", "value"),
prevent_initial_call=True,
)
def send_data_as_csv(
n_clicks, marker_pos, region, variable,
start_day, start_month, end_day, end_month,
frost_threshold, wet_threshold,
frost_threshold, wet_threshold, rain_event_amount, rain_event_window,
):
lat = marker_pos[0]
lng = marker_pos[1]
Expand All @@ -241,11 +244,13 @@ def send_data_as_csv(
end_month = ac.strftimeb2int(end_month)
frost_threshold = float(frost_threshold)
wet_threshold = float(wet_threshold)
rain_event_amount = float(rain_event_amount)
rain_event_window = int(rain_event_window)
model = "Multi-Model-Average"
data_ds, error_msg = local_data(
lat, lng, region, model, variable,
start_day, start_month, end_day, end_month,
frost_threshold, wet_threshold,
frost_threshold, wet_threshold, rain_event_amount, rain_event_window,
)
if error_msg == None :
lng_units = "E" if (lng >= 0) else "W"
Expand Down Expand Up @@ -279,12 +284,14 @@ def send_data_as_csv(
State("end_year_ref", "value"),
State("frost", "value"),
State("wet", "value"),
State("ret", "value"),
State("rew", "value"),
)
def local_plots(
marker_pos, region, n_clicks, model, variable,
start_day, end_day, start_month, end_month,
start_year, end_year, start_year_ref, end_year_ref,
frost_threshold, wet_threshold,
frost_threshold, wet_threshold, rain_event_amount, rain_event_window,
):
lat = marker_pos[0]
lng = marker_pos[1]
Expand All @@ -294,10 +301,12 @@ def local_plots(
end_month = ac.strftimeb2int(end_month)
frost_threshold = float(frost_threshold)
wet_threshold = float(wet_threshold)
rain_event_amount = float(rain_event_amount)
rain_event_window = int(rain_event_window)
data_ds, error_msg = local_data(
lat, lng, region, model, variable,
start_day, start_month, end_day, end_month,
frost_threshold, wet_threshold,
frost_threshold, wet_threshold, rain_event_amount, rain_event_window,
)
if error_msg != None :
local_graph = pingrid.error_fig(error_msg)
Expand Down Expand Up @@ -458,7 +467,7 @@ def seasonal_change(
scenario, model, variable, region,
start_day, end_day, start_month, end_month,
start_year, end_year, start_year_ref, end_year_ref,
frost_threshold, wet_threshold,
frost_threshold, wet_threshold, rain_event_amount, rain_event_window,
):
model = [model] if model != "Multi-Model-Average" else [
"GFDL-ESM4", "IPSL-CM6A-LR", "MPI-ESM1-2-HR","MRI-ESM2-0", "UKESM1-0-LL"
Expand All @@ -475,7 +484,8 @@ def seasonal_change(
).to_dataset(),
start_day, start_month, end_day, end_month,
),
variable, frost_threshold, wet_threshold,
variable, frost_threshold, wet_threshold, rain_event_amount,
rain_event_window,
).mean(dim="T", keep_attrs=True) for m in model
], "M").mean("M", keep_attrs=True)
data = xr.concat([
Expand All @@ -489,7 +499,8 @@ def seasonal_change(
).to_dataset(),
start_day, start_month, end_day, end_month,
),
variable, frost_threshold, wet_threshold,
variable, frost_threshold, wet_threshold, rain_event_amount,
rain_event_window,
).mean(dim="T", keep_attrs=True) for m in model
], "M").mean("M", keep_attrs=True)
#Tedious way to make a subtraction only to keep attributes (units)
Expand Down Expand Up @@ -531,24 +542,28 @@ def map_attributes(data, variable):
State("end_year_ref", "value"),
State("frost", "value"),
State("wet", "value"),
State("ret", "value"),
State("rew", "value"),
)
def draw_colorbar(
region, n_clicks, scenario, model, variable,
start_day, end_day, start_month, end_month,
start_year, end_year, start_year_ref, end_year_ref,
frost_threshold, wet_threshold,
frost_threshold, wet_threshold, rain_event_amount, rain_event_window,
):
start_day = int(start_day)
end_day = int(end_day)
start_month = ac.strftimeb2int(start_month)
end_month = ac.strftimeb2int(end_month)
frost_threshold = float(frost_threshold)
wet_threshold = float(wet_threshold)
rain_event_amount = float(rain_event_amount)
rain_event_window = int(rain_event_window)
data = seasonal_change(
scenario, model, variable, region,
start_day, end_day, start_month, end_month,
start_year, end_year, start_year_ref, end_year_ref,
frost_threshold, wet_threshold,
frost_threshold, wet_threshold, rain_event_amount, rain_event_window,
)
colorbar, min, max = map_attributes(data, variable)
return (
Expand All @@ -575,20 +590,23 @@ def draw_colorbar(
State("end_year_ref", "value"),
State("frost", "value"),
State("wet", "value"),
State("ret", "value"),
State("rew", "value"),
)
def make_map(
region, n_clicks, scenario, model, variable,
start_day, end_day, start_month, end_month,
start_year, end_year, start_year_ref, end_year_ref,
frost_threshold, wet_threshold,
frost_threshold, wet_threshold, rain_event_amount, rain_event_window,
):
try:
send_alarm = False
url_str = (
f"{TILE_PFX}/{{z}}/{{x}}/{{y}}/{region}/{scenario}/{model}/"
f"{variable}/{start_day}/{end_day}/{start_month}/{end_month}/"
f"{start_year}/{end_year}/{start_year_ref}/{end_year_ref}/"
f"{frost_threshold}/{wet_threshold}"
f"{frost_threshold}/{wet_threshold}/{rain_event_amount}/"
f"{rain_event_window}"
)
except:
url_str= ""
Expand All @@ -605,27 +623,30 @@ def make_map(
f"{TILE_PFX}/<int:tz>/<int:tx>/<int:ty>/<region>/<scenario>/<model>/"
f"<variable>/<start_day>/<end_day>/<start_month>/<end_month>/"
f"<start_year>/<end_year>/<start_year_ref>/<end_year_ref>/"
f"<frost_threshold>/<wet_threshold>/"
f"<frost_threshold>/<wet_threshold>/<rain_event_amount>/"
f"<rain_event_window>"
),
endpoint=f"{config['core_path']}"
)
def fcst_tiles(tz, tx, ty,
region, scenario, model, variable,
start_day, end_day, start_month, end_month,
start_year, end_year, start_year_ref, end_year_ref,
frost_threshold, wet_threshold,
frost_threshold, wet_threshold, rain_event_amount, rain_event_window,
):
start_day = int(start_day)
end_day = int(end_day)
start_month = ac.strftimeb2int(start_month)
end_month = ac.strftimeb2int(end_month)
frost_threshold = float(frost_threshold)
wet_threshold = float(wet_threshold)
rain_event_amount = float(rain_event_amount)
rain_event_window = int(rain_event_window)
data = seasonal_change(
scenario, model, variable, region,
start_day, end_day, start_month, end_month,
start_year, end_year, start_year_ref, end_year_ref,
frost_threshold, wet_threshold,
frost_threshold, wet_threshold, rain_event_amount, rain_event_window,
)
(
data[select_var(variable)].attrs["colormap"],
Expand Down
Loading