diff --git a/fireant/tests/widgets/test_pandas.py b/fireant/tests/widgets/test_pandas.py index ea12f2ad..7fabe000 100644 --- a/fireant/tests/widgets/test_pandas.py +++ b/fireant/tests/widgets/test_pandas.py @@ -30,6 +30,9 @@ def _format_float(x): return '{:,.0f}'.format(x) +pd.set_option('display.max_columns', 500) +pd.set_option('display.width', 1000) + class PandasTransformerTests(TestCase): maxDiff = None @@ -433,6 +436,31 @@ def test_pivoted_dimx2_date_str_with_sort_metric_asc(self): pandas.testing.assert_frame_equal(expected, result) + def test_pivoted_dimx1_metricx2(self): + result = Pandas(mock_dataset.fields.votes, mock_dataset.fields.wins, pivot=[mock_dataset.fields.timestamp]) \ + .transform(dimx2_date_str_df, mock_dataset, + [mock_dataset.fields.timestamp, mock_dataset.fields.political_party], []) + + expected = dimx2_date_str_df.copy()[[f('votes'), f('wins')]] + expected = expected.unstack(level=0) + expected.index.names = ['Party'] + expected.columns = pd.MultiIndex.from_product( + [ + ['Votes', 'Wins'], + pd.DatetimeIndex(['1996-01-01', + '2000-01-01', + '2004-01-01', + '2008-01-01', + '2012-01-01', + '2016-01-01']), + ], + names=['Metrics', 'Timestamp'], + ) + + expected = expected.applymap(_format_float) + + pandas.testing.assert_frame_equal(expected, result) + def test_pivoted_dimx2_date_str_with_sort_second_metric_desc(self): result = Pandas(mock_dataset.fields.votes, pivot=[mock_dataset.fields.political_party], diff --git a/fireant/widgets/csv.py b/fireant/widgets/csv.py index a03e0575..82569e3e 100644 --- a/fireant/widgets/csv.py +++ b/fireant/widgets/csv.py @@ -2,6 +2,7 @@ from typing import Iterable from fireant.dataset.fields import Field + from .pandas import Pandas @@ -12,5 +13,6 @@ def __init__(self, metric: Field, *metrics: Iterable[Field], group_pagination=Fa def transform(self, data_frame, slicer, dimensions, references): result_df = super(CSV, self).transform(data_frame, slicer, dimensions, references) - result_df.columns.names = [None] + # Unset the column level names because they're a bit confusing in a csv file + result_df.columns.names = [None] * len(result_df.columns.names) return result_df.to_csv(na_rep='', quoting=QUOTE_MINIMAL) diff --git a/fireant/widgets/pandas.py b/fireant/widgets/pandas.py index 645a9c9c..fbde2688 100644 --- a/fireant/widgets/pandas.py +++ b/fireant/widgets/pandas.py @@ -1,14 +1,13 @@ +import pandas as pd from functools import partial from typing import Iterable -import pandas as pd from fireant import formats from fireant.dataset.fields import Field from fireant.utils import ( alias_selector, wrap_list, ) - from .base import ( ReferenceItem, TransformableWidget, @@ -163,7 +162,10 @@ def _get_f_display(item): return format_df for item in items: + key = item.label f_display = _get_f_display(item) - format_df[item.label] = format_df[item.label].apply(f_display) + format_df[key] = format_df[key].apply(f_display) \ + if isinstance(format_df[key], pd.Series) \ + else format_df[key].applymap(f_display) return format_df