Вопрос

Я пишу программу для имитации реальных данных опросов, которые такие компании, как Gallup или Rasmussen, публикуют ежедневно:www.gallup.com и www.rassmussenreports.com

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

В настоящее время он хорошо работает для одной итерации, но моя цель - заставить его выдавать наиболее распространенное моделирование, соответствующее средним данным опроса.Затем я мог бы изменить код в любом месте от 1 до 1000 итераций.

И в этом моя проблема.В конце теста у меня есть массив в одной переменной, который выглядит примерно так:

[40.1, 39.4, 56.7, 60.0, 20.0 ..... 19.0]

В настоящее время программа создает один массив для каждого правильного моделирования. Я могу сохранить каждый массив в одной переменной, но тогда у меня должна быть программа, которая могла бы генерировать от 1 до 1000 переменных в зависимости от того, сколько итераций я запросил!?

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

Тестирование кода для McCain:

 test = [] 

while x < 5: 

   test = round(100*random.random())

   mctest.append(test) 

   x = x +1 


mctestavg = (mctest[0] + mctest[1] + mctest[2])/3 

#mcavg is real data

if mctestavg == mcavg[2]: 
  mcwork = mctest 

Как мне повторить без создания нескольких переменных mcwork?

Это было полезно?

Решение

Сработает ли что-то подобное?

from random import randint    

mcworks = []

for n in xrange(NUM_ITERATIONS):
    mctest = [randint(0, 100) for i in xrange(5)]
    if sum(mctest[:3])/3 == mcavg[2]:
        mcworks.append(mctest) # mcavg is real data

В конце концов, у вас останется список допустимых mctest Списки.

Что я изменил:

  • Использовал понимание списка для создания данных вместо цикла for
  • Использованный random.randint чтобы получить случайные целые числа
  • Использованный ломтики и sum чтобы вычислить среднее значение по первым трем пунктам
  • (Чтобы ответить на ваш актуальный вопрос :-) ) Поместите результаты в список mcworks, вместо создания новой переменной для каждой итерации

Другие советы

Ты говоришь о том, чтобы сделать это?

>>> a = [ ['a', 'b'], ['c', 'd'] ]
>>> a[1]
['c', 'd']
>>> a[1][1]
'd'

Списки в python могут содержать объекты любого типа - если я правильно понимаю вопрос, будет ли list из listвы выполняете эту работу?Что-то вроде этого (предполагая, что у вас есть функция generate_poll_data() который создает ваши данные:

data = []

for in xrange(num_iterations):
    data.append(generate_poll_data())

Тогда, data[n] будет представлен список данных из (n-1)го беги.

поскольку вы думаете в переменные, возможно , вы предпочтете словарь списку списков:

data = {}
data['a'] = [generate_poll_data()]
data['b'] = [generate_poll_data()]

и т.д.

Я бы настоятельно рекомендовал использовать NumPy чтобы сделать это.Вы получаете эффективные N-мерные массивы, которые можно быстро и легко обрабатывать.

Аккуратный способ сделать это - использовать список списков в сочетании с Pandas.Затем вы сможете создать скользящее среднее значение за 3 дня.Это упрощает поиск по результатам, просто добавляя реальные результаты в качестве другого столбца и используя функцию loc для поиска подходящих.

rand_vals = [randint(0, 100) for i in range(5))]
df = pd.DataFrame(data=rand_vals, columns=['generated data'])
df['3 day avg'] = df['generated data'].rolling(3).mean()
df['mcavg'] = mcavg # the list of real data
# Extract the resulting list of values
res = df.loc[df['3 day avg'] == df['mcavg']]['3 day avg'].values

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top