Создайте всю комбинацию из 11 имен из 22, где сумма кредита равна 100 - PullRequest
1 голос
/ 12 мая 2019

У меня есть два столбца, один из которых содержит 22 имени, а другой столбец с соответствующим кредитом на каждое имя.Мне нужно знать всю комбинацию из 11 имен, которая суммирует до 100.

Я прилагаю изображение данных, например.

Я искал и вернулся с itertool, который получит вам всю комбинацию.Но я не был уверен в том, как это можно использовать для получения всей комбинации.

import pandas as pd
import itertools
from itertools import combinations
from itertools import permutations
data=pd.read_excel(r'C:\Users\anup.kumar.dutta\Documents\Test\Test.xlsx',index=False)
def f(length,total_sum):
    if length == 1:
        yield (total_sum,)
    else:
        for value in range(total_sum + 1):
            for permutation in sum(length - 1,total_sum - value):
                yield (value,) + permutation

L = list(f(5,100))
print('total permutations:',len(L))

Он должен возвращать все комбинации имен, которые суммируются до кредита 100.

1 Ответ

1 голос
/ 13 мая 2019

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

starttime = time.time()

Мы будем использовать комбинации из itertools.

from itertools import combinations

Сначала я воссоздаю ваши данные (пожалуйста, укажите в следующий раз для респондентов, чтобы мыне надо воссоздавать).Я использую буквы для имен.Я буду использовать pd.Series, так как это соответствует вашим данным, и это будет быстрее всего после непосредственного использования numpy.

s = pd.Series(np.random.randint(8,11,22), index = list('ABCDEFGHIJKLMNOPQRSTUV'))

Далее установите параметры комбинации.

# set combination parameters
r =  11
n = len(s)

Создайте список для отслеживания имен, баллы которых == 100.

name_list = []   

Наконец, выполните цикл по комбинациям, сохраняя все комбинации, суммирующие до 100.

for p in combinations(s.index, r):
    if s.loc[list(p)].sum() == 100:
        name_list.append(p)

endtime = time.time()



print('Time to run', endtime - starttime)
Time to run 350.4899344444275

name_list (fist ten rows)

[('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'M'),
 ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'T'),
 ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'V'),
 ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'M', 'T'),
 ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'M', 'V'),
 ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'T', 'V'),
 ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'L', 'M'),
 ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'L', 'T'),
 ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'L', 'V'),
 ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'M', 'O'),...

Сколько существует комбинаций?

print(len(name_list))
86724
...