def transform_data_row_values(cls, series, item_map): # Add the values to the row row = {} for key, value in series.iteritems(): key = wrap_list(key) value = metric_value(value) data = {RAW_VALUE: metric_value(value)} # Try to find a display value for the item item = item_map.get(key[0]) display = metric_display(value, getattr(item, 'prefix', None), getattr(item, 'suffix', None), getattr(item, 'precision', None)) if display is not None: data['display'] = display setdeepattr(row, key, data) return row
def _format_metric_cell(value, metric): """ Renders a table cell in a metric column for non-pivoted tables. :param value: The raw value of the metric. :param metric: A reference to the slicer metric to access the display formatting. :return: A dict containing the keys value and display with the raw and display metric values. """ raw_value = formats.metric_value(value) return { 'value': raw_value, 'display': formats.metric_display(raw_value, prefix=metric.prefix, suffix=metric.suffix, precision=metric.precision) if raw_value is not None else None }
def test_decimal_value_with_precision_9(self): display = formats.metric_display(12345.123456789, precision=9) self.assertEqual('12,345.123456789', display)
def transform(self, data_frame, slicer, dimensions, references): """ WRITEME :param data_frame: :param slicer: :param dimensions: :param references: :return: """ result = data_frame.copy() for metric in self.items: if any([metric.precision is not None, metric.prefix is not None, metric.suffix is not None]): df_key = format_metric_key(metric.key) result[df_key] = result[df_key] \ .apply(lambda x: formats.metric_display(x, metric.prefix, metric.suffix, metric.precision)) for reference in references: df_ref_key = format_metric_key(reference_key(metric, reference)) if reference.delta_percent: result[df_ref_key] = result[df_ref_key].apply(lambda x: formats.metric_display( x, reference_prefix(metric, reference), reference_suffix(metric, reference), metric.precision)) for dimension in dimensions: if dimension.has_display_field: result = result.set_index(format_dimension_key(dimension.display_key), append=True) result = result.reset_index(format_dimension_key(dimension.key), drop=True) if hasattr(dimension, 'display_values'): self._replace_display_values_in_index(dimension, result) if isinstance(data_frame.index, pd.MultiIndex): index_levels = [dimension.display_key if dimension.has_display_field else dimension.key for dimension in dimensions] result = result.reorder_levels([format_dimension_key(level) for level in index_levels]) result = result[[format_metric_key(reference_key(item, reference)) for reference in [None] + references for item in self.items]] if dimensions: result.index.names = [dimension.label or dimension.key for dimension in dimensions] result.columns = pd.Index([reference_label(item, reference) for item in self.items for reference in [None] + references], name='Metrics') return self.pivot_data_frame(result, [d.label or d.key for d in self.pivot], self.transpose)
def test_bool_false_value_with_prefix(self): display = formats.metric_display(False, prefix='$') self.assertEqual('$false', display)
def test_str_value_with_prefix(self): display = formats.metric_display('abcdef', prefix='$') self.assertEqual('$abcdef', display)
def test_int_value_no_formats(self): display = formats.metric_display(12345) self.assertEqual('12,345', display)
def test_bool_true_value_no_formats(self): display = formats.metric_display(True) self.assertEqual('true', display)
def test_negative_usd_int_value(self): display = formats.metric_display(-12, prefix='$') self.assertEqual('-$12', display)
def test_bool_false_value_with_suffix(self): display = formats.metric_display(False, suffix='€') self.assertEqual('false€', display)
def test_bool_true_value_with_suffix(self): display = formats.metric_display(True, suffix='€') self.assertEqual('true€', display)
def test_str_value_with_suffix(self): display = formats.metric_display('abcdef', suffix='€') self.assertEqual('abcdef€', display)
def test_decimal_value_with_prefix(self): display = formats.metric_display(12345.123456789, prefix='$') self.assertEqual('$12,345.123457', display)
def transform(self, data_frame, slicer, dimensions, references): """ WRITEME :param data_frame: :param slicer: :param dimensions: :param references: :return: """ result = data_frame.copy() for metric in self.items: if any([ metric.precision is not None, metric.prefix is not None, metric.suffix is not None ]): df_key = format_metric_key(metric.key) result[df_key] = result[df_key] \ .apply(lambda x: formats.metric_display(x, metric.prefix, metric.suffix, metric.precision)) for reference in references: df_ref_key = format_metric_key(reference_key( metric, reference)) if reference.delta_percent: result[df_ref_key] = result[df_ref_key].apply( lambda x: formats.metric_display( x, reference_prefix(metric, reference), reference_suffix(metric, reference), metric. precision)) for dimension in dimensions: if dimension.has_display_field: result = result.set_index(format_dimension_key( dimension.display_key), append=True) result = result.reset_index(format_dimension_key( dimension.key), drop=True) if hasattr(dimension, 'display_values'): self._replace_display_values_in_index(dimension, result) if isinstance(data_frame.index, pd.MultiIndex): index_levels = [ dimension.display_key if dimension.has_display_field else dimension.key for dimension in dimensions ] result = result.reorder_levels( [format_dimension_key(level) for level in index_levels]) result = result[[ format_metric_key(reference_key(item, reference)) for reference in [None] + references for item in self.items ]] if dimensions: result.index.names = [ dimension.label or dimension.key for dimension in dimensions ] result.columns = pd.Index([ reference_label(item, reference) for item in self.items for reference in [None] + references ], name='Metrics') return self.pivot_data_frame(result, [d.label or d.key for d in self.pivot], self.transpose)
def test_decimal_value_with_precision_trim_trailing_zeros(self): result = formats.metric_display(1.01) self.assertEqual('1.01', result)
def test_null_format_no_formatting(self): display = formats.metric_display('null', prefix='$', suffix='€', precision=2) self.assertEqual('null', display)
def test_int_value_with_suffix(self): display = formats.metric_display(12345, suffix='€') self.assertEqual('12,345€', display)
def test_str_value_no_formats(self): display = formats.metric_display('abcdef') self.assertEqual('abcdef', display)
def test_decimal_value_with_suffix(self): display = formats.metric_display(12345.123456789, suffix='€') self.assertEqual('12,345.123457€', display)
def test_bool_false_value_no_formats(self): display = formats.metric_display(False) self.assertEqual('false', display)
def test_str_value_with_precision(self): display = formats.metric_display('abcdef', precision=2) self.assertEqual('abcdef', display)
def test_decimal_value_no_formats(self): display = formats.metric_display(12345.123456789) self.assertEqual('12,345.123457', display)
def test_bool_true_value_with_precision(self): display = formats.metric_display(True, precision=2) self.assertEqual('true', display)
def test_bool_true_value_with_prefix(self): display = formats.metric_display(True, prefix='$') self.assertEqual('$true', display)
def test_bool_false_value_with_precision(self): display = formats.metric_display(False, precision=2) self.assertEqual('false', display)
def test_int_value_with_prefix(self): display = formats.metric_display(12345, prefix='$') self.assertEqual('$12,345', display)
def test_int_value_with_precision(self): display = formats.metric_display(12345, precision=2) self.assertEqual('12,345', display)