Search code examples
pythonpandaspermutationpython-itertools

Permutation of pandas series with all elements in it (itertools)


I trying to get a back a series (or data frame) with permutations of the elements in that list:

stmt_stream_ticker = ("SELECT * FROM ticker;")
ticker = pd.read_sql(stmt_stream_ticker, eng)

which gives me my ticker series

    ticker
0   ALJ
1   ALDW
2   BP
3   BPT

then via function I'd like to work my list:

def permus_maker(x):

    global i # I tried nonlocal i but this gives me: nonbinding error
    permus = itertools.permutations(x, 2)
    permus_pairs = []

    for i in permus:
        permus_pairs.append(i)

    return permus_pairs.append(i)

test = permus_maker(ticker)

print(test)

This gives me 'None' back. Any idea what I do wrong?

edit1:

I tested user defined function vs integrated function (%timeit): it takes 5x as long.


Solution

  • list.append() returns None, so return permus_pairs instead of permus_pairs.append(i)

    Demo:

    In [126]: [0].append(1) is None
    Out[126]: True
    

    but you don't really need that function:

    In [124]: list(permutations(ticker.ticker, 2))
    Out[124]:
    [('ALJ', 'ALDW'),
     ('ALJ', 'BP'),
     ('ALJ', 'BPT'),
     ('ALDW', 'ALJ'),
     ('ALDW', 'BP'),
     ('ALDW', 'BPT'),
     ('BP', 'ALJ'),
     ('BP', 'ALDW'),
     ('BP', 'BPT'),
     ('BPT', 'ALJ'),
     ('BPT', 'ALDW'),
     ('BPT', 'BP')]
    

    Be aware - if you are working with huge lists/Series/DataFrames, then it would make sense to use permutations iterator iteratively instead of exploding it in memory:

    for pair in permutations(ticker.ticker, 2):
         # process pair of tickers here ...