Source code for exatomic.widgets.widget_df

# -*- coding: utf-8 -*-
# Copyright (c) 2015-2022, Exa Analytics Development Team
# Distributed under the terms of the Apache License 2.0
"""
A dataframe widget
#########################
A generic pandas dataframe widget.
"""
import pandas as pd
from ipywidgets import Box, Dropdown, IntRangeSlider, SelectMultiple, Button, Output, IntSlider
from traitlets import Integer, List, Tuple, Int
from IPython.display import display_html
from exatomic.widgets.widget_utils import _glo, _flo, _wlo, _hboxlo, _vboxlo, _bboxlo, _ListDict, Folder, GUIBox


[docs]class DFBox(Box): cur_frame = Integer(-1).tag(sync=True) columns = List([]).tag(sync=True) indexes = List([]).tag(sync=True) start = Int(0).tag(sync=True) def _update_output(self): self._output.clear_output() with self._output: df = self._df idxs = self.indexes if self.cur_frame >= 0: df = self._df.groupby('frame').get_group(self.cur_frame) #idxs = [max(idxs[0], df.index[0]), min(idxs[1], df.index[-1])] display_html(df[self.columns].loc[range(self.start, self.start + 50)].to_html(), raw=True) def _init_gui(self): close = Button(description=' Close', icon='trash', layout=_wlo) def _close(b): self.close() close.on_click(_close) frame = IntSlider(min=self._df.frame.astype(int).min(), max=self._df.frame.astype(int).max(), value=-1, description='Frame', layout=_wlo) cbut = Button(description=' Columns', icon='barcode') cols = self._df.columns.tolist() cols = SelectMultiple(options=cols, value=cols) def _cols(c): self.columns = c.new self._update_output() cols.observe(_cols, names='value') cfol = Folder(cbut, _ListDict([('cols', cols)])) rbut = Button(description=' Rows', icon='bars') rows = IntRangeSlider(min=self.indexes[0], max=self.indexes[1], value=[0, 50]) def _rows(c): self.indexes = c.new print(self.indexes) self._update_output() rows.observe(_rows, names='value') rfol = Folder(rbut, _ListDict([('rows', rows)])) return _ListDict([('close', close), ('frame', frame), ('cols', cfol), ('rows', rfol)]) def __init__(self, df, *args, **kwargs): self._df = df self.cur_frame = 0 if df.frame.astype(int).max() > 1 else -1 self.indexes = (df.index[0], df.index[-1]) self.start = df.index[0] self.columns = df.columns.tolist() self._controls = self._init_gui() gui = GUIBox(tuple(self._controls.values())) _ = kwargs.pop('layout', None) self._output = Output() children = [gui, self._output] self._update_output() super(DFBox, self).__init__(children, layout=_bboxlo, **kwargs)