def test_histogram_data_nested(): # Testing vals dir_vals = [0, 0, 0, 10, 10, 10, 85, 90, 90, 90, 95, 170, 285, 288] spd_vals = dir_vals # Make into fake data collections a_per = AnalysisPeriod(6, 21, 12, 6, 21, 13) dates = [DateTime(6, 21, i) for i in range(len(dir_vals))] spd_header = Header(Speed(), 'm/s', a_per) dir_header = Header(GenericType('Direction', 'deg'), 'deg', a_per) spd_data = HourlyDiscontinuousCollection(spd_header, spd_vals, dates) dir_data = HourlyDiscontinuousCollection(dir_header, dir_vals, dates) # Init simple example w segs == bin num w = WindRose(dir_data, spd_data, 4) #w.legend_parameters = LegendParameters(segment_count=5) w.frequency_hours = 1 # Bin values to divide into colors # 315-45: [10, 10, 10]; 2 intervals, [10, 10, 10] # 45-135: [85, 90, 90, 90, 95]; 3 intervals, [85, 90, 90, 90, 95] # 135-225: [170]; 1 intervals, [170]; # 225-315: [285, 288]; 2 intervals, [285, 288] # interval_num: [2, 3, 1, 2] chk_histstack = [ [10, 10, 10], [85, 90, 90, 90, 95], [170.], [285, 288]] # Testing histstack = WindRose._histogram_data_nested(w.histogram_data, 1) for chkh, h in zip(chk_histstack, histstack): for c, _h in zip(chkh, h): assert abs(c - _h) <= 1e-10 # Init complex dir set divided by 4 w = WindRose(dir_data, spd_data, 4) w.frequency_hours = 2 # Bin values to divide into colors # 315-45: [10, 10, 10]; 2 intervals, [10, 10] # 45-135: [85, 90, 90, 90, 95]; 3 intervals, [87.5, 90, 95. ] # 135-225: [170]; 1 intervals, [170] # 225-315: [285, 288]; 2 intervals, [286.5] # interval_num: [2, 3, 1, 2] chk_histstack = [ [10, 10], [87.5, 90, 95.], [170.], [286.5]] # Testing histstack = WindRose._histogram_data_nested(w.histogram_data, 2) for chkh, h in zip(chk_histstack, histstack): for c, _h in zip(chkh, h): assert abs(c - _h) <= 1e-10
def test_radial_histogram_plot(): """ Test circular histogram""" # Testing vals ensure all histogram heights are equal. dir_vals = [3, 3, 10, # 315 - 45 85, 90, 95, # 45 - 135 170, 170, 170, # 135 - 225 230, 285, 288] # 225 - 315 spd_vals = dir_vals # Make into fake data collections a_per = AnalysisPeriod(6, 21, 12, 6, 21, 13) dates = [DateTime(6, 21, i) for i in range(len(dir_vals))] spd_header = Header(Speed(), 'm/s', a_per) dir_header = Header(GenericType('Direction', 'deg'), 'deg', a_per) spd_data = HourlyDiscontinuousCollection(spd_header, spd_vals, dates) dir_data = HourlyDiscontinuousCollection(dir_header, dir_vals, dates) # Init simple dir set divided by 4 w = WindRose(dir_data, spd_data, 4) f = _deg2rad cos, sin = math.cos, math.sin # Testing bin_vecs = w.bin_vectors vec_cpt = (0, 0) radius_arr = (0., 1.) hist = w.histogram_data speeds = [val for bin in w.histogram_data for val in bin] min_speed, max_speed = min(speeds), max(speeds) speed_interval = (max_speed - min_speed) / w.legend_parameters.segment_count histstack, _ = w._histogram_data_nested( hist, (min_speed, max_speed), speed_interval) show_freq = False vecs = WindRose._histogram_array_radial(bin_vecs, vec_cpt, hist, histstack, radius_arr, show_freq) # Make bins of equal height (unit circle) chk_bin_vecs = [[(cos(f(225)), -sin(f(225))), # 0 west (cos(f(-45)), -sin(f(-45)))], [(cos(f(-45)), -sin(f(-45))), # 1 north (cos(f(45)), -sin(f(45)))], [(cos(f(45)), -sin(f(45))), # 2 east (cos(f(135)), -sin(f(135)))], [(cos(f(135)), -sin(f(135))), # 3 south (cos(f(225)), -sin(f(225)))]] for i in range(len(chk_bin_vecs)): vec2, vec1 = chk_bin_vecs[i][0], chk_bin_vecs[i][1] chk_pts = [vec1, vec2] pts = vecs[i][1:] # Get rid of cpt (0, 0) for p, cp in zip(pts, chk_pts): assert abs(p[0] - cp[0]) < 1e-10, (p[0], cp[0]) assert abs(p[1] - cp[1]) < 1e-10, (p[1], cp[1])
def test_histogram_data_nested(): # Testing vals dir_vals = [0, 0, 0, 0, 10, 10, 10, 85, 90, 90, 90, 95, 170, 285, 310] spd_vals = [0, 0, 0, 0, 1, 145, 189, 15, 10, 150, 299, 259, 100, 5, 301] # Make into fake data collections a_per = AnalysisPeriod(6, 21, 12, 6, 21, 13) dates = [DateTime(6, 21, i) for i in range(len(dir_vals))] spd_header = Header(Speed(), 'm/s', a_per) dir_header = Header(GenericType('Direction', 'deg'), 'deg', a_per) spd_data = HourlyDiscontinuousCollection(spd_header, spd_vals, dates) dir_data = HourlyDiscontinuousCollection(dir_header, dir_vals, dates) # Init complex dir set divided by 4, and 2 hourly intervals w = WindRose(dir_data, spd_data, 4) w.frequency_hours = 2 w.legend_parameters.segment_count = 7 # Bin values to divide into 6 intervals = 10 - 310 = 300 / 6 = 50 m/s # intervals: [1-50, 51-100, 101-150, 151-200, 201-250, 251-300, 301-350] # # each frequency interval = 1/6 ~ 0.166 of total speed # 315-45: [1, 145, 189]; 3 bands [0-49, 100-149, 150-199] # 45-135: [15, 10, 150, 299, 259]; 3 bands, [0-49, 150-199,, 250-299] # 135-225: [100]; 1 bands, [100-149] # 225-315: [5, 300]; 2 bands, [0-49, 300, 249] # interval_num: [3, 3, 1, 2] chk_histstack = [ [[1], [], [145], [189], [], []], # 0-49, 100-149, 150-199 [[10, 15], [], [150], [], [], [259, 299]], # 0-49, 150-199,, 250-299 [[], [100], [], [], [], []], # 100-149 [[5], [], [], [], [], [301]]] # 0-49, 300-349 # Testing speeds = [val for bin in w.histogram_data for val in bin] min_speed, max_speed = min(speeds), max(speeds) histstack, bins = WindRose._histogram_data_nested( w.histogram_data, (min_speed, max_speed), w.legend_parameters.segment_count) # Check assert len(chk_histstack) == len(histstack) for cbins, bins in zip(chk_histstack, histstack): assert len(cbins) == len(bins) for cbin, bin in zip(cbins, bins): assert len(cbin) == len(bin) for cval, val in zip(cbin, bin): assert abs(cval - val) <= 1e-10, (cval, val) # Check with zeros w.show_zeros = True w.frequency_hours = 1.0 w.frequency_spacing_distance = 25.0 hypot_dist = w.frequency_spacing_hypot_distance assert abs(w._zero_mesh_radius - hypot_dist) < 1e-10 # Check with zeros 2 # Testing vals dir_vals = [0, 0, 0, 0, 0, 0, 10, 10, 10, 85, 90, 90, 90, 95, 170, 285, 310] spd_vals = [0, 0, 0, 0, 0, 0, 1, 145, 189, 15, 10, 150, 299, 259, 100, 5, 301] # Make into fake data collections a_per = AnalysisPeriod(6, 21, 12, 6, 21, 13) dates = [DateTime(6, 21, i) for i in range(len(dir_vals))] spd_header = Header(Speed(), 'm/s', a_per) dir_header = Header(GenericType('Direction', 'deg'), 'deg', a_per) spd_data = HourlyDiscontinuousCollection(spd_header, spd_vals, dates) dir_data = HourlyDiscontinuousCollection(dir_header, dir_vals, dates) # Init complex dir set divided by 4, and 2 hourly intervals w = WindRose(dir_data, spd_data, 4) w.show_zeros = True w.frequency_hours = 1.0 w.frequency_spacing_distance = 25.0 hypot_dist = w.frequency_spacing_hypot_distance * 1.5 assert abs(w._zero_mesh_radius - hypot_dist) < 1e-10
def test_windrose_frequency_distribution(): """Test frequency distribution""" # Testing mesh scaling dir_vals = [1, 2, 3, 4, 5, 6, 90, 91, 92, 93, 94, 95, 180, 181, 182, 183, 184, 185, 270, 271, 272, 273, 274, 275] spd_vals = dir_vals # Make into fake data collections a_per = AnalysisPeriod(6, 21, 12, 6, 21, 13) dates = [DateTime(6, 21, i) for i in range(len(dir_vals))] spd_header = Header(Speed(), 'm/s', a_per) dir_header = Header(GenericType('Direction', 'deg'), 'deg', a_per) spd_data = HourlyDiscontinuousCollection(spd_header, spd_vals, dates) dir_data = HourlyDiscontinuousCollection(dir_header, dir_vals, dates) # Init simple dir set divided by 4 w = WindRose(dir_data, spd_data, 4) w.frequency_hours = 3 assert w.frequency_intervals_mesh == 2 assert w.real_freq_max == 6 assert w.frequency_maximum == 6 freqs = WindRose._histogram_data_nested(w.histogram_data, 3) north_hbin = freqs[0] assert north_hbin[0] == 2.0 # [1, 2, 3] assert north_hbin[1] == 5.0 # [4, 5, 6] assert north_hbin[0] == sum(w.histogram_data[0][:3]) / 3.0 # Test w/ epw epw_path = os.path.join(os.getcwd(), 'tests/fixtures/epw/tokyo.epw') epw = EPW(epw_path) # Test 16 directions w = WindRose(epw.wind_direction, epw.wind_speed, 3) w.show_zeros = False w.show_freq = True # w.real_freq_max: 4406 # w.frequency_maximum: 4600 # Test w/ no stacking w.frequency_hours = 4600 # 1 bin ytick_num = w.frequency_intervals_mesh assert ytick_num == 1 freqs = WindRose._histogram_data_nested(w.histogram_data, 4600) hbin = freqs[0] test_val = sum(w.histogram_data[0]) / len(w.histogram_data[0]) assert hbin[0] == pytest.approx(test_val, abs=1e-10) # Test w/ stacking w.frequency_hours = 5 # 1 bin h = w.frequency_hours freqs = WindRose._histogram_data_nested(w.histogram_data, h) hbin = freqs[0] sort_hist_bar = sorted(w.histogram_data[0]) test_val = sum(sort_hist_bar[:5]) / 5.0 assert hbin[0] == pytest.approx(test_val, abs=1e-10)