@@ -36,45 +36,46 @@ def get_func_description(func):
3636 return desc
3737
3838
39- def generate_test_dataset (center = 25 , amplitude = 10 , name = "temperature" , units = "degC" ):
39+ def generate_test_warming_dataarray (start_date = "2000-01-01" , end_date = "2009-12-31" , grid_shape = (10 , 10 ), warming_period = 10 ):
40+ base_data = generate_test_control_dataarray (start_date = start_date , end_date = end_date , grid_shape = grid_shape )
41+ base_data += xarray .DataArray (np .arange (base_data ["time" ].size ) / (365 * warming_period ), dims = ["time" ], coords = {"time" : base_data ["time" ]})
42+ return base_data
43+
44+
45+ def generate_test_rh_dataarray (start_date = "2000-01-01" , end_date = "2009-12-31" , grid_shape = (10 , 10 )):
46+ base_data = generate_test_control_dataarray (start_date = start_date , end_date = end_date , grid_shape = grid_shape )
47+ base_data = abs (base_data / base_data .max () - 0.3 )
48+ base_data = base_data .rename ("test_rh_data" )
49+ base_data .attrs ["units" ] = 'g/g'
50+ return base_data
51+
52+
53+ def generate_test_control_dataarray (start_date = "2000-01-01" , end_date = "2009-12-31" , grid_shape = (10 , 10 )):
4054 time_values = xarray .date_range (
41- start = cftime . DatetimeNoLeap ( 2000 , 1 , 1 ) ,
42- end = cftime . DatetimeNoLeap ( 2009 , 12 , 31 ) ,
55+ start = start_date ,
56+ end = end_date ,
4357 freq = "D" ,
4458 calendar = "noleap" ,
4559 use_cftime = True
4660 )
61+ temperature_seasonal_ts = 20 + 15 * np .sin (np .pi * np .arange (time_values .size , dtype = float ) / 365 )
62+ temperature_seasonal_vals = np .broadcast_to (temperature_seasonal_ts , (grid_shape [0 ], grid_shape [1 ], temperature_seasonal_ts .size ))
4763
48- temp_timeseries = center + amplitude * np .sin (np .pi * np .arange (time_values .size , dtype = float ) / 365 )
49- temp_values = np .broadcast_to (temp_timeseries , (3 , 3 , temp_timeseries .size ))
50-
51- temp_da = xarray .DataArray (
52- data = da .from_array (temp_values ),
53- dims = ["lat" , "lon" , "time" ],
64+ lat_vals = np .linspace (- 90 , 90 , grid_shape [1 ], dtype = float )
65+
66+ lat_grad = np .broadcast_to (np .abs (lat_vals ) / 90 * 15 , grid_shape ).T
67+ temperature_seasonal_vals = temperature_seasonal_vals - lat_grad [:, :, None ]
68+
69+ return xarray .DataArray (
70+ data = temperature_seasonal_vals ,
71+ dims = ["lon" , "lat" , "time" ],
5472 coords = {
55- "lat " : np .array ([ - 90 , 0 , 90 ], dtype = float ),
56- "lon " : np . array ([ - 180 , 0 , 180 ], dtype = float ) ,
73+ "lon " : np .linspace ( - 180 , 180 , grid_shape [ 0 ], dtype = float ),
74+ "lat " : lat_vals ,
5775 "time" : time_values
5876 },
59- name = name ,
77+ name = "test_temperature_data" ,
6078 attrs = {
61- "units" : units
79+ "units" : "degC"
6280 }
63- ).chunk (dict (lat = 1 , lon = 1 ))
64- return xarray .Dataset ({name : temp_da })
65-
66-
67- def generate_exceedance_dataarray (measure , exceedance_pattern , multiplier = 1.0 ):
68- tiles = np .ceil (measure .time .size / len (exceedance_pattern )).astype (int )
69- pattern_data = np .broadcast_to (np .tile (exceedance_pattern , tiles )[:measure .time .size ], measure .shape )* multiplier
70-
71- ret_da = None
72- with xarray .set_options (keep_attrs = True ):
73- ret_da = measure + xarray .DataArray (
74- data = da .from_array (pattern_data ),
75- dims = measure .dims ,
76- coords = measure .coords ,
77- name = measure .name ,
78- attrs = measure .attrs
79- ).chunk (measure .chunksizes )
80- return ret_da
81+ ).chunk ('auto' )
0 commit comments