The interpolate_bad_channels preprocessing here multiplies tracs by weights. Here traces is int16 and self.weights is float64 with the result implicitly cast back to int16.
To avoid truncation (and maybe overflow, though as weights are all small that's unlikely) at least traces should be cast to float then properly cast back to int, but maybe the recording be float32 from this point on similar to motion interpolation?