Комбинации панды / матричная операция - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть датафрейм A, представляющий собой простую базу данных элементов детали:

    A = pd.DataFrame(columns= ['name','attribute1','attribute2']...)

пример:

    A = pd.DataFrame([('X', 1, 0.5),('Y', 0.5, 0.8),('Z', 0.4,0.1)])

Список 'index' ниже представляет собой список всех возможных комбинаций имена в A длиной 3: например, AB C, ACD, ARG и т. д. c ..

    index = list((i,j,k) for ((i,_),(j,_),(k,_)) in itertools.combinations(enumerate(A['name']),3))

Я использовал перечисление здесь, так что я могу вернуться к любому конкретному c Комбинация, сгенерированная позже.

Чтобы собрать комбо вместе, у меня есть список перестановок весов, представляющих все возможные веса, которые будут применены к каждому атрибуту в A:

    weights = list(itertools.permutations([-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10],3))

это генерирует веса как [(1,2,3), (- 2,4,1) ..] et c

Мне нужна матрица результатов / фрейм данных, который находится в той же структуре, что и A с имена, представляющие комбинацию имен A, ie. AB C и атрибуты в результатах являются линейными комбинациями весов с атрибутами в A ie.

     A.dot(weight) 

Я пробовал циклически переписывать записи в отдельные строки, но время вычисления слишком велико, например, код, подобный приведенному ниже, не будет работать:

    for x in weights:
            part1 = x[0]
            part2 = x[1]    
            part3 = x[2]
            q = 0

            while q < len(results):

                ind1 = results['index'][q][0]
                ind2 = results['index'][q][1]
                ind3 = results['index'][q][2]


                results['name'][q] = ''.join((str(A['name'][ind1]),str(a['name'][ind2]),str(A['name'][ind3])))
                results['attrib1'][q] = part1 * A['attrib1'][ind1]+part2*A['attrib1'][ind2] + part3*A['attrib1'][ind3]
                results['attrib2'][q] = part1 * A['attrib2'][ind1]+part2*A['attrib2'][ind2] + part3*A['attrib2'][ind3]       

Пример желаемого результата:

    Result = pd.DataFrame([('XYZ', -0.1, 0.5),('VTS', 0.5, 0.8),('AGT', 0.4,0.1)])

где значения в числовых столбцах представляют собой линейные комбинации элементов, использующих один конкретный набор весов из списка весов выше.

Есть идеи?

...