@sh.add_function(dsp, outputs=['velocity_speed_ratios'], weight=51)
def identify_velocity_speed_ratios_v3(
engine_speeds_out, velocities, idle_engine_speed, stop_velocity):
"""
Identifies velocity speed ratios from gear box speed vector [km/(h*RPM)].
:param engine_speeds_out:
Engine speed [RPM].
:type engine_speeds_out: numpy.array
:param velocities:
Velocity vector [km/h].
:type velocities: numpy.array
:param idle_engine_speed:
Engine speed idle median and std [RPM].
:type idle_engine_speed: (float, float)
:param stop_velocity:
Maximum velocity to consider the vehicle stopped [km/h].
:type stop_velocity: float
:return:
Constant velocity speed ratios of the gear box [km/(h*RPM)].
:rtype: dict
"""
import sklearn.cluster as sk_clu
idle_speed = idle_engine_speed[0] + idle_engine_speed[1]
b = (engine_speeds_out > idle_speed) & (velocities > stop_velocity)
x = (velocities[b] / engine_speeds_out[b])[:, None]
bandwidth = sk_clu.estimate_bandwidth(x, quantile=0.2)
ms = sk_clu.MeanShift(bandwidth=bandwidth, bin_seeding=True)
ms.fit(x)
vsr = {k + 1: v for k, v in enumerate(sorted(ms.cluster_centers_[:, 0]))}
vsr[0] = 0.0
return vsr