You are almost there, but Basemap can be temperamental, and you need to control the z-order of the details / data of the map. In addition, you must convert your lon / lat coordinates to match projection coordinates before creating them using the base map.
Here is a complete solution that gives the following result. I changed some colors and line widths to make it all more legible, YMMV. I also scaled the size of the scatter points by the normalized "average" value ( data['Z'] ) - you can simply delete it and replace it, for example. 50 if you prefer a constant size (it will look like the largest marker).
Please also indicate the units of precipitation and the duration of the measurement in which the funds were received, if possible:

import numpy as np import pandas as pd from matplotlib.mlab import griddata from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt from matplotlib.colors import Normalize %matplotlib inline
Using the matplotlib griddata method is convenient, but it can also be slow. Alternatively, you can use scipy griddata methods, which are faster and more flexible:
from scipy.interpolate import griddata as gd zi = gd( (data[['projected_lon', 'projected_lat']]), data.Z.values, (xi, yi), method='linear')
If you use the scipy griddata method, you will also need to determine which of the methods ( nearest , linear , cubic ) gives the best result.
I must add that the interpolation methods demonstrated and discussed above are the simplest and not necessarily valid for interpolating rain data. This article provides a good overview of valid approaches and considerations for use in hydrology and hydrological modeling. The implementation of these (possibly using Scipy) is left as an exercise & c.