def mk_edit(vals): if vals.dtype is np.dtype(int): return NumberEditor() elif vals.dtype is np.dtype(str): return StringEditor() else: return StringEditor()
def _get_columns(self): if self.value is None: return [] indexes = self.indexes col_names = list(self.value.columns) if not self.hierarchical or len(indexes) == 1: col_names = indexes + col_names else: col_names = indexes[-1:] + col_names df = self.value.reset_index() if len(indexes) > 1 else self.value columns = [] for col in col_names: if col in df.columns: data = df[col] else: data = df.index col_kwargs = {} kind = data.dtype.kind if kind == 'i': formatter = NumberFormatter() editor = IntEditor() elif kind == 'f': formatter = NumberFormatter(format='0,0.0[00000]') editor = NumberEditor() elif isdatetime(data) or kind == 'M': formatter = DateFormatter(format='%Y-%m-%d %H:%M:%S') editor = DateEditor() else: formatter = StringFormatter() editor = StringEditor() if col in self.editors: editor = self.editors[col] if col in indexes or editor is None: editor = CellEditor() if col in self.formatters: formatter = self.formatters[col] if str(col) != col: self._renamed_cols[str(col)] = col if isinstance(self.widths, int): col_kwargs['width'] = self.widths elif str(col) in self.widths: col_kwargs['width'] = self.widths.get(str(col)) title = str(col) if col in indexes and len(indexes) > 1 and self.hierarchical: title = 'Index: %s' % ' | '.join(indexes) column = TableColumn(field=str(col), title=title, editor=editor, formatter=formatter, **col_kwargs) columns.append(column) return columns
def _init_datatable(self): columns = [ TableColumn( width=80, field="parameter", title="Parameter", formatter=self.param_formatter, editor=CellEditor() # non editable ), TableColumn(width=50, field="value", title="Value", formatter=self.value_formatter, editor=CellEditor()), TableColumn(width=40, field="flag", title="Flag", formatter=self.flag_formatter, editor=StringEditor()), ] self.table_df = pd.DataFrame( dict( parameter=self.params, value=[''] * len(self.params), flag=[''] * len(self.params), )) table_cds = ColumnDataSource(self.table_df) self.data_table = DataTable( width=190, height=125, source=table_cds, columns=columns, editable= True, # TODO: check if there is a better way than https://stackoverflow.com/a/49424647/4891717 fit_columns=False, # avoids horizontal scrolls bar index_position=None, # hides index column selectable=True, # this is needed to edit cells reorderable= False, # NOTE: this needs jquery ui, but it is not needed scroll_to_selection=False, # not needed sortable=False, # not needed ) self.data_table.source.on_change('data', self.on_change_data_source)
def weather_tab(self): data = pd.DataFrame(columns = ['time','desc','temp','wind','humidity']) self.weather_source = ColumnDataSource(data) self.weather_subtitle = Div(text="Weather", css_classes=['subt-style']) columns = [TableColumn(field='time', title='Time (local)', width=75), TableColumn(field='desc', title='Description', width=200, editor=StringEditor()), TableColumn(field='temp', title='Temperature (C)', width=100, editor=NumberEditor()), TableColumn(field='wind', title='Wind Speed (mph)', width=120, editor=NumberEditor()), TableColumn(field='humidity', title='Humidity (%)', width=100, editor=PercentEditor())] self.weather_inst = Div(text="Every hour include a description of the weather and any other relevant information, as well as fill in all the fields below. Click the Update Night Log button after every hour's entry. To update a cell: double click in it, record the information, click out of the cell.", width=1000, css_classes=['inst-style']) self.weather_time = TextInput(placeholder='17:00', value=None, width=100) #title='Time in Kitt Peak local time', self.weather_desc = TextInput(title='Description', placeholder='description', value=None) self.weather_temp = TextInput(title='Temperature (C)', placeholder='50', value=None) self.weather_wind = TextInput(title='Wind Speed (mph)', placeholder='10', value=None) self.weather_humidity = TextInput(title='Humidity (%)', placeholder='5', value=None) self.weather_table = DataTable(source=self.weather_source, columns=columns) self.weather_btn = Button(label='Add Weather', css_classes=['add_button'])
def _get_column_definitions(self, col_names, df): import pandas as pd indexes = self.indexes columns = [] for col in col_names: if col in df.columns: data = df[col] else: data = df.index if isinstance(data, pd.DataFrame): raise ValueError("DataFrame contains duplicate column names.") col_kwargs = {} kind = data.dtype.kind if kind == 'i': formatter = NumberFormatter() editor = IntEditor() elif kind == 'b': formatter = StringFormatter() editor = CheckboxEditor() elif kind == 'f': formatter = NumberFormatter(format='0,0.0[00000]') editor = NumberEditor() elif isdatetime(data) or kind == 'M': if len(data) and isinstance(data.values[0], dt.date): date_format = '%Y-%m-%d' else: date_format = '%Y-%m-%d %H:%M:%S' formatter = DateFormatter(format=date_format) editor = DateEditor() else: formatter = StringFormatter() editor = StringEditor() if col in self.editors and not isinstance(self.editors[col], (dict, str)): editor = self.editors[col] if col in indexes or editor is None: editor = CellEditor() if col in self.formatters and not isinstance( self.formatters[col], (dict, str)): formatter = self.formatters[col] if str(col) != col: self._renamed_cols[str(col)] = col if isinstance(self.widths, int): col_kwargs['width'] = self.widths elif str(col) in self.widths: col_kwargs['width'] = self.widths.get(str(col)) title = self.titles.get(col, str(col)) if col in indexes and len(indexes) > 1 and self.hierarchical: title = 'Index: %s' % ' | '.join(indexes) column = TableColumn(field=str(col), title=title, editor=editor, formatter=formatter, **col_kwargs) columns.append(column) return columns