The way this is written right now, `import patsy` will call `import patsy.mgcv_cubic_splines` which will call `import scipy` and unconditionally blow up if not found. So you've just added a hard dependency on scipy, even for people who aren't going to use the spline functionality. (Currently, if you don't have scipy installed, then trying to call `bs` will raise an error, but everything else works.)

I'm not necessarily opposed to making scipy a hard dependency at some point, but I think it's easy to avoid doing so here, and therefore worthwhile. It looks like the only place where scipy functionality is actually used is in `_get_natural_f` -- could we move the scipy import check/error to there? (And use np.linalg for the other calls that are currently going through scipy.linalg.)