A ‘Profile’ produces either a weighted (or unweighted) average or a straight sum of a field in a bin defined by another field. In the case of a weighted average, we have: p_i = sum( w_i * v_i ) / sum(w_i)
We accept a data_source, which will be binned into n_bins by the field bin_field between the lower_bound and the upper_bound. These bins may or may not be equally divided in log_space, and the lazy_reader flag controls whether we use a memory conservative approach. If end_collect is True, take all values outside the given bounds and store them in the 0 and n_bins-1 values.