Python 将用户按80:20的比例随机分成两组

Python 将用户按80:20的比例随机分成两组,python,Python,我有一个名为“用户”的ID列表,希望按80:20的百分比将他们随机分成两组 例如,我有一个100个用户ID的列表,随机将80个用户放入group1,其余20个放入group2 def getLevelForIncrementality(Object[] args) { try { if (args.length >= 1 && args[0]!="") { String seed = args[0] + "Testing";

我有一个名为“用户”的ID列表,希望按80:20的百分比将他们随机分成两组

例如,我有一个100个用户ID的列表,随机将80个用户放入group1,其余20个放入group2

 def getLevelForIncrementality(Object[] args) {
   try {
     if (args.length >= 1 && args[0]!="") {
        String seed = args[0] + "Testing";
        int rnd = Math.abs(seed.hashCode() % 100);
        return (rnd >= 80 ? 2 : 1);
     }
  } catch (Exception e) { }
 return 3;
}
我已经尝试了上面的groovy代码,它以82:18的比例给出了我的答案

有没有人能给我一些见解、建议或解决数百万用户ID上述问题的方法。

您可以使用这些方法随机抽取所需数量的元素:

import random

a = list(range(1000))

b = random.sample(a, int(len(a) * 0.8))
len(b)
800

如果您有唯一的ID,您可以尝试将这些ID列表转换为集合,并按如下方式对它们进行区分:

c = list(set(a) - set(b))
您可以使用随机抽取所需数量的元素:

import random

a = list(range(1000))

b = random.sample(a, int(len(a) * 0.8))
len(b)
800

如果您有唯一的ID,您可以尝试将这些ID列表转换为集合,并按如下方式对它们进行区分:

c = list(set(a) - set(b))

这也适用于拆分列表:

A = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] ## Sample List
l = (len(A)/10) *8 ## making 80 %
B = A[:int(l)] ## Getting 80% of list
C = A[int(l):] ## Getting remaining list

这也适用于拆分列表:

A = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] ## Sample List
l = (len(A)/10) *8 ## making 80 %
B = A[:int(l)] ## Getting 80% of list
C = A[int(l):] ## Getting remaining list

为了在不创建大列表的情况下“动态”分发数据,您可以使用一个小的控制列表,该列表将告诉您如何将用户分成两个组(5个组)

这将确保每五个用户进行80:20的完美分割,最大不平衡为4。随着越来越多的用户被处理,这种不平衡将变得越来越不重要

最坏情况:

  • 19.2%而不是99个用户后的20%,在100个用户时修正为完美的20%
  • 999位用户后的19.9%,在1000位时修正为完美的20%
  • 9999个用户之后为19.99%,在10000个用户时修正为完美20%
注意:您可以在
排列
列表中更改1和0的数量,以获得不同的比例。e、 [1,1,0]将给你2对1;[1,1,1,0]是3对1(75:25);[1] *13+[0]*7是13对7(65:35)

您可以将其概括为一个生成器,该生成器将为您进行适当的计算和初始化:

import random
from math import gcd
def spreadRatio(a,b):
    d      = gcd(a,b) 
    base   = [True]*(a//d)+[False]*(b//d)
    spread = []
    while True:
        if not spread:
            spread = base.copy()
            random.shuffle(spread)
        yield spread.pop()


pareto = spreadRatio(80,20)
while getNextUser():
    if next(pareto):
        # place on 80% side
    else:
        # place on 20% side

为了在不创建大列表的情况下“动态”分发数据,您可以使用一个小的控制列表,该列表将告诉您如何将用户分成两个组(5个组)

这将确保每五个用户进行80:20的完美分割,最大不平衡为4。随着越来越多的用户被处理,这种不平衡将变得越来越不重要

最坏情况:

  • 19.2%而不是99个用户后的20%,在100个用户时修正为完美的20%
  • 999位用户后的19.9%,在1000位时修正为完美的20%
  • 9999个用户之后为19.99%,在10000个用户时修正为完美20%
注意:您可以在
排列
列表中更改1和0的数量,以获得不同的比例。e、 [1,1,0]将给你2对1;[1,1,1,0]是3对1(75:25);[1] *13+[0]*7是13对7(65:35)

您可以将其概括为一个生成器,该生成器将为您进行适当的计算和初始化:

import random
from math import gcd
def spreadRatio(a,b):
    d      = gcd(a,b) 
    base   = [True]*(a//d)+[False]*(b//d)
    spread = []
    while True:
        if not spread:
            spread = base.copy()
            random.shuffle(spread)
        yield spread.pop()


pareto = spreadRatio(80,20)
while getNextUser():
    if next(pareto):
        # place on 80% side
    else:
        # place on 20% side

也可以使用sklearn的train_test_split来完成

import numpy as np
from sklearn.model_selection import train_test_split

X = list(np.arange(1000))

x_80_percent, x_20_percent =  train_test_split(X, test_size =.20, shuffle  = True) 

也可以使用sklearn的train_test_split来完成

import numpy as np
from sklearn.model_selection import train_test_split

X = list(np.arange(1000))

x_80_percent, x_20_percent =  train_test_split(X, test_size =.20, shuffle  = True) 

你想要php或python格式的解决方案?@RahulAgarwal我想要python格式的解决方案你想要php或python格式的解决方案?@RahulAgarwal我想要python格式的解决方案如果我没有列表,例如,如果我将来自多个设备的用户流量作为用户ID逐个输入日志。这里的用户id是设备id。我们如何尝试?
random。sample
应适用于任何序列或集合。例如,如果您有一些复杂的结构,您应该将其转换为列表。但如果你有某种分布式的对象流,我认为唯一对你有利的情况是以80%的概率将其移动到一个组,然后在另一种情况下移动到另一个组。我关心的是,如果我有数百万用户,如果我将他们放入列表中,将他们随机分成两组的速度和内存是多少。?应该是
O(n)
。如果每个用户不是一个巨大的对象,那么速度不会很慢,内存也不会很大。无论如何,你需要的样本内存将等于最初数百万用户的内存。是的,当我进入日志时,我只是以80:20的比例分配它们,这就是为什么我在groovy中使用hashCode。如果我没有列表,例如,如果我将来自多个设备的用户流量作为用户ID逐个输入日志。这里的用户id是设备id。我们如何尝试?
random。sample
应适用于任何序列或集合。例如,如果您有一些复杂的结构,您应该将其转换为列表。但如果你有某种分布式的对象流,我认为唯一对你有利的情况是以80%的概率将其移动到一个组,然后在另一种情况下移动到另一个组。我关心的是,如果我有数百万用户,如果我将他们放入列表中,将他们随机分成两组的速度和内存是多少。?应该是
O(n)
。如果每个用户不是一个巨大的对象,那么速度不会很慢,内存也不会很大。无论如何,你需要的样本内存将等于最初数百万用户的内存。是的,当我进入日志时,我只是以80:20的比例分配它们,这就是为什么我在groovy中使用hashCode。如果我没有列表,例如,如果我将来自多个设备的用户流量作为用户ID逐个输入日志。这里的用户id是设备id。我们如何尝试。?OP希望随机拆分它们,而不仅仅是首先选择80%和最后选择20%。如果我没有列表,例如,如果我将来自多个设备的用户流量作为用户id逐个输入日志中。这里的用户id是设备id。我们如何尝试。?OP想要随机分割它们,而不是只选择80%的第一个和20%的最后一个。