Все возможные комбинации с условием - PullRequest
0 голосов
/ 10 сентября 2018

Я хотел бы сгенерировать все возможные комбинации с некоторым условием. Учитывая, что у меня есть фрейм данных, который мне нужен.

Variable     Cluster_no sub_group
GDP_M3       1          GDP
HPI_M3_lg2   1          HPI
FDI_C_lg5    1          FDI
FDI_M6       2          FDI
Export_M9    2          Export
GDP_M9       2          GDP
GDP_M12_lg7  3          GDP
Export_M12   3          Export

Я нашел itertools.combinations, который дает мне все возможные комбинации 3, например. Тем не менее, я хотел бы рассмотреть больше критериев с cluster_no и sub_group.

Сказав, что если я начну с GDP_M3 с cluster 1, он не будет сопоставлен ни с HPI_M3_lg2, ни с FDI_C_lg5, поскольку он происходит из того же кластера. При заданном условии кластера он будет искать другие кластеры, которые cluster 2 или cluster 3.

В cluster 2 есть 2 возможные переменные, которые FDI_M6 или Export_M9, потому что я также хотел бы рассмотреть условие sub_group. Если выбрать FDI_M6, он перейдет к следующему кластеру, потому что снова разрешено только 1 переменная из каждого кластера.

На данный момент мой список [GDP_M3, FDI_M6]. Следующая переменная для комбинации - Export_M12, потому что она от cluster 3 и sub_group Export.

Я бы хотел установить до 3 возможных комбинаций (от 1 до 3). Любое предложение по этому поводу.

Спасибо.

Изменить, чтобы добавить мой код.

N=3
combination=[]

for i in range(1, N+1):
    for j in itertools.combinations(a, i):
        combination.append(list(j))  

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Мой метод похож на @Ahmad Faiyaz

from collections import defaultdict
x= [[1,1,'gdp'],[2,1,'hpi'],[3,1,'fdi'],[4,2,'fdi'],[5,2,'export'],[6,2,'gdp'],[7,3,'gdp'],[8,3,'export']]
c=defaultdict(list)
for i in x:
    c[i[1]]+=[i]

def rec_cal(i,clus,lis):
    if i in c.keys():
        for j in c[i]:
            if j[2] not in clus:
                clus.append(j[2])
                lis.append(j[0])
                rec_cal(i+1,clus,lis)
                clus.pop()
                lis.pop()
            else:
                continue
    else:
        print(lis)

rec_cal(1,[],[])

и вы получите результат как

[1, 4, 8]
[2, 4, 7]
[2, 4, 8]
[2, 5, 7]
[2, 6, 8]
[3, 5, 7]
[3, 6, 8]

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

0 голосов
/ 11 сентября 2018

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

all_possible_combinations = []
def get_combinations(N, data, cur_index=0, generated_el=[], cluster_tracker=set(), sub_group_tracker=set()):
    if N == 0:
        if generated_el:
            all_possible_combinations.append(tuple(generated_el))
        return

    if cur_index >= len(data):
        return

    get_combinations(N, data, cur_index+1, generated_el, cluster_tracker, sub_group_tracker)

    if data[cur_index][1] in cluster_tracker:
        # I have already taken this cluster
        return

    if data[cur_index][2] in sub_group_tracker:
        # I have already taken this sub group
        return

    generated_el.append(data[cur_index][0])
    cluster_tracker.add(data[cur_index][1])
    sub_group_tracker.add(data[cur_index][2])
    get_combinations(N-1, data, cur_index+1, generated_el, cluster_tracker, sub_group_tracker)  
    generated_el.pop()
    cluster_tracker.remove(data[cur_index][1])
    sub_group_tracker.remove(data[cur_index][2])

    return


if __name__ == "__main__":
    data = [
        ("GDP_M3", "1", "GDP"),
        ("HPI_M3_lg2", "1", "HPI" ),
        ("FDI_C_lg5", "1", "FDI"),
        ("FDI_M6", "2", "FDI"),
        ("Export_M9", "2", "Export"),
        ("GDP_M9", "2", "GDP"),
        ("GDP_M12_lg7", "3", "GDP"),
        ("Export_M12", "3", "Export")
    ]

    get_combinations(3, data)
    print(all_possible_combinations)

Вы можете увидеть вывод здесь: https://ideone.com/HwruJ7

...