Я пишу программу для имитации фактических компаний данных опроса, таких как Gallup или Rasmussen, публикуемых ежедневно: www.gallup.com и www.rassmussenreports.com
Я использую метод грубой силы, когда компьютер генерирует некоторые случайные ежедневные данные опроса, а затем вычисляет средние значения за 3 дня, чтобы узнать, соответствует ли среднее число случайных данных числу опрошенных. (Большинство номеров опросов компаний составляют три дня средних значений)
В настоящее время он хорошо работает для одной итерации, но моя цель - получить наиболее распространенное симуляцию, которая соответствует средним данным опроса. Затем я мог бы изменить код в любом месте от 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 vars?
Что-то вроде этой работы?
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
.
Что я изменил:
random.randint
для получения случайных целых чиселsum
для вычисления среднего количества первых трех элементовmcworks
вместо создания новой переменной для каждой итерацииВы говорите об этом?
>>> a = [ ['a', 'b'], ['c', 'd'] ]
>>> a[1]
['c', 'd']
>>> a[1][1]
'd'
поскольку вы думаете о переменных, вы можете предпочесть словарь по списку списков:
data = {}
data['a'] = [generate_poll_data()]
data['b'] = [generate_poll_data()]
и др.
Я бы настоятельно рекомендовал использовать NumPy. Вы получаете эффективные N-мерные массивы, которые вы можете быстро и легко обрабатывать.
Списки в python могут содержать любой тип объекта. Если я правильно понял вопрос, выполнит ли это list
of list
? Что-то вроде этого (если у вас есть функция generate_poll_data()
, которая создает ваши данные:
data = []
for in xrange(num_iterations):
data.append(generate_poll_data())
Затем data[n]
будет списком данных из прогона (n-1)
th.
Оптимальный способ сделать это - использовать список списков в сочетании с пандами. Тогда вы сможете создать 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
Это также удобно, если вы собираетесь использовать одни и те же случайные значения для разных опросов/лиц, просто добавьте еще один столбец с их реальными значениями и выполните их поиск.