Python中m个元素的n个列表的随机采样

问题描述 投票:0回答:1

我编写了这段代码,它在 python 中创建 m 个元素的 n 个列表的所有组合,对给定数量的唯一组合(最大可能或 1000)进行采样,并将其输出到 Excel 中。它基本上可以工作,但问题是当product(m_i)变得非常大时,它非常慢。

一个实际的用例可能是我有 32 个列表,每个列表中有 2-3 个元素,我需要从中抽取 1000 个独特的组合。这可能是 100 亿个组合,但创建所有这些组合的速度很慢,而我实际上只需要 1000 个独特的组合。

我确实考虑过创建随机样本并检查我是否已经创建了这个样本,但是当样本数量接近可能的排列数量时,这会变得很慢。

Image of data

import pandas as pd

df = pd.read_excel('Variables.xlsx',sheet_name="Variables" ,index_col=0)
df_out = pd.DataFrame(columns=df.index)

df.shape[0]
def for_recursive(number_of_loops, range_list, execute_function, current_index=0, iter_list = []):
    if iter_list == []:
        iter_list = [0]*number_of_loops
    
    if current_index == number_of_loops-1:
        for iter_list[current_index] in range_list.iloc[current_index].dropna():
            execute_function(iter_list)
    else:
        for iter_list[current_index] in range_list.iloc[current_index].dropna():
            for_recursive(number_of_loops, iter_list = iter_list, range_list = range_list,  current_index = current_index+1, execute_function = execute_function) 
            
def do_whatever(index_list):
    df_out.loc[len(df_out)] = index_list
    
for_recursive(range_list = df, execute_function = do_whatever , number_of_loops=len(df))

df_out = df_out.sample(n=min(len(df_out),1000))

with pd.ExcelWriter("Variables.xlsx", engine="openpyxl", mode="a", if_sheet_exists="replace") as writer:
    df_out.to_excel(writer, 'Simulations', index=False)
python random permutation combinatorics sampling
1个回答
0
投票

利用标准库功能。

itertools
模块可以生成数据中所有可能组合的列表。

import pandas as pd

data = pd.DataFrame({'A': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'],  
                    'B': [1, 4, 6, 33, 0, 0, 0, 0, 0, 0],
                    'C': [2, 6, 8, 44, 1, 1, 1, 1, 1, 1],
                    'D': [3, 0, 0, 55, 0, 0, 0, 0, 0, 0],
                    })

from itertools import product 

full_collection = (list(product(data['A'], data['B'], data['C'], data['D'])))

random.sample
函数将生成唯一的样本,不会重复。

import random

samples = random.sample(full_collection, 1000)
© www.soinside.com 2019 - 2024. All rights reserved.