Dataframe extension integration

Using the logging methods directly on the module should be avoided. They prevent anyone using this library from selectively controlling the messages (as they aren't namespaced). I also believe this has some issues with threading. Luckily a simple fix is to define a module level logger at the top (e.g. `logger = logging.getLogger(__name__)`) and use it throughout instead.