How different methods of getting spectra in Python actually work?
You made a vector of time points spaced at 0.01 seconds. So your sampling frequency is 100 Hz. 

You multiplied this time vector by $0.2\pi$ for the $\sin$ term and $3\pi$ for the $\cos$ term. So the two frequency components are 0.1 Hz and 1.5 Hz.

In your first attempt with FFT, you can get the power spectrum by calculating the square of the spectrum:

power = np.abs( np.fft.fft(y)/N )**2.0


The first half of this vector corresponds to analog frequencies from 0 to Nyquist, which in your case is 50Hz. So:

freq = np.linspace(0, 100./2, N/2)


and then plot

plt.plot( freq, power[0:N/2] )


You should see two spikes, one at 0.1 and the other at 1.5.

When using the Welch method, remember that your spectrum will get smeared and attenuated due to windowing. The right way to use that function is to provide it your sampling frequency as an input:

f, Pxx = sp.welch( y, fs=100.0 )


Since your sine wave frequency is 0.1Hz and 10 seconds of data barely fits 1 full cycle of the sine wave, Welch method will not be able to pick out that low frequency very well. If you increase your signal length to, say, 100 seconds and try the same thing with a longer window parameter, say nperseg=1024, you'll see a much cleaner double peak using sp.welch.