2015-07-09 3 views
0

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

fruit_type, reading, prob 
Apple, 12,.05 
apple, 15, .5 
orange 18, .99 

Пример моего кода ниже.

def sim(seconds): 
    output = pd.DataFrame() 
    current = [] 
    #output = pd.DataFrame() 
    for i in range(1, 100000000): 
     if data2['fruit_type'].all() == 'Apple': 
      hostrecord1 = np.random.choice(data2['reading'], size=23, replace=True, p=data2['prob']) 
      current = hostrecord1.sum() + 150 

     if data2['fruit_type'].all() == 'Orange': 
      hostrecord2 = np.random.choice(data2['reading'], size=23, replace=True, p=data2['prob']) 
      current = hostrecord2.sum() + 150 

     if data2['fruit_type'].all() == 'Peach': 
      hostrecord3 = np.random.choice(data2['reading'], size=20, replace=True, p=data2['prob']) 
      current = hostrecord3.sum() + 150 

    #put all records in one array 
    #return all records 
    output = pd.concat(current) 
    return output 

Я пытаюсь выяснить, как выполнить несколько моделирования с различными условиями различных по fruit_type, но в настоящее время не могу понять логику. Каждая симуляция должна выбирать определенные строки по отношению к fruit_type, поэтому симуляции задаются fruit_type, поэтому его часть. Размер каждого образца отличается по дизайну, поскольку каждый fruit_type имеет разные условия.

Мой ожидаемый выход представляет собой массив всех значений моделирования. Я также хочу добавить все результаты в один фрейм данных pandas.

+0

Выполняет ли какое-либо из операторов 'if'' True'? – wflynny

+0

да, они правильно выбирают fruit_type? – user3609179

+0

Имейте в виду, что это образец данных и не отражает мои фактические данные – user3609179

ответ

2

Ваше объяснение довольно неясно, но вот догадка:

# initialize data 
In [1]: fruits = ['apple', 'peach', 'orange'] 
In [2]: data = np.vstack((np.random.choice(fruits, size=10), 
          np.random.randint(0, 100, size=10), 
          np.random.rand(10))).T 
In [3]: df = pd.DataFrame(data, columns=['fruit_type', 'reading', 'prob']) 

Ключ индексации df такой, что df[df.fruit_type == fruit_of_interest]. Вот пример функции:

def simulate(df, N_trials): 
    # replace with actual sizes for ['apple', 'peach', 'orange'] respectively 
    sample_sizes = [N1, N2, N3] 
    fruits = ['apple', 'peach', 'orange'] 

    results = np.empty((N_trials, len(fruits)) 
    for i in xrange(N_trials): # switch to range if using python3 
     for j, (fruit, size) in enumerate(zip(fruits, sample_sizes)): 
      sim_data = df[df.fruit_type == fruit] 
      record = np.random.choice(sim_data.reading, size=size, p=sim_data.prob) 
      # do something with the record 
      results[i, j] = record.sum() 

Обратите внимание, что массив результатов может быть слишком большой, чтобы поместиться в памяти, если вы делаете 100 миллионов испытаний. Это может быть и быстрее, если вы меняете swoo-петли так, чтобы плод/размер был самым внешним для цикла.


Стоит также отметить, что вместо for -looping, вы всегда можете генерировать огромный образец с np.random.choice, а затем изменить форму:

np.random.choice([0, 1], size=1000000).reshape(10000, 100) 

даст вам 10000 испытания с 100 образцов каждый. Это может быть полезно, если ваши 100-миллиметровые испытания занимают слишком много времени - вы можете разбить их на 100 циклов с choice, выполнив сразу 1 миллион выборок. Примером может быть

def simulate(df, N_trials, chunk_size=10000): 
    # replace with actual sizes for ['apple', 'peach', 'orange'] respectively 
    sample_sizes = [N1, N2, N3] 
    fruits = ['apple', 'peach', 'orange'] 

    for i in xrange(N_trials/chunk_size): # switch to range if using python3 
     chunk_results = np.empty((chunk_size, len(fruits)) 
     for j, (fruit, size) in enumerate(zip(fruits, sample_sizes)): 
      sim_data = df[df.fruit_type == fruit] 
      record = np.random.choice(sim_data.reading, size=(chunk_size, size), 
             p=sim_data.prob) 
      chunk_results[:, j] = record.sum(axis=1) 

     # do something intermediate with this chunk 
+0

о чем вас смущает? – user3609179

+0

У меня также есть набор данных, который я должен использовать. – user3609179

+0

@ user3609179 Я знаю, что у вас есть набор наборов данных, но чтобы я (и вы) смог проверить свой ответ, я предоставил образцы данных. Помогает ли этот ответ понять/решить вашу проблему? – wflynny

Смежные вопросы