Выборка случайных комбинаций из комбинаций сочетаний с задаными условиями
Ниже приведен рабочий код, который генерирует выборку 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