Beispiel #1
0
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
Beispiel #2
0
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])
Beispiel #3
0
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
Beispiel #4
0
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)