They do and they don't, there's often mismatches where the library gets updated and the stubs haven't been. It makes adopting difficult to recommend in some cases, especially if the library is under more flux.

Django's stubbing isn't great, there's a lot of polymorphism in the framework (and in DRF). You actually have to change your code rather than just sprinkling annotations in some of places to stop getting 'Any' types.

With the numeric stuff, it's even worse though, for with something like e.g.:

    np.sum(X)
the appropriate type of X can be a python list, a numpy array of any numeric type and dimension, etc.