This is really interesting!
Have you given much thought to either type annotations or decorators. One or both of them could potentially be useful for attaching schema information to the DataFrame inputs/outputs of functions and for reducing boilerplate when you might want to validate those inputs/outputs before or after calling the functions.