def test_ninteraction(): simple_vectors = [ list(string.ascii_lowercase), random.sample(string.ascii_lowercase, 26), list(range(1, 27)) ] # vector of unique values is equivalent to rank for case in simple_vectors: rank = pd.DataFrame(case).rank(method='min') rank = rank[0].astype(int).tolist() rank_df = ninteraction(pd.DataFrame(case)) assert rank == rank_df # duplicates are numbered sequentially # df ids # [6, 6, 4, 4, 5, 5] -> [3, 3, 1, 1, 2, 2] for case in simple_vectors: rank = pd.DataFrame(case).rank(method='min') rank = rank[0].astype(int).repeat(2).tolist() rank_df = ninteraction(pd.DataFrame(np.array(case).repeat(2))) assert rank == rank_df # grids are correctly ranked df = pd.DataFrame(list(itertools.product([1, 2], range(1, 11)))) assert ninteraction(df) == list(range(1, len(df) + 1)) assert ninteraction(df, drop=True) == list(range(1, len(df) + 1)) # zero length dataframe df = pd.DataFrame() assert ninteraction(df) == []
def compute_layout(self, data): if not self.rows and not self.cols: return layout_null() base_rows = combine_vars(data, self.plot.environment, self.rows, drop=self.drop) if not self.as_table: # Reverse the order of the rows base_rows = base_rows[::-1] base_cols = combine_vars(data, self.plot.environment, self.cols, drop=self.drop) base = cross_join(base_rows, base_cols) if self.margins: base = add_margins(base, [self.rows, self.cols], self.margins) base = base.drop_duplicates().reset_index(drop=True) n = len(base) panel = ninteraction(base, drop=True) panel = pd.Categorical(panel, categories=range(1, n + 1)) if self.rows: rows = ninteraction(base[self.rows], drop=True) else: rows = 1 if self.cols: cols = ninteraction(base[self.cols], drop=True) else: cols = 1 layout = pd.DataFrame({'PANEL': panel, 'ROW': rows, 'COL': cols}) layout = pd.concat([layout, base], axis=1) layout = layout.sort_values('PANEL') layout.reset_index(drop=True, inplace=True) # Relax constraints, if necessary layout['SCALE_X'] = layout['COL'] if self.free['x'] else 1 layout['SCALE_Y'] = layout['ROW'] if self.free['y'] else 1 layout['AXIS_X'] = layout['ROW'] == layout['ROW'].max() layout['AXIS_Y'] = layout['COL'] == layout['COL'].min() self.nrow = layout['ROW'].max() self.ncol = layout['COL'].max() return layout
def test_ninteraction(): simple_vectors = [ list(string.ascii_lowercase), random.sample(string.ascii_lowercase, 26), list(range(1, 27))] # vector of unique values is equivalent to rank for case in simple_vectors: df = pd.DataFrame(case) rank = df.rank(method='min') rank = rank[0].astype(int).tolist() rank_df = ninteraction(df) assert rank == rank_df # duplicates are numbered sequentially # df ids # [6, 6, 4, 4, 5, 5] -> [3, 3, 1, 1, 2, 2] for case in simple_vectors: rank = pd.DataFrame(case).rank(method='min') rank = rank[0].astype(int).repeat(2).tolist() rank_df = ninteraction( pd.DataFrame(np.array(case).repeat(2))) assert rank == rank_df # grids are correctly ranked df = pd.DataFrame(list(itertools.product([1, 2], range(1, 11)))) assert ninteraction(df) == list(range(1, len(df)+1)) assert ninteraction(df, drop=True) == list(range(1, len(df)+1)) # zero length dataframe df = pd.DataFrame() assert ninteraction(df) == [] # dataframe with single variable df = pd.DataFrame({'a': ['a']}) assert ninteraction(df) == [1] df = pd.DataFrame({'a': ['b']}) assert ninteraction(df) == [1]