I'd run a Gaussian filter over the data to smooth:
# first, make a function to linearly interpolate the data
f = scipy.interpolate.interp1d(x,y)
# resample with 1000 samples
xx = np.linspace(-20,19, 1000)
# compute the function on this finer interval
yy = f(xx)
# make a gaussian window
window = scipy.signal.gaussian(200, 60)
# convolve the arrays
smoothed = scipy.signal.convolve(yy, window/window.sum(), mode='same')
# get the maximum
xx[np.argmax(smoothed)]
Here's the smoothed result:
The max occurs at 6.93.
There are a whole bunch of other window functions and filtering options in scipy.signal
. See the documentation for more.