diff options
Diffstat (limited to 'dot_ipython/profile_default/startup/80_pandas.py')
-rw-r--r-- | dot_ipython/profile_default/startup/80_pandas.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/dot_ipython/profile_default/startup/80_pandas.py b/dot_ipython/profile_default/startup/80_pandas.py new file mode 100644 index 0000000..be18869 --- /dev/null +++ b/dot_ipython/profile_default/startup/80_pandas.py @@ -0,0 +1,70 @@ +"""Pandas utilities.""" + + +def _setup(): + import logging + import time + import fcntl + import struct + import termios + import threading + + class PandasResizer(threading.Thread): + """Pandas width/max_row resizer depending on tty size.""" + + def __init__(self, max_rows=200): + self.max_rows = max_rows + self.width = None + self.logger = logging.getLogger("startup.pandas") + self._run = False + super().__init__(name=type(self).__name__, daemon=True) + + @staticmethod + def _size(): + ioctl = fcntl.ioctl( + 0, termios.TIOCGWINSZ, struct.pack("HHHH", 0, 0, 0, 0) + ) + th, tw, hp, wp = struct.unpack("HHHH", ioctl) + return tw, th + + def run(self): + last_resize = float("inf") + first_print = True + self.logger.info("Resizer running") + self._run = True + while self._run: + width = self._size()[0] - 1 + if width != self.width: + last_resize = time.time() + self.width = width + if first_print or last_resize + 0.5 < time.time(): + last_resize = float("inf") + pd.set_option("display.width", self.width) + pd.set_option("display.max_rows", self.max_rows) + if first_print: + self.logger.info( + "Resized pandas to %dx%d", + self.width, + self.max_rows, + ) + first_print = False + time.sleep(0.2) + + def stop(self): + self._run = False + + PandasResizer().start() + + +try: + import pandas as pd + import numpy as np +except ModuleNotFoundError: + pass +else: + _setup() + + +del _setup + +_summarise_startup() |