Выборка случайных комбинаций из комбинаций сочетаний с задаными условиями

Ниже приведен рабочий код, который генерирует выборку 30 случайных комбинаций из комбинаций сочетаний 5 из 30 из df. Задача - необходимо чтобы в конечной выборке все элементы имели приблизительно одинаковое частотное распределение.

Для примера для текущей выборки число 15 встречается 8 раз, а число 1 встречается - 2 раза.

Вопрос как изменить алгоритм, чтобы все числа в конечной выборке имели максимально одинаковое частотное распределение?

При формировании выборки нужно использовать данные из df.

Элемент: 15 - 0.053333% - 8 раз 
Элемент: 1  - 0.013333% - 2 раза 

Рабочий код

import pandas as pd
import numpy as np
import itertools as iter
import math as mt
import timeit
from functools import reduce


df = pd.DataFrame(iter.combinations(range(1, 31), 5))

def GetRandomSamples(df, samples):

    indexes = pd.DataFrame()

    while len(indexes) < samples:
        sample = df.sample(1)
        sampleIndex = sample.index.values[0]
        sampleValues = list(sample.values[0])

        if(len(indexes) == 0):
            indexes = sample
        else:
            if(sampleIndex in indexes.index.values):
                continue
            else:
                tempIndexes = pd.concat([indexes, sample], axis = 0)
                tempIndexesStatistics = tempIndexes.stack().value_counts(normalize=True)
                tempIndexesStatisticsMean = tempIndexesStatistics.mean()
                tempIndexesStatisticsStd = tempIndexesStatistics.std(ddof=1)
                tempIndexesStatisticsMaxDev = tempIndexesStatisticsMean + (2 * tempIndexesStatisticsStd)

                if( tempIndexesStatisticsMaxDev < tempIndexesStatistics.values[0]):
                    continue
                else:
                    indexes = tempIndexes

    print("Value counts %")
    print("---------------------------------")    
    print(tempIndexes.stack().value_counts(normalize=True))

    indexes = list(indexes.index.values)
    mask = df.index.isin(indexes)


    return mask

df[GetRandomSamples(df, 30)]

Пример частотного распредления элементов для конечной выборки приведенной ниже

Value counts %
---------------------------------
15    0.053333
21    0.053333
3     0.053333
17    0.046667
30    0.046667
27    0.046667
19    0.040000
5     0.040000
24    0.040000
14    0.040000
29    0.040000
6     0.040000
26    0.040000
2     0.040000
4     0.033333
7     0.033333
28    0.033333
11    0.033333
25    0.033333
16    0.026667
22    0.026667
12    0.026667
13    0.020000
8     0.020000
20    0.020000
23    0.020000
9     0.013333
10    0.013333
18    0.013333
1     0.013333
dtype: float64

Пример конечной выборки для текушего кода

        0   1   2   3   4
18678   1   10  18  26  29
21475   1   14  15  29  30
26112   2   3   14  27  30
33496   2   6   21  24  26
33561   2   6   23  27  30
34718   2   7   14  16  29
37375   2   9   12  20  26
43487   2   17  24  27  30
46652   3   4   19  26  28
47062   3   5   6   21  27
48665   3   5   15  27  28
50116   3   6   11  19  21
52576   3   7   17  19  27
54062   3   8   16  22  24
57404   3   11  15  21  26
65190   4   6   12  16  28
67574   4   7   17  25  30
68901   4   8   15  20  21
76455   4   20  22  27  29
78829   5   7   8   13  15
82589   5   9   13  14  29
85389   5   11  21  23  25
88951   5   19  21  25  30
96635   6   12  17  24  25
107865  7   17  18  19  29
122655  10  11  15  24  30
127327  11  12  15  22  23
134973  13  16  17  19  28
136671  14  15  21  24  28
137352  14  17  22  25  26

Ответы (0 шт):