def test_dtypes_from_api(reference_laps_data): session, laps = reference_laps_data for drv in session.car_data.keys(): ensure_data_type(CAR_DATA_DTYPES, session.car_data[drv]) for drv in session.pos_data.keys(): ensure_data_type(POS_DATA_DTYPES, session.pos_data[drv])
def test_merging_10_hz(reference_laps_data): session, laps = reference_laps_data lap = laps.pick_fastest() drv = lap['DriverNumber'] test_car_data = session.car_data[drv].slice_by_lap(lap) test_pos_data = session.pos_data[drv].slice_by_lap(lap) merged = test_car_data.merge_channels(test_pos_data, frequency=10) ensure_data_type(CAR_DATA_DTYPES, merged) ensure_data_type(POS_DATA_DTYPES, merged) # test that all channels still exist channels = set(test_car_data.columns).union(set(test_pos_data.columns)) for ch in channels: assert ch in merged.columns # assert correct number of samples for duration at 10 Hz within +-1 sample n_samples_target = round(test_car_data['Time'].iloc[-1].total_seconds() * 10, 0) assert len(merged) in (n_samples_target-1, n_samples_target, n_samples_target+1) # no values should be nan; everything should be interpolated assert not pandas.isnull(merged.to_numpy()).any() # check correct timing assert merged['Time'].iloc[0] == pandas.Timedelta(0) assert merged['SessionTime'].iloc[0] != pandas.Timedelta(0)
def test_merging_original_freq(reference_laps_data): session, laps = reference_laps_data lap = laps.pick_fastest() drv = lap['DriverNumber'] test_car_data = session.car_data[drv].slice_by_lap(lap) test_pos_data = session.pos_data[drv].slice_by_lap(lap) merged = test_car_data.merge_channels(test_pos_data, frequency='original') ensure_data_type(CAR_DATA_DTYPES, merged) ensure_data_type(POS_DATA_DTYPES, merged) # test that all channels still exist channels = set(test_car_data.columns).union(set(test_pos_data.columns)) for ch in channels: assert ch in merged.columns # test that merged number of samples is within 1% of sum of samples of the individual objects # some samples can overlap and therefore be combined during merging but should only happen for very few assert round((len(test_car_data) + len(test_pos_data)) / len(merged), 2) == 1.0 # no values should be nan; everything should be interpolated assert not pandas.isnull(merged.to_numpy()).any() # check correct timing assert merged['Time'].iloc[0] == pandas.Timedelta(0) assert merged['SessionTime'].iloc[0] != pandas.Timedelta(0)
def test_dtypes_pick(reference_laps_data): session, laps = reference_laps_data drv = list(laps['Driver'].unique())[1] # some driver ensure_data_type(LAP_DTYPES, laps.pick_driver(drv)) ensure_data_type(LAP_DTYPES, laps.pick_quicklaps()) ensure_data_type(LAP_DTYPES, laps.iloc[:2]) ensure_data_type(LAP_DTYPES, laps.pick_driver(drv).iloc[:3].pick_quicklaps())
def test_slice_by_time(reference_laps_data): session, laps = reference_laps_data drv = list(session.car_data.keys())[1] # some driver test_data = session.car_data[drv] t0 = test_data['SessionTime'].iloc[1000] t1 = test_data['SessionTime'].iloc[2000] slice1 = test_data.slice_by_time(t0, t1) assert slice1['SessionTime'].iloc[0] == t0 assert slice1['SessionTime'].iloc[-1] == t1 assert len(slice1) == 1001 ensure_data_type(CAR_DATA_DTYPES, slice1) dt = pandas.Timedelta(100, 'ms') slice2 = test_data.slice_by_time(t0-dt, t1+dt, interpolate_edges=True) assert slice2['SessionTime'].iloc[0] == t0 - dt assert slice2['SessionTime'].iloc[-1] == t1 + dt assert len(slice2) == 1003 ensure_data_type(CAR_DATA_DTYPES, slice2)
def test_dtypes_from_api(reference_laps_data): session, laps = reference_laps_data ensure_data_type(LAP_DTYPES, laps)