У меня есть датафрейм 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)])
где значения в числовых столбцах представляют собой линейные комбинации элементов, использующих один конкретный набор весов из списка весов выше.
Есть идеи?